/* * Copyright (C) 2010 mAPPn.Inc * * 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.mappn.gfan.ui; import java.util.ArrayList; import java.util.HashMap; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.view.KeyEvent; import android.view.View; import android.view.View.OnClickListener; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.FrameLayout; import android.widget.ListView; import android.widget.ProgressBar; import android.widget.TextView; import com.mappn.gfan.Constants; import com.mappn.gfan.R; import com.mappn.gfan.common.ApiAsyncTask; import com.mappn.gfan.common.ApiAsyncTask.ApiRequestListener; import com.mappn.gfan.common.MarketAPI; import com.mappn.gfan.common.download.DownloadManager.Request; import com.mappn.gfan.common.util.Utils; import com.mappn.gfan.common.widget.AppListAdapter; import com.mappn.gfan.common.widget.LazyloadListActivity; import com.mappn.gfan.common.widget.LoadingDrawable; /** * this view is displaying for product in search view * * @author cong.li * @date 2011-5-9 * @since Version 0.7.0 */ public class SearchResultActivity extends LazyloadListActivity implements ApiRequestListener, OnClickListener, OnItemClickListener { // Loading private FrameLayout mLoading; private ProgressBar mProgress; private TextView mNoData; private int mTotalSize; private int mEndPosition; private AppListAdapter mAdapter; private int mSearchType; private String mKeywords; @Override public boolean doInitView(Bundle savedInstanceState) { setContentView(R.layout.common_list_view); // 获得搜索类型(市场/社区) mSearchType = getIntent().getIntExtra(Constants.EXTRA_SEARCH_TYPE, 0); mLoading = (FrameLayout) findViewById(R.id.loading); mProgress = (ProgressBar) mLoading.findViewById(R.id.progressbar); mProgress.setIndeterminateDrawable(new LoadingDrawable(getApplicationContext())); mProgress.setVisibility(View.VISIBLE); mNoData = (TextView) mLoading.findViewById(R.id.no_data); mNoData.setOnClickListener(this); switchHintStatus(STATUS_INIT); mList = (ListView) findViewById(android.R.id.list); mList.setVisibility(View.GONE); mList.setEmptyView(mLoading); mList.setOnItemClickListener(this); return true; } @Override public void doLazyload() { if (mSearchType == Constants.SEARCH_TYPE_MARKET) { // 搜索市场结果 MarketAPI.search(getApplicationContext(), this, getItemsPerPage(), getStartIndex(), 0, mKeywords); } else { // 搜索社区结果 MarketAPI.getSearchFromBBS(getApplicationContext(), this, mKeywords, getStartIndex(), getItemsPerPage()); } switchHintStatus(STATUS_LOADING); } @Override public AppListAdapter doInitListAdapter() { if (mSearchType == Constants.SEARCH_TYPE_MARKET) { mAdapter = new AppListAdapter( getApplicationContext(), null, R.layout.search_result_list_item, new String[] { Constants.KEY_PRODUCT_ICON_URL, Constants.KEY_PRODUCT_NAME, Constants.KEY_PRODUCT_AUTHOR, Constants.KEY_PRODUCT_PRICE, Constants.KEY_PRODUCT_RATING, Constants.KEY_PRODUCT_DOWNLOAD, Constants.KEY_PRODUCT_SOURCE_TYPE }, new int[] { R.id.iv_logo, R.id.tv_name, R.id.tv_description, R.id.tv_info, R.id.rb_app_rating, R.id.tv_download, R.id.tv_source}); mAdapter.setProductList(); } else { mAdapter = new AppListAdapter( getApplicationContext(), null, R.layout.activity_search_bbs_item, new String[] { Constants.SEARCH_RESULT_TITLE }, new int[] { R.id.tv_name }); mAdapter.setContainsPlaceHolder(true); mAdapter.setPlaceHolderResource(R.layout.activity_install_nessary_list_separator); } return mAdapter; } private static final int STATUS_INIT = 0; private static final int STATUS_LOADING = 1; private static final int STATUS_NODATA = 2; private static final int STATUS_RETRY = 3; /* * 切换提示状态 */ private void switchHintStatus(int status) { switch (status) { case STATUS_INIT: mNoData.setClickable(false); mNoData.setCompoundDrawablesWithIntrinsicBounds(0, 0, 0, 0); mNoData.setText(R.string.warning_no_input); mProgress.setVisibility(View.GONE); mNoData.setVisibility(View.VISIBLE); break; case STATUS_LOADING: mNoData.setClickable(false); mProgress.setVisibility(View.VISIBLE); mNoData.setVisibility(View.GONE); break; case STATUS_NODATA: mNoData.setClickable(false); mNoData.setCompoundDrawablesWithIntrinsicBounds(0, 0, 0, 0); mNoData.setText(R.string.search_no_result); mProgress.setVisibility(View.GONE); mNoData.setVisibility(View.VISIBLE); break; case STATUS_RETRY: mNoData.setClickable(true); mNoData.setCompoundDrawablesWithIntrinsicBounds(0, R.drawable.btn_retry, 0, 0); mNoData.setText(R.string.no_data); mProgress.setVisibility(View.GONE); mNoData.setVisibility(View.VISIBLE); break; default: break; } } @SuppressWarnings("unchecked") @Override public void onSuccess(int method, Object obj) { switch (method) { case MarketAPI.ACTION_SEARCH: mList.setVisibility(View.VISIBLE); HashMap<String, Object> products = (HashMap<String, Object>) obj; mTotalSize = (Integer) products.get(Constants.KEY_TOTAL_SIZE); mEndPosition = (Integer) products.get(Constants.KEY_END_POSITION); if (mTotalSize > 0) { ArrayList<HashMap<String, Object>> productList = (ArrayList<HashMap<String, Object>>) products.get(Constants.KEY_PRODUCT_LIST); mAdapter.addData(productList); ((SearchActivity)getParent()).updateMarketResultNumber(mTotalSize); } else { switchHintStatus(STATUS_NODATA); } setLoadResult(true); break; case MarketAPI.ACTION_BBS_SEARCH: mList.setVisibility(View.VISIBLE); HashMap<String, Object> result = (HashMap<String, Object>) obj; mTotalSize = (Integer) result.get(Constants.KEY_TOTAL_SIZE); mEndPosition = (Integer) result.get(Constants.KEY_END_POSITION); if(mTotalSize > 0) { ArrayList<HashMap<String, Object>> data = (ArrayList<HashMap<String, Object>>) (result .get(Constants.KEY_JK_LIST)); mAdapter.addData(data); ((SearchActivity)getParent()).updateBbsResultNumber(mTotalSize); } else { switchHintStatus(STATUS_NODATA); } setLoadResult(true); break; default: break; } } @Override public void onError(int method, int statusCode) { if (statusCode == ApiAsyncTask.BUSSINESS_ERROR) { switchHintStatus(STATUS_NODATA); } else if (statusCode == ApiAsyncTask.TIMEOUT_ERROR) { switchHintStatus(STATUS_RETRY); } setLoadResult(false); } @Override protected int getItemCount() { return mTotalSize; } @Override public int getEndIndex() { return mEndPosition; } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if(keyCode == KeyEvent.KEYCODE_BACK) { resetSearchResult(); } return getParent().onKeyDown(keyCode, event); } public void resetSearchResult() { switchHintStatus(STATUS_INIT); reset(); } /** * 设置搜索关键字,为父页面搜索设置 */ public void setSearchKeyword(String keyword) { mKeywords = keyword; resetSearchResult(); } @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { @SuppressWarnings("unchecked") HashMap<String, Object> item = (HashMap<String, Object>) mAdapter.getItem(position); if (mSearchType == Constants.SEARCH_TYPE_MARKET) { String pid = (String) item.get(Constants.KEY_PRODUCT_ID); Intent detailIntent = new Intent(getApplicationContext(), PreloadActivity.class); detailIntent.putExtra(Constants.EXTRA_PRODUCT_ID, pid); detailIntent.putExtra(Constants.EXTRA_SOURCE_TYPE, (String) item.get(Constants.KEY_PRODUCT_SOURCE_TYPE)); startActivity(detailIntent); } else { String url = (String) item.get(Constants.KEY_DOWN_URL); String fileName = (String) item.get(Constants.SEARCH_RESULT_TITLE); Request request = new Request(Uri.parse(url)); request.setTitle(fileName); request.setPackageName(fileName); request.setSourceType(com.mappn.gfan.common.download.Constants.DOWNLOAD_FROM_BBS); mSession.getDownloadManager().enqueue(request); Utils.makeEventToast(getApplicationContext(), getString(R.string.start_download_bbs_apk), false); Utils.trackEvent(getApplicationContext(), Constants.GROUP_2, Constants.CLICK_SEARCH_BBS_APK); } } }