package com.duckduckgo.mobile.android.fragment; import android.content.Context; import android.content.res.Configuration; import android.database.Cursor; import android.graphics.Rect; import android.os.Build; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v7.view.menu.MenuBuilder; import android.util.Log; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; import android.view.View; import android.view.ViewGroup; import android.view.ViewTreeObserver; import android.view.Window; import android.view.inputmethod.InputMethodManager; import android.widget.Adapter; import android.widget.AdapterView; import android.widget.LinearLayout; import android.widget.ListView; import com.duckduckgo.mobile.android.DDGApplication; import com.duckduckgo.mobile.android.R; import com.duckduckgo.mobile.android.actionbar.DDGActionBarManager; import com.duckduckgo.mobile.android.adapters.FavoriteResultCursorAdapter; import com.duckduckgo.mobile.android.adapters.RecentResultCursorAdapter; import com.duckduckgo.mobile.android.adapters.SearchAdapter; import com.duckduckgo.mobile.android.bus.BusProvider; import com.duckduckgo.mobile.android.events.AutoCompleteResultClickEvent; import com.duckduckgo.mobile.android.events.HistoryItemSelectedEvent; import com.duckduckgo.mobile.android.events.OverflowButtonClickEvent; import com.duckduckgo.mobile.android.events.ShowAutoCompleteResultsEvent; import com.duckduckgo.mobile.android.events.SyncAdaptersEvent; import com.duckduckgo.mobile.android.objects.history.HistoryObject; import com.duckduckgo.mobile.android.util.DDGControlVar; import com.duckduckgo.mobile.android.util.SCREEN; import com.duckduckgo.mobile.android.views.DDGOverflowMenu; import com.duckduckgo.mobile.android.views.SearchListView; import com.squareup.otto.Subscribe; public class SearchFragment extends Fragment implements ViewTreeObserver.OnGlobalLayoutListener, AdapterView.OnItemClickListener, AdapterView.OnItemLongClickListener { public static final String TAG = "search_fragment"; public static final String TAG_HOME_PAGE = "search_fragment_home_page"; private ListView autoCompleteResultListView; private SearchListView searchListView; private SearchAdapter adapter; private FavoriteResultCursorAdapter savedSearchAdapter; private RecentResultCursorAdapter recentAdapter; //View headerPadding; private LinearLayout search_container; private View fragmentView = null; private Menu searchMenu = null; private DDGOverflowMenu overflowMenu = null; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); BusProvider.getInstance().register(this); } @Override public void onDestroy() { super.onDestroy(); BusProvider.getInstance().unregister(this); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { fragmentView = inflater.inflate(R.layout.fragment_search, container, false); return fragmentView; } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); //setHasOptionsMenu(true); search_container = (LinearLayout) fragmentView.findViewById(R.id.search_container); searchListView = (SearchListView) fragmentView.findViewById(R.id.search_list); savedSearchAdapter = new FavoriteResultCursorAdapter(getActivity(), DDGApplication.getDB().getCursorSavedSearch()); recentAdapter = new RecentResultCursorAdapter(getActivity(), DDGApplication.getDB().getCursorSearchHistory()); adapter = new SearchAdapter(getActivity()); adapter.addSection("recents", recentAdapter); adapter.addSection("favorites", savedSearchAdapter); //headerPadding = ((LayoutInflater) getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(R.layout.temp_fake_header, searchListView, false); searchListView.setAdapter(adapter); autoCompleteResultListView = (ListView) fragmentView.findViewById(R.id.autocomplete_list); autoCompleteResultListView.setDivider(null); //headerPadding = ((LayoutInflater) getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(R.layout.temp_fake_header, autoCompleteResultListView, false); autoCompleteResultListView.setOnItemClickListener(this); autoCompleteResultListView.setOnItemLongClickListener(this); autoCompleteResultListView.setVisibility(View.GONE); fragmentView.findViewById(R.id.recent_saved_container).setVisibility(View.GONE); searchMenu = new MenuBuilder(getActivity()); getActivity().getMenuInflater().inflate(R.menu.main, searchMenu); } @Override public void onResume() { super.onResume(); syncAdapters(); if(DDGControlVar.isAutocompleteActive) { autoCompleteResultListView.setAdapter(DDGControlVar.mDuckDuckGoContainer.acAdapter); } else { autoCompleteResultListView.setAdapter(DDGControlVar.mDuckDuckGoContainer.recentResultCursorAdapter); } search_container.getViewTreeObserver().addOnGlobalLayoutListener(this); } @Override public void onPause() { super.onPause(); if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.JELLY_BEAN) { search_container.getViewTreeObserver().removeOnGlobalLayoutListener(this); } else { search_container.getViewTreeObserver().removeGlobalOnLayoutListener(this); } } @Override public void onHiddenChanged(boolean hidden) { super.onHiddenChanged(hidden); if(!hidden) { showAutoCompleteResults(false); syncAdapters(); if(DDGControlVar.isAutocompleteActive) { autoCompleteResultListView.setAdapter(DDGControlVar.mDuckDuckGoContainer.acAdapter); DDGControlVar.mDuckDuckGoContainer.acAdapter.notifyDataSetChanged(); } else { autoCompleteResultListView.setAdapter(DDGControlVar.mDuckDuckGoContainer.recentResultCursorAdapter); DDGControlVar.mDuckDuckGoContainer.recentResultCursorAdapter.notifyDataSetChanged(); } } else { if(overflowMenu!=null && overflowMenu.isShowing()) { overflowMenu.dismiss(); } } } @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { inflater.inflate(R.menu.main, menu); super.onCreateOptionsMenu(menu, inflater); } @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { if(DDGControlVar.isAutocompleteActive) { BusProvider.getInstance().post(new AutoCompleteResultClickEvent(position)); } else { Object adapter = parent.getAdapter(); Cursor c = null; HistoryObject obj = null; Object itemClicked = ((Adapter) adapter).getItem(position); if (itemClicked instanceof Cursor) { c = (Cursor) itemClicked; obj = new HistoryObject(c); } if (obj != null) { BusProvider.getInstance().post(new HistoryItemSelectedEvent(obj)); } } } @Override public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) { return false; } @Subscribe public void onShowAutoCompleteResultsEvent(ShowAutoCompleteResultsEvent event) { if(getActivity()!=null) { showAutoCompleteResults(event.isVisible); } } @Subscribe public void onSyncAdaptersEvent(SyncAdaptersEvent event) { syncAdapters(); } @Override public void onGlobalLayout() { int totalHeight = search_container.getRootView().getHeight(); int visibleHeight = search_container.getHeight(); if(isAdded()) { int statusBar = getStatusBarHeight(); int navigationBar = getNavigationBarHeight(); int actionBarHeight = (int) getActivity().getResources().getDimension(R.dimen.actionbar_height); totalHeight = totalHeight - statusBar - navigationBar - actionBarHeight; int itemHeight = (int) getActivity().getResources().getDimension(R.dimen.temp_item_height); int maxItems = (visibleHeight - (searchListView.getPaddingTop() * 3)) / itemHeight; int recentItems = 0; if (totalHeight > visibleHeight) { recentItems = (maxItems - 1) <= recentAdapter.getCount() ? (maxItems - 1) : recentAdapter.getCount(); } boolean shouldUpdateAdapters = recentItems != 0 && recentItems != recentAdapter.getCount(); if (shouldUpdateAdapters) { syncAdapters(recentItems); } } } private int getStatusBarHeight() { Rect rect = new Rect(); Window window = getActivity().getWindow(); window.getDecorView().getWindowVisibleDisplayFrame(rect); return rect.top; } private int getNavigationBarHeight() { int id = getActivity().getResources().getIdentifier( getActivity().getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT? "navigation_bar_height" : "navigation_bar_height_landscape", "dimen", "android"); if (id > 0) { return getActivity().getResources().getDimensionPixelSize(id); } return 0; } private void syncRecents(int limit) { searchListView.setLimit(limit); DDGControlVar.mDuckDuckGoContainer.recentResultCursorAdapter.changeCursor(DDGApplication.getDB().getCursorSearchHistory()); DDGControlVar.mDuckDuckGoContainer.recentResultCursorAdapter.notifyDataSetChanged(); recentAdapter.changeCursor(DDGApplication.getDB().getCursorSearchHistory(limit)); recentAdapter.notifyDataSetChanged(); savedSearchAdapter.changeCursor(DDGApplication.getDB().getCursorSavedSearch()); savedSearchAdapter.notifyDataSetChanged(); adapter.notifyDataSetChanged(); } private void syncAdapters() { //Log.e("aaa", "syncadapters"); DDGControlVar.mDuckDuckGoContainer.recentResultCursorAdapter.changeCursor(DDGApplication.getDB().getCursorSearchHistory()); DDGControlVar.mDuckDuckGoContainer.recentResultCursorAdapter.notifyDataSetChanged(); savedSearchAdapter.changeCursor(DDGApplication.getDB().getCursorSavedSearch()); savedSearchAdapter.notifyDataSetChanged(); recentAdapter.changeCursor(DDGApplication.getDB().getCursorSearchHistory()); recentAdapter.notifyDataSetChanged(); adapter.notifyDataSetChanged(); searchListView.setLimit(DDGControlVar.mDuckDuckGoContainer.recentResultCursorAdapter.getCount()); } private void syncAdapters(int limit) { DDGControlVar.mDuckDuckGoContainer.recentResultCursorAdapter.changeCursor(DDGApplication.getDB().getCursorSearchHistory()); DDGControlVar.mDuckDuckGoContainer.recentResultCursorAdapter.notifyDataSetChanged(); savedSearchAdapter.changeCursor(DDGApplication.getDB().getCursorSavedSearch()); savedSearchAdapter.notifyDataSetChanged(); recentAdapter.changeCursor(DDGApplication.getDB().getCursorSearchHistory(limit)); recentAdapter.notifyDataSetChanged(); adapter.notifyDataSetChanged(); searchListView.setLimit(recentAdapter.getCount()); } public void showAutoCompleteResults(boolean visible) { autoCompleteResultListView.setVisibility(visible ? View.VISIBLE : View.GONE); searchListView.setVisibility(visible ? View.GONE : View.VISIBLE); } private void showSearch() { toggleSearchView(true); } private void showRecentAndSaved() { toggleSearchView(false); } /** * Toggle view between search results view and recent and saved view * * @param openSearch whether the search results view should be visible or recent saved view */ private void toggleSearchView(boolean openSearch) { if(openSearch) { fragmentView.findViewById(R.id.recent_saved_container).setVisibility(View.GONE); autoCompleteResultListView.setVisibility(View.VISIBLE); } else { fragmentView.findViewById(R.id.recent_saved_container).setVisibility(View.VISIBLE); autoCompleteResultListView.setVisibility(View.GONE); } } private void showDivider() { toggleDivider(true); } private void hideDivider() { toggleDivider(false); } private void toggleDivider(boolean visible) { if(visible) { fragmentView.findViewById(R.id.search_divider).setVisibility(View.VISIBLE); } else { fragmentView.findViewById(R.id.search_divider).setVisibility(View.GONE); } } @Subscribe public void onOverflowButtonClickEvent(OverflowButtonClickEvent event) { if(DDGControlVar.mDuckDuckGoContainer.currentFragmentTag.equals(getTag()) && searchMenu!=null) { if(overflowMenu!=null && overflowMenu.isShowing()) { return; } overflowMenu = new DDGOverflowMenu(getActivity()); overflowMenu.setMenu(searchMenu); overflowMenu.show(event.anchor); } } }