/******************************************************************************* * Copyright 2011, 2012, 2013 fanfou.com, Xiaoke, Zhang * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. *******************************************************************************/ package com.fanfou.app.opensource; import java.util.ArrayList; import java.util.List; import android.app.SearchManager; import android.content.Intent; import android.net.Uri; import android.os.AsyncTask; import android.os.Bundle; import android.os.Parcelable; import android.util.Log; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.AdapterView.OnItemLongClickListener; import android.widget.ListView; import com.fanfou.app.opensource.adapter.SearchResultsAdapter; import com.fanfou.app.opensource.api.ApiClient; import com.fanfou.app.opensource.api.ApiException; import com.fanfou.app.opensource.api.bean.Status; import com.fanfou.app.opensource.service.Constants; import com.fanfou.app.opensource.ui.ActionBar; import com.fanfou.app.opensource.ui.UIManager; import com.fanfou.app.opensource.ui.widget.EndlessListView; import com.fanfou.app.opensource.ui.widget.EndlessListView.OnRefreshListener; import com.fanfou.app.opensource.util.CommonHelper; import com.fanfou.app.opensource.util.StringHelper; /** * @author mcxiaoke * @version 1.0 2011.08.05 * @version 1.1 2011.10.12 * @version 1.5 2011.10.24 * @version 1.6 2011.11.21 * @version 1.7 2011.11.25 * */ public class SearchResultsPage extends BaseActivity implements OnRefreshListener, OnItemLongClickListener { private class SearchTask extends AsyncTask<Void, Void, List<Status>> { @Override protected List<com.fanfou.app.opensource.api.bean.Status> doInBackground( final Void... params) { if (StringHelper.isEmpty(SearchResultsPage.this.keyword)) { return null; } List<com.fanfou.app.opensource.api.bean.Status> result = null; int count = Constants.DEFAULT_TIMELINE_COUNT; if (AppContext.isWifi()) { count = Constants.MAX_TIMELINE_COUNT; } try { result = SearchResultsPage.this.api.search( SearchResultsPage.this.keyword, null, SearchResultsPage.this.maxId, count, Constants.FORMAT, Constants.MODE); } catch (final ApiException e) { if (AppContext.DEBUG) { e.printStackTrace(); } } return result; } @Override protected void onPostExecute( final List<com.fanfou.app.opensource.api.bean.Status> result) { if (!SearchResultsPage.this.showListView) { showContent(); } if ((result != null) && (result.size() > 0)) { final int size = result.size(); log("result size=" + size); SearchResultsPage.this.maxId = result.get(size - 1).id; log("maxId=" + SearchResultsPage.this.maxId); SearchResultsPage.this.mStatuses.addAll(result); updateUI(size < 20); } } @Override protected void onPreExecute() { } } protected ActionBar mActionBar; protected EndlessListView mListView; protected ViewGroup mEmptyView; protected SearchResultsAdapter mStatusAdapter; private List<Status> mStatuses; protected String keyword; protected String maxId; private ApiClient api; private boolean showListView = false; private static final String tag = SearchResultsPage.class.getSimpleName(); private static final String LIST_STATE = "listState"; private Parcelable mState = null; private void doSearch() { if (this.keyword != null) { if (AppContext.DEBUG) { log("doSearch() keyword=" + this.keyword); } this.mActionBar.setTitle(this.keyword); new SearchTask().execute(); } } private void goTop() { if (this.mListView != null) { this.mListView.setSelection(0); } } protected void initialize() { this.mStatuses = new ArrayList<Status>(); this.api = AppContext.getApiClient(); } private void log(final String message) { Log.d(SearchResultsPage.tag, message); } @Override public void onClick(final View v) { switch (v.getId()) { case R.id.actionbar_title: goTop(); break; default: break; } } @Override protected void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); initialize(); setLayout(); search(); } @Override public void onItemClick(final ListView view, final View row, final int position) { final Status s = (Status) view.getItemAtPosition(position); if (s != null) { CommonHelper.goStatusPage(this.mContext, s); } } @Override public boolean onItemLongClick(final AdapterView<?> parent, final View view, final int position, final long id) { final Status s = (Status) parent.getItemAtPosition(position); showPopup(view, s); return true; } @Override public void onLoadMore(final ListView view) { doSearch(); } @Override protected void onNewIntent(final Intent intent) { setIntent(intent); search(); } @Override protected void onPause() { super.onPause(); } @Override public void onRefresh(final ListView view) { } @Override protected void onRestoreInstanceState(final Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); this.mState = savedInstanceState .getParcelable(SearchResultsPage.LIST_STATE); } @Override protected void onResume() { super.onResume(); if ((this.mState != null) && (this.mListView != null)) { this.mListView.onRestoreInstanceState(this.mState); this.mState = null; } } @Override protected void onSaveInstanceState(final Bundle outState) { super.onSaveInstanceState(outState); if (this.mListView != null) { this.mState = this.mListView.onSaveInstanceState(); outState.putParcelable(SearchResultsPage.LIST_STATE, this.mState); } } protected void parseIntent() { final Intent intent = getIntent(); if (Intent.ACTION_SEARCH.equals(intent.getAction())) { this.keyword = intent.getStringExtra(SearchManager.QUERY); if (AppContext.DEBUG) { log("parseIntent() keyword=" + this.keyword); } } else if (Intent.ACTION_VIEW.equals(intent.getAction())) { final Uri data = intent.getData(); if (data != null) { this.keyword = data.getLastPathSegment(); log("parseIntent() keyword=" + this.keyword); } } } protected void search() { parseIntent(); this.mStatuses.clear(); doSearch(); showProgress(); } /** * 初始化和设置ActionBar */ private void setActionBar() { this.mActionBar = (ActionBar) findViewById(R.id.actionbar); this.mActionBar.setTitle("搜索结果"); this.mActionBar.setTitleClickListener(this); this.mActionBar.setRightAction(new ActionBar.SearchAction(this)); this.mActionBar.setLeftAction(new ActionBar.BackAction(this)); } private void setLayout() { setContentView(R.layout.list); setActionBar(); this.mEmptyView = (ViewGroup) findViewById(R.id.empty); this.mListView = (EndlessListView) findViewById(R.id.list); this.mListView.setOnItemLongClickListener(this); this.mListView.setOnRefreshListener(this); } private void showContent() { this.showListView = true; this.mStatusAdapter = new SearchResultsAdapter(this, this.mStatuses); this.mListView.setAdapter(this.mStatusAdapter); this.mEmptyView.setVisibility(View.GONE); this.mListView.removeHeader(); this.mListView.setVisibility(View.VISIBLE); } private void showPopup(final View view, final Status s) { if ((s == null) || s.isNull()) { return; } UIManager.showPopup(this, view, s, this.mStatusAdapter, this.mStatuses); } private void showProgress() { this.showListView = false; this.mListView.setVisibility(View.GONE); this.mEmptyView.setVisibility(View.VISIBLE); } protected void updateUI(final boolean noMore) { this.mStatusAdapter.updateDataAndUI(this.mStatuses, this.keyword); if (noMore) { this.mListView.onNoLoadMore(); } else { this.mListView.onLoadMoreComplete(); } } }