package org.aisen.weibo.sina.ui.fragment.draft; import java.util.ArrayList; import java.util.List; import org.aisen.weibo.sina.R; import org.aisen.weibo.sina.base.MyApplication; import org.aisen.weibo.sina.support.bean.PublishBean; import org.aisen.weibo.sina.support.bean.PublishType; import org.aisen.weibo.sina.support.publish.PublishDB; import org.aisen.weibo.sina.support.publish.PublishManager; import org.aisen.weibo.sina.support.utils.AisenUtil; import org.aisen.weibo.sina.support.utils.AppContext; import org.aisen.weibo.sina.support.utils.BaiduAnalyzeUtils; import org.aisen.weibo.sina.sys.service.PublishService; import org.aisen.weibo.sina.ui.activity.publish.PublishActivity; import org.aisen.weibo.sina.ui.fragment.base.BizFragment; import org.aisen.weibo.sina.ui.widget.AisenTextView; import android.app.AlertDialog; import android.content.BroadcastReceiver; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.IntentFilter; import android.os.Bundle; import android.text.TextUtils; import android.util.SparseBooleanArray; import android.view.ActionMode; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.widget.AbsListView; import android.widget.AbsListView.MultiChoiceModeListener; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.ListView; import android.widget.TextView; import com.m.common.context.GlobalContext; import com.m.common.utils.ActivityHelper; import com.m.common.utils.DateUtils; import com.m.support.Inject.ViewInject; import com.m.support.adapter.ABaseAdapter.AbstractItemView; import com.m.support.task.TaskException; import com.m.support.task.WorkTask; import com.m.ui.fragment.ABaseFragment; import com.m.ui.fragment.AListFragment; import com.m.ui.utils.ViewUtils; /** * 草稿箱 * * @author wangdan * */ public class DraftFragment extends AListFragment<PublishBean, ArrayList<PublishBean>> implements OnItemClickListener, MultiChoiceModeListener { public static ABaseFragment newInstance() { return new DraftFragment(); } private BizFragment bizFragment; private boolean isSelectedModeActivated = false; private SparseBooleanArray checkedArray; @ViewInject(id = R.id.txtDraftEmpty) TextView txtDraftEmpty; @Override protected int inflateContentView() { return R.layout.ui_draft; } @Override protected void layoutInit(LayoutInflater inflater, Bundle savedInstanceSate) { super.layoutInit(inflater, savedInstanceSate); getRefreshView().setOnItemClickListener(this); getListView().setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL); getListView().setMultiChoiceModeListener(this); checkedArray = new SparseBooleanArray(); try { bizFragment = BizFragment.getBizFragment(this); } catch (Exception e) { } } @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { if (isSelectedModeActivated) { getListView().setItemChecked(position, !getListView().isItemChecked(position)); } else { PublishBean bean = getAdapterItems().get(position); switch (bean.getType()) { case status: PublishActivity.publishStatus(getActivity(), bean); break; case statusRepost: PublishActivity.publishStatusRepost(getActivity(), bean, bean.getStatusContent()); break; case commentReply: PublishActivity.publishCommentReply(getActivity(), bean, bean.getStatusComment(), false); break; case commentCreate: PublishActivity.publishStatusComment(getActivity(), bean, bean.getStatusContent()); break; default: break; } } } @Override protected AbstractItemView<PublishBean> newItemView() { return new DraftboxItemView(); } @Override public void onResume() { super.onResume(); IntentFilter filter = new IntentFilter(); filter.addAction(PublishManager.ACTION_PUBLISH_CHANNGED); getActivity().registerReceiver(receiver, filter); new DraftTask(RefreshMode.reset).execute(); BaiduAnalyzeUtils.onPageStart("草稿箱"); if (AisenUtil.isTranslucent()) { txtDraftEmpty.setTextColor(getResources().getColor(R.color.edit_hint_wallpaper)); } } @Override public void onPause() { super.onPause(); getActivity().unregisterReceiver(receiver); BaiduAnalyzeUtils.onPageEnd("草稿箱"); } BroadcastReceiver receiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { if (intent != null && PublishManager.ACTION_PUBLISH_CHANNGED.equals(intent.getAction())) new DraftTask(RefreshMode.reset).execute(); } }; @Override protected void requestData(RefreshMode mode) { } class DraftTask extends PagingTask<Void, Void, ArrayList<PublishBean>> { public DraftTask(RefreshMode mode) { super("DraftTask", mode); } @Override protected List<PublishBean> parseResult(ArrayList<PublishBean> result) { return result; } @Override protected ArrayList<PublishBean> workInBackground(RefreshMode mode, String previousPage, String nextPage, Void... params) throws TaskException { return PublishDB.getPublishList(AppContext.getUser()); } } class DraftboxItemView extends AbstractItemView<PublishBean> { @ViewInject(id = R.id.txtType) TextView txtType; @ViewInject(id = R.id.txtTiming) TextView txtTiming; @ViewInject(id = R.id.txtContent) AisenTextView txtContent; @ViewInject(id = R.id.txtError) TextView txtError; @ViewInject(id = R.id.container) View container; @Override public int inflateViewId() { return R.layout.item_draft; } @Override public void bindingData(View convertView, PublishBean data) { txtTiming.setVisibility(View.GONE); PublishType type = data.getType(); if (type == PublishType.status) { txtType.setText(R.string.draft_type_status); if (data.getTiming() > 0) { txtTiming.setText(String.format( getString(R.string.draft_timing_hint), DateUtils.formatDate(data.getTiming(), getString(R.string.draft_date_format)))); txtTiming.setVisibility(View.VISIBLE); } } else if (type == PublishType.commentCreate) txtType.setText(R.string.draft_type_create_cmt); else if (type == PublishType.commentReply) txtType.setText(R.string.draft_type_reply_cmt); else if (type == PublishType.statusRepost) txtType.setText(R.string.draft_type_repost_status); txtContent.setContent(data.getText()); if (data.getTiming() > 0 && data.getTiming() < System.currentTimeMillis()) { txtError.setVisibility(View.VISIBLE); txtError.setText(R.string.draft_timing_expired); } else { if (!TextUtils.isEmpty(data.getErrorMsg())) txtError.setText(data.getErrorMsg()); txtError.setVisibility(TextUtils.isEmpty(data.getErrorMsg()) ? View.GONE : View.VISIBLE); } if (bizFragment != null) bizFragment.bindOnTouchListener(txtContent); } @Override public void updateConvertView(PublishBean data, View convertView, int selectedPosition) { super.updateConvertView(data, convertView, selectedPosition); AisenUtil.setAlpha(convertView); container.setSelected(checkedArray.get(getPosition())); convertView.setLayoutParams(new AbsListView.LayoutParams(AbsListView.LayoutParams.MATCH_PARENT, AbsListView.LayoutParams.WRAP_CONTENT)); } } @Override public boolean onCreateActionMode(ActionMode mode, Menu menu) { MenuInflater inflater = getActivity().getMenuInflater(); inflater.inflate(R.menu.draft, menu); menu.findItem(R.id.clear).setVisible(false); mode.setTitle(R.string.title_draft); setSubtitle(mode); return true; } @Override public void onDestroyActionMode(ActionMode arg0) { isSelectedModeActivated = false; checkedArray.clear(); getListView().clearChoices(); getAdapter().notifyDataSetChanged(); } @Override public boolean onPrepareActionMode(ActionMode arg0, Menu arg1) { isSelectedModeActivated = true; getAdapter().notifyDataSetChanged(); return true; } @Override public void onItemCheckedStateChanged(ActionMode mode, int position, long id, boolean checked) { final int checkedCount = getListView().getCheckedItemCount(); if (checkedCount > 0) setSubtitle(mode); checkedArray.put(position, checked); getAdapter().notifyDataSetChanged(); } private void setSubtitle(ActionMode mode) { final int checkedCount = getListView().getCheckedItemCount(); switch (checkedCount) { case 0: mode.setSubtitle(R.string.draft_del_draft_remind); break; default: mode.setSubtitle(String.format(getString(R.string.opts_select_remind), checkedCount)); break; } } @Override public boolean onActionItemClicked(final ActionMode mode, MenuItem item) { if (item.getItemId() == R.id.delete) { if (getListView().getCheckedItemCount() == 0) { showMessage(R.string.none_opts_selected); return true; } deleteDraft(mode); } else if (item.getItemId() == R.id.reSend) { SparseBooleanArray selectedItems = checkedArray; for (int i = 0; i < getAdapterItems().size(); i++) { if (selectedItems.get(i)) { PublishService.publish(getActivity(), getAdapterItems().get(i)); } } mode.finish(); } else if (item.getItemId() == R.id.clear) { } return true; } private void deleteDraft(final ActionMode mode) { new AlertDialog.Builder(getActivity()).setTitle(R.string.remind) .setMessage(R.string.draft_del_confirm) .setNegativeButton(R.string.cancel, null) .setPositiveButton(R.string.confirm, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { if (getListView().getCheckedItemCount() > 0) { final int size = getListView().getCheckedItemCount(); new WorkTask<Void, Void, ArrayList<PublishBean>>() { @Override protected void onPrepare() { ViewUtils.createNormalProgressDialog(getActivity(), getString(R.string.draft_del_draft_loading)).show(); }; @Override protected void onSuccess(java.util.ArrayList<PublishBean> result) { setAdapterItems(result); notifyDataSetChanged(); showMessage(String.format(getString(R.string.draft_del_draft_hint), size)); Intent intent = new Intent(); intent.setAction(PublishManager.ACTION_PUBLISH_CHANNGED); GlobalContext.getInstance().sendBroadcast(intent); }; @Override protected void onFinished() { ViewUtils.dismissNormalProgressDialog(); mode.finish(); new DraftTask(RefreshMode.reset).execute(); }; @Override public ArrayList<PublishBean> workInBackground(Void... params) throws TaskException { try { Thread.sleep(500); } catch (Exception e) { } ActivityHelper.getInstance().putBooleanShareData("ChanneSortHasChanged", true); SparseBooleanArray selectedItems = checkedArray; ArrayList<PublishBean> unselectedBeans = new ArrayList<PublishBean>(); for (int i = 0; i < getAdapterItems().size(); i++) { if (selectedItems.get(i)) { if (getAdapterItems().get(i).getTiming() > 0) MyApplication.removePublishAlarm(getAdapterItems().get(i)); PublishDB.deletePublish(getAdapterItems().get(i), AppContext.getUser()); } } return unselectedBeans; } }.execute(); } } }) .show(); } }