package info.justaway; import android.app.ActionBar; import android.content.Context; import android.content.Intent; import android.os.AsyncTask; import android.os.Bundle; import android.support.v4.app.FragmentActivity; import android.support.v4.app.LoaderManager; import android.support.v4.content.Loader; import android.view.KeyEvent; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.inputmethod.InputMethodManager; import android.widget.AbsListView; import android.widget.ListView; import android.widget.ProgressBar; import java.util.ArrayList; import java.util.List; import butterknife.ButterKnife; import butterknife.Bind; import butterknife.OnClick; import de.greenrobot.event.EventBus; import info.justaway.adapter.TwitterAdapter; import info.justaway.event.AlertDialogEvent; import info.justaway.event.action.StatusActionEvent; import info.justaway.event.model.StreamingDestroyStatusEvent; import info.justaway.listener.StatusClickListener; import info.justaway.listener.StatusLongClickListener; import info.justaway.model.Row; import info.justaway.model.TabManager; import info.justaway.model.TwitterManager; import info.justaway.util.KeyboardUtil; import info.justaway.util.MessageUtil; import info.justaway.util.ThemeUtil; import info.justaway.task.AbstractAsyncTaskLoader; import info.justaway.widget.ClearEditText; import info.justaway.widget.FontelloButton; import twitter4j.Query; import twitter4j.QueryResult; import twitter4j.SavedSearch; public class SearchActivity extends FragmentActivity implements LoaderManager.LoaderCallbacks<QueryResult> { @Bind(R.id.searchWords) ClearEditText mSearchWords; @Bind(R.id.search_button) FontelloButton mSearchButton; @Bind(R.id.search_list) ListView mSearchList; @Bind(R.id.guruguru) ProgressBar mGuruguru; private TwitterAdapter mAdapter; private Query mNextQuery; public static int RESULT_CREATE_SAVED_SEARCH = 100; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ThemeUtil.setTheme(this); setContentView(R.layout.activity_search); ButterKnife.bind(this); ActionBar actionBar = getActionBar(); if (actionBar != null) { actionBar.setHomeButtonEnabled(true); actionBar.setDisplayHomeAsUpEnabled(true); } // Status(ツイート)をViewに描写するアダプター mAdapter = new TwitterAdapter(this, R.layout.row_tweet); mSearchList.setAdapter(mAdapter); mSearchList.setOnItemClickListener(new StatusClickListener(this)); mSearchList.setOnItemLongClickListener(new StatusLongClickListener(this)); mSearchWords.setOnKeyListener(new View.OnKeyListener() { @Override public boolean onKey(View v, int keyCode, KeyEvent event) { //EnterKeyが押されたかを判定 if (event.getAction() == KeyEvent.ACTION_DOWN && keyCode == KeyEvent.KEYCODE_ENTER) { search(); return true; } return false; } }); Intent intent = getIntent(); String query = intent.getStringExtra("query"); if (query != null) { mSearchWords.setText(query); mSearchButton.performClick(); } else { KeyboardUtil.showKeyboard(mSearchWords); } mSearchList.setOnScrollListener(new AbsListView.OnScrollListener() { @Override public void onScrollStateChanged(AbsListView view, int scrollState) { } @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { // 最後までスクロールされたかどうかの判定 if (totalItemCount == firstVisibleItem + visibleItemCount) { additionalReading(); } } }); } @OnClick(R.id.search_button) void onClickSearchButton() { search(); } @OnClick(R.id.tweet_button) void onClickTweetButton() { if (mSearchWords.getText() == null) return; Intent intent = new Intent(this, PostActivity.class); intent.putExtra("status", " ".concat(mSearchWords.getText().toString())); startActivity(intent); } @Override protected void onResume() { super.onResume(); EventBus.getDefault().register(this); } @Override protected void onPause() { EventBus.getDefault().unregister(this); super.onPause(); } @SuppressWarnings("UnusedDeclaration") public void onEventMainThread(AlertDialogEvent event) { event.getDialogFragment().show(getSupportFragmentManager(), "dialog"); } @SuppressWarnings("UnusedDeclaration") public void onEventMainThread(StatusActionEvent event) { mAdapter.notifyDataSetChanged(); } @SuppressWarnings("UnusedDeclaration") public void onEventMainThread(StreamingDestroyStatusEvent event) { mAdapter.removeStatus(event.getStatusId()); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.search, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: finish(); break; case R.id.save_search: if (mSearchWords.getText() != null) { new CreateSavedSearchTask().execute(mSearchWords.getText().toString()); } break; case R.id.search_to_tab: ArrayList<TabManager.Tab> tabs = TabManager.loadTabs(); String searchWord = mSearchWords.getText().toString(); TabManager.Tab tab = new TabManager.Tab(TabManager.SEARCH_TAB_ID - Math.abs(searchWord.hashCode())); tab.name = searchWord; tabs.add(tab); TabManager.saveTabs(tabs); setResult(RESULT_OK); break; } return true; } private void additionalReading() { if (mNextQuery != null) { mGuruguru.setVisibility(View.VISIBLE); Bundle args = new Bundle(1); args.putSerializable("query", mNextQuery); getSupportLoaderManager().restartLoader(0, args, this); mNextQuery = null; } } private void search() { KeyboardUtil.hideKeyboard(mSearchWords); if (mSearchWords.getText() == null) return; mAdapter.clear(); mSearchList.setVisibility(View.GONE); mGuruguru.setVisibility(View.VISIBLE); mNextQuery = null; Query query = new Query(mSearchWords.getText().toString().concat(" exclude:retweets")); Bundle args = new Bundle(1); args.putSerializable("query", query); getSupportLoaderManager().restartLoader(0, args, this).forceLoad(); } @Override public Loader<QueryResult> onCreateLoader(int id, Bundle args) { Query query = (Query) args.getSerializable("query"); return new SearchLoader(this, query); } @Override public void onLoadFinished(Loader<QueryResult> loader, QueryResult queryResult) { if (queryResult == null) { MessageUtil.showToast(R.string.toast_load_data_failure); return; } if (queryResult.hasNext()) { mNextQuery = queryResult.nextQuery(); } int count = mAdapter.getCount(); List<twitter4j.Status> statuses = queryResult.getTweets(); for (twitter4j.Status status : statuses) { mAdapter.add(Row.newStatus(status)); } mSearchList.setVisibility(View.VISIBLE); if (count == 0) { mSearchList.setSelection(0); } mGuruguru.setVisibility(View.GONE); // インテント経由で検索時にうまく閉じてくれないので入れている InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); inputMethodManager.hideSoftInputFromWindow(mSearchWords.getWindowToken(), 0); } @Override public void onLoaderReset(android.support.v4.content.Loader<QueryResult> loader) { } public static class SearchLoader extends AbstractAsyncTaskLoader<QueryResult> { private Query mQuery; public SearchLoader(Context context, Query query) { super(context); mQuery = query; } @Override public QueryResult loadInBackground() { try { return TwitterManager.getTwitter().search(mQuery); } catch (Exception e) { e.printStackTrace(); return null; } } } private class CreateSavedSearchTask extends AsyncTask<String, Void, SavedSearch> { @Override protected SavedSearch doInBackground(String... params) { String query = params[0]; try { return TwitterManager.getTwitter().createSavedSearch(query); } catch (Exception e) { e.printStackTrace(); return null; } } @Override protected void onPostExecute(SavedSearch savedSearch) { if (savedSearch == null) { return; } setResult(RESULT_CREATE_SAVED_SEARCH); MessageUtil.showToast(getString(R.string.toast_save_success)); } } }