/*******************************************************************************
* Copyright 2013 PAR Works, 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.parworks.mars.view.search;
import java.io.IOException;
import java.util.List;
import android.content.Context;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentTransaction;
import android.util.Log;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnKeyListener;
import android.view.View.OnTouchListener;
import android.view.ViewGroup;
import android.view.inputmethod.InputMethodManager;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.AutoCompleteTextView;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.TextView;
import android.widget.Toast;
import com.actionbarsherlock.app.SherlockFragmentActivity;
import com.fasterxml.jackson.core.type.TypeReference;
import com.parworks.androidlibrary.ar.ARErrorListener;
import com.parworks.androidlibrary.ar.ARListener;
import com.parworks.mars.MarsMenuFragment;
import com.parworks.mars.R;
import com.parworks.mars.model.sync.SyncHandler;
import com.parworks.mars.utils.JsonMapper;
import com.parworks.mars.utils.User;
public class SearchFragment extends MarsMenuFragment {
private static final String TAG = "SearchFragment";
private AutoCompleteTextView autoCompleteView;
private Fragment popularSearchFragment;
private Fragment searchResultFragment;
private List<String> allTags;
public SearchFragment() {
super();
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// retrieve the tags for search
setRetainInstance(false);
SharedPreferences myPrefs = this.getActivity().getSharedPreferences("MARSTAGS", 0);
String allTags = myPrefs.getString("allTags", "[]");
try {
Log.d(TAG, "Loading all tags: " + allTags);
this.allTags = JsonMapper.get().readValue(allTags, new TypeReference<List<String>>(){});
} catch (IOException e) {
Log.e(TAG, "Failed to parse the tags", e);
}
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
popularSearchFragment = new PopularSearchFragment(this);
}
@SuppressWarnings("deprecation")
@Override
public void onResume() {
// TODO Auto-generated method stub
super.onResume();
ImageButton button = (ImageButton)
((SherlockFragmentActivity) this.getActivity())
.getSupportActionBar().getCustomView().findViewById(R.id.rightBarButton);
button.setBackgroundDrawable(null);
// hide search result view
if (searchResultFragment != null) {
switchToSearchResult(true);
} else {
switchToSearchResult(false);
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.fragment_search, null);
// config search text box
autoCompleteView = (AutoCompleteTextView) v.findViewById(R.id.searchText);
// config width/height
@SuppressWarnings("deprecation")
int w = this.getActivity().getWindowManager().getDefaultDisplay().getWidth();
autoCompleteView.getLayoutParams().height = w * 92 / 640;
// fill all the tags to assist input
autoCompleteView.setAdapter(new ArrayAdapter<String>(
this.getActivity(), R.layout.popular_searches_list_row, allTags));
// handle click action
autoCompleteView.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick (AdapterView<?> parentView, View selectedItemView, int position, long id) {
triggerSearch(((TextView)selectedItemView).getText().toString());
}
});
// reset cursor whenever being clicked
autoCompleteView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
autoCompleteView.setCursorVisible(true);
}
});
autoCompleteView.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
autoCompleteView.setCursorVisible(true);
return false;
}
});
// handle key search action
autoCompleteView.setOnKeyListener(new OnKeyListener() {
@Override
public boolean onKey(View arg0, int keyCode, KeyEvent event) {
if (event.getAction() == KeyEvent.ACTION_UP && keyCode == KeyEvent.KEYCODE_ENTER) {
triggerSearch(autoCompleteView.getText().toString());
return true;
}
return false;
}
});
return v;
}
public void triggerSearchFromSuggestion(String searchWord) {
// update text view
autoCompleteView.setText(searchWord);
autoCompleteView.setSelection(searchWord.length());
triggerSearch(searchWord);
}
private void triggerSearch(String searchWord) {
Log.d(TAG, "Start searching: " + searchWord);
// hide keyboard
hideKeyBoard();
// search
User.getARSites().searchSitesByTag(searchWord, new ARListener<List<String>>() {
@Override
public void handleResponse(List<String> resp) {
// start sync all site info at the background
SyncHandler.syncListSiteInfo(resp);
// show result
displaySearchResult(resp);
}
}, new ARErrorListener() {
@Override
public void handleError(Exception e) {
Log.e(TAG, "Failed to search the result", e);
}
});
}
private void displaySearchResult(List<String> siteIds) {
Log.d(TAG, "Search found the following sites: " + siteIds);
if (siteIds != null && siteIds.size() > 0) {
autoCompleteView.setCursorVisible(false);
searchResultFragment = new SearchResultFragment(siteIds);
// show the result view fragment
switchToSearchResult(true);
} else {
Toast.makeText(this.getActivity(), "No results found.", Toast.LENGTH_LONG).show();
}
}
private void hideKeyBoard() {
// close key board
InputMethodManager in = (InputMethodManager) this.getActivity()
.getSystemService(Context.INPUT_METHOD_SERVICE);
in.hideSoftInputFromWindow(autoCompleteView.getApplicationWindowToken(),
InputMethodManager.HIDE_NOT_ALWAYS);
}
@Override
public void onPause() {
super.onPause();
hideKeyBoard();
}
@Override
public void onDestroy() {
super.onDestroy();
FragmentTransaction ft = this.getActivity().getSupportFragmentManager().beginTransaction();
if (popularSearchFragment != null) {
ft.remove(popularSearchFragment);
}
if (searchResultFragment != null) {
ft.remove(searchResultFragment);
}
ft.commitAllowingStateLoss();
}
@Override
public void onDestroyView() {
super.onDestroyView();
}
/**
* Change the Fragment component in the main activity
*/
public void switchToSearchResult(boolean showResult) {
if (showResult) {
this.getActivity().getSupportFragmentManager()
.beginTransaction()
.replace(R.id.search_content_frame, searchResultFragment)
.commit();
} else {
this.getActivity().getSupportFragmentManager()
.beginTransaction()
.replace(R.id.search_content_frame, popularSearchFragment)
.commit();
}
}
public Fragment getPopularSearchFragment() {
return popularSearchFragment;
}
public Fragment getSearchResulFragment() {
return searchResultFragment;
}
}