/*
* 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 android.content.Intent;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.Gravity;
import android.view.KeyEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnFocusChangeListener;
import android.view.inputmethod.InputMethodManager;
import android.widget.ArrayAdapter;
import android.widget.AutoCompleteTextView;
import android.widget.ImageButton;
import android.widget.LinearLayout;
import android.widget.LinearLayout.LayoutParams;
import android.widget.TabHost;
import android.widget.TabHost.OnTabChangeListener;
import android.widget.TabHost.TabSpec;
import android.widget.TextView;
import com.mappn.gfan.Constants;
import com.mappn.gfan.R;
import com.mappn.gfan.common.ApiAsyncTask.ApiRequestListener;
import com.mappn.gfan.common.MarketAPI;
import com.mappn.gfan.common.util.DBUtils;
import com.mappn.gfan.common.util.TopBar;
import com.mappn.gfan.common.util.Utils;
import com.mappn.gfan.common.widget.BaseTabActivity;
/**
* this view is displaying for search tab in home
*
* @author cong.li
* @date 2011-5-9
* @since Version 0.7.0
*/
public class SearchActivity extends BaseTabActivity implements OnClickListener,
OnFocusChangeListener, ApiRequestListener {
// 定义TextView的Padding属性
private static final int PADING_TOP_BOTTOM = 15;
private static final int PADING_LEFT_RIGHT = 20;
// private static final int PAD_RIGHT = 10;
// private static final int PAD_BOTTOM = 10;
// 定义TextView的Margin属性
private static final int MARGIN_LEFT_RIGHT = 15;
private static final int MARGIN_TOP_BOTTOM = 20;
private static int[] sHotBackgound;
private LinearLayout mKeywordsLayout;
// Tab id
private static final String TAB_PRODUCT_ID = "product";
private static final String TAB_BBS_ID = "bbs";
private TabHost mTabHost;
private ImageButton searchBtn;
private AutoCompleteTextView mAutoCompleteTextView;
private ArrayAdapter<String> mSearchHistoryAdapter;
private ArrayList<String> mHistory;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_search_layout);
initTopBar();
initView();
initData();
}
private void initTopBar() {
TopBar.createTopBar(getApplicationContext(),
new View[] { findViewById(R.id.top_bar_input),
findViewById(R.id.top_bar_search) },
new int[] { View.VISIBLE, View.VISIBLE }, "");
findViewById(R.id.top_bar_search).setOnClickListener(this);
}
private void initData() {
mHistory = DBUtils.querySearchHistory(getApplicationContext());
mSearchHistoryAdapter = new ArrayAdapter<String>(getApplicationContext(),
R.layout.activity_search_autotext_list, mHistory);
mAutoCompleteTextView.setAdapter(mSearchHistoryAdapter);
mAutoCompleteTextView.setThreshold(1);
MarketAPI.getSearchKeywords(getApplicationContext(), this);
}
private void initView() {
searchBtn = (ImageButton) this.findViewById(R.id.top_bar_search);
searchBtn.setOnClickListener(this);
mAutoCompleteTextView = (AutoCompleteTextView) findViewById(R.id.top_bar_input);
mAutoCompleteTextView.setOnFocusChangeListener(this);
sHotBackgound = new int[] {
R.drawable.keyword_bg_1, R.drawable.keyword_bg_1, R.drawable.keyword_bg_1,
R.drawable.keyword_bg_2, R.drawable.keyword_bg_2, R.drawable.keyword_bg_2,
R.drawable.keyword_bg_3, R.drawable.keyword_bg_3, R.drawable.keyword_bg_3,
R.drawable.keyword_bg_4, R.drawable.keyword_bg_4, R.drawable.keyword_bg_4,
R.drawable.keyword_bg_5, R.drawable.keyword_bg_5, R.drawable.keyword_bg_5 };
mKeywordsLayout = (LinearLayout) findViewById(R.id.tab_content_linearLayout);
initTabView();
}
private void initTabView() {
mTabHost = (TabHost) this.findViewById(android.R.id.tabhost);
mTabHost.setup();
Intent marketIntent = new Intent(getApplicationContext(), SearchResultActivity.class);
marketIntent.putExtra(Constants.EXTRA_SEARCH_TYPE, Constants.SEARCH_TYPE_MARKET);
TabSpec tab1 = mTabHost
.newTabSpec(TAB_PRODUCT_ID)
.setIndicator(
Utils.createSearchTabView(getApplicationContext(),
getString(R.string.tab_product))).setContent(marketIntent);
mTabHost.addTab(tab1);
Intent bbsIntent = new Intent(getApplicationContext(), SearchResultActivity.class);
bbsIntent.putExtra(Constants.EXTRA_SEARCH_TYPE, Constants.SEARCH_TYPE_BBS);
TabSpec tab2 = mTabHost
.newTabSpec(TAB_BBS_ID)
.setIndicator(
Utils.createSearchTabView(getApplicationContext(),
getString(R.string.tab_bbs))).setContent(bbsIntent);
mTabHost.addTab(tab2);
mTabHost.setOnTabChangedListener(new OnTabChangeListener() {
@Override
public void onTabChanged(String tabId) {
if (TAB_BBS_ID.equals(tabId)) {
Utils.trackEvent(getApplicationContext(), Constants.GROUP_2,
Constants.CLICK_SEARCH_BBS);
}
doSearch();
}
});
}
private void showTabView() {
resetCurrentActivity();
updateMarketResultNumber(0);
updateBbsResultNumber(0);
mTabHost.setVisibility(View.VISIBLE);
mKeywordsLayout.setVisibility(View.GONE);
}
/*
* 初始化搜索热词VIew
*/
private void initSearchKeywordsView(ArrayList<String> keywords) {
LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT);
// the display screen width
int displayWidth = getWindowManager().getDefaultDisplay().getWidth();
float rowWidth = 0f;
LinearLayout rowLayout = null;
for (int i = 0, length = keywords.size(); i < length; i++) {
String text = keywords.get(i);
TextView keywordView = createTextView(i, text);
float textWidth = keywordView.getPaint().measureText(text)
+ PADING_LEFT_RIGHT * 2 + MARGIN_LEFT_RIGHT * 2;
rowWidth += textWidth;
if (rowLayout == null
|| rowWidth > displayWidth) {
// 创建一个新的横向布局 或者 子View超过屏幕宽度,折行显示
rowWidth = textWidth;
rowLayout = getHorizontalLinearLayout(lp);
mKeywordsLayout.addView(rowLayout);
}
rowLayout.addView(keywordView);
}
}
/*
* 生成新的水平方向的LinearLayout
*/
private LinearLayout getHorizontalLinearLayout(LayoutParams lp) {
LinearLayout layout = new LinearLayout(getApplicationContext());
layout.setLayoutParams(lp);
layout.setGravity(Gravity.CENTER);
return layout;
}
/*
* 创建一新的热词View
*/
private TextView createTextView(int position, String text) {
LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
lp.leftMargin = MARGIN_LEFT_RIGHT;
lp.rightMargin = MARGIN_LEFT_RIGHT;
lp.topMargin = MARGIN_TOP_BOTTOM;
lp.bottomMargin = MARGIN_TOP_BOTTOM;
TextView view = new TextView(getApplicationContext());
view.setText(text);
view.setLayoutParams(lp);
view.setGravity(Gravity.CENTER_VERTICAL);
view.setOnClickListener(this);
view.setBackgroundResource(sHotBackgound[position]);
view.setPadding(PADING_LEFT_RIGHT, PADING_TOP_BOTTOM, PADING_LEFT_RIGHT, PADING_TOP_BOTTOM);
view.setTextAppearance(getApplicationContext(), R.style.hot_font);
view.setFocusableInTouchMode(false);
view.setGravity(Gravity.CENTER);
return view;
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.top_bar_search:
// 点击搜索按钮
Utils.trackEvent(getApplicationContext(), Constants.GROUP_2, Constants.CLICK_SEARCH);
doSearch();
break;
default:
// 点击关键词
Utils.trackEvent(getApplicationContext(), Constants.GROUP_2,
Constants.CLICK_SEARCH_KEYWORDS);
mAutoCompleteTextView.setText(((TextView) v).getText());
doSearch();
break;
}
}
private void doSearch() {
String content = mAutoCompleteTextView.getText().toString().trim();
if (TextUtils.isEmpty(content)) {
resetCurrentActivity();
return;
}
if (!mTabHost.isShown()) {
mTabHost.setVisibility(View.VISIBLE);
mKeywordsLayout.setVisibility(View.GONE);
// 开始搜索
mTabHost.setCurrentTabByTag(TAB_PRODUCT_ID);
}
storeToAdapter(content);
toogleInputMethod(false);
SearchResultActivity resultActivity = (SearchResultActivity) getCurrentActivity();
resultActivity.setSearchKeyword(content);
resultActivity.lazyload();
}
private void resetCurrentActivity() {
SearchResultActivity resultActivity = (SearchResultActivity) getCurrentActivity();
resultActivity.resetSearchResult();
}
/**
* 将搜索内容添加到数据源adapter
*/
private void storeToAdapter(String content) {
if (!mHistory.contains(content)) {
mSearchHistoryAdapter.add(content);
DBUtils.addSearchItem(getApplicationContext(), content);
mHistory.add(content);
mSearchHistoryAdapter.notifyDataSetChanged();
}
}
@Override
public void onFocusChange(View v, boolean hasFocus) {
switch (v.getId()) {
case R.id.top_bar_input:
toogleInputMethod(hasFocus);
break;
default:
break;
}
}
public void setKeyword(String text) {
if (mAutoCompleteTextView != null) {
mAutoCompleteTextView.setText(text);
}
}
public String getKeyword() {
if (mAutoCompleteTextView != null) {
return mAutoCompleteTextView.getText().toString();
}
return null;
}
@SuppressWarnings("unchecked")
@Override
public void onSuccess(int method, Object obj) {
switch (method) {
case MarketAPI.ACTION_GET_SEARCH_KEYWORDS:
initSearchKeywordsView((ArrayList<String>) obj);
break;
}
}
@Override
public void onError(int method, int statusCode) {
Utils.D("fetch keywords fail because of status " + statusCode);
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (mTabHost != null && mTabHost.isShown()) {
mAutoCompleteTextView.setText("");
mTabHost.setCurrentTabByTag(TAB_PRODUCT_ID);
mTabHost.requestFocus();
mTabHost.setVisibility(View.GONE);
resetCurrentActivity();
mKeywordsLayout.setVisibility(View.VISIBLE);
return true;
}
return super.onKeyDown(keyCode, event);
}
// toogle input method status
private void toogleInputMethod(boolean flag) {
InputMethodManager imm = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
if (flag) {
imm.showSoftInputFromInputMethod(mAutoCompleteTextView.getWindowToken(), 0);
showTabView();
} else {
imm.hideSoftInputFromWindow(mAutoCompleteTextView.getWindowToken(), 0);
}
}
/*package*/ void updateMarketResultNumber(int num) {
if (mTabHost == null) {
return;
}
TextView tv = (TextView) mTabHost.getTabWidget().getChildTabViewAt(0);
if(num > 0) {
tv.setText(getString(R.string.tab_product_result, String.valueOf(num)));
} else {
tv.setText(R.string.tab_product);
}
}
/*package*/ void updateBbsResultNumber(int num) {
if (mTabHost == null) {
return;
}
TextView tv = (TextView) mTabHost.getTabWidget().getChildTabViewAt(1);
if(num > 0) {
tv.setText(getString(R.string.tab_bbs_result, String.valueOf(num)));
} else {
tv.setText(R.string.tab_bbs);
}
}
}