package info.justaway.fragment; import android.app.Dialog; import android.os.AsyncTask; import android.os.Bundle; import android.support.v4.app.DialogFragment; import android.support.v4.app.FragmentActivity; import android.view.View; import android.view.Window; import android.view.WindowManager; import android.widget.ListView; import android.widget.ProgressBar; import java.util.List; import de.greenrobot.event.EventBus; import info.justaway.R; import info.justaway.adapter.TwitterAdapter; import info.justaway.event.model.StreamingDestroyStatusEvent; import info.justaway.event.action.StatusActionEvent; import info.justaway.listener.StatusClickListener; import info.justaway.listener.StatusLongClickListener; import info.justaway.model.Row; import info.justaway.model.TwitterManager; import info.justaway.util.MessageUtil; import twitter4j.Paging; import twitter4j.ResponseList; import twitter4j.Status; import twitter4j.Twitter; /** * 会話を表示 * * @author aska */ public class AroundFragment extends DialogFragment { private ProgressBar mProgressBarTop; private ProgressBar mProgressBarBottom; private TwitterAdapter mAdapter; @Override public Dialog onCreateDialog(Bundle savedInstanceState) { FragmentActivity activity = getActivity(); Dialog dialog = new Dialog(activity); dialog.getWindow().requestFeature(Window.FEATURE_NO_TITLE); dialog.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN); dialog.setContentView(R.layout.fragment_around); ListView listView = (ListView) dialog.findViewById(R.id.list); mProgressBarTop = (ProgressBar) dialog.findViewById(R.id.guruguru_top); mProgressBarBottom = (ProgressBar) dialog.findViewById(R.id.guruguru_bottom); // コンテキストメニューを使える様にする為の指定、但しデフォルトではロングタップで開く registerForContextMenu(listView); // Status(ツイート)をViewに描写するアダプター mAdapter = new TwitterAdapter(activity, R.layout.row_tweet); listView.setAdapter(mAdapter); listView.setOnItemClickListener(new StatusClickListener(activity)); listView.setOnItemLongClickListener(new StatusLongClickListener(getActivity())); Status status = (Status) getArguments().getSerializable("status"); if (status != null) { mAdapter.add(Row.newStatus(status)); new BeforeStatusTask().execute(status); } return dialog; } @Override public void onResume() { super.onResume(); EventBus.getDefault().register(this); } @Override public void onPause() { EventBus.getDefault().unregister(this); super.onPause(); } @SuppressWarnings("UnusedDeclaration") public void onEventMainThread(StatusActionEvent event) { mAdapter.notifyDataSetChanged(); } @SuppressWarnings("UnusedDeclaration") public void onEventMainThread(StreamingDestroyStatusEvent event) { mAdapter.removeStatus(event.getStatusId()); } private class BeforeStatusTask extends AsyncTask<Status, Void, ResponseList<Status>> { public BeforeStatusTask() { super(); } @Override protected ResponseList<twitter4j.Status> doInBackground(twitter4j.Status... params) { try { Twitter twitter = TwitterManager.getTwitter(); twitter4j.Status status = params[0]; Paging paging = new Paging(); paging.setCount(3); paging.setMaxId(status.getId() - 1); return twitter.getUserTimeline(status.getUser().getScreenName(), paging); } catch (Exception e) { e.printStackTrace(); return null; } } @Override protected void onPostExecute(ResponseList<twitter4j.Status> statuses) { mProgressBarBottom.setVisibility(View.GONE); if (statuses != null) { if (statuses.size() > 0) { for (twitter4j.Status status : statuses) { mAdapter.add(Row.newStatus(status)); } mAdapter.notifyDataSetChanged(); new AfterStatusTask().execute(statuses.get(0)); } } else { MessageUtil.showToast(R.string.toast_load_data_failure); } } } private class AfterStatusTask extends AsyncTask<twitter4j.Status, Void, List<Status>> { public AfterStatusTask() { super(); } @Override protected List<twitter4j.Status> doInBackground(twitter4j.Status... params) { try { Twitter twitter = TwitterManager.getTwitter(); twitter4j.Status status = params[0]; Paging paging = new Paging(); paging.setCount(200); paging.setSinceId(status.getId() - 1); for (int page = 1; page < 5; page++) { paging.setPage(page); ResponseList<twitter4j.Status> statuses = twitter.getUserTimeline(status.getUser().getScreenName(), paging); int index = 0; for (twitter4j.Status row : statuses) { if (row.getId() == status.getId()) { if (index > 0) { return statuses.subList(Math.max(0, index - 4), index - 1); } } index++; } } return null; } catch (Exception e) { e.printStackTrace(); return null; } } @Override protected void onPostExecute(List<twitter4j.Status> statuses) { mProgressBarTop.setVisibility(View.GONE); if (statuses != null) { int i = 0; for (twitter4j.Status status : statuses) { mAdapter.insert(Row.newStatus(status), i); i++; } mAdapter.notifyDataSetChanged(); } } } }