package com.sonaive.v2ex.ui;
import android.app.FragmentManager;
import android.app.SearchManager;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v7.widget.Toolbar;
import android.view.MenuItem;
import android.view.View;
import android.widget.FrameLayout;
import com.sonaive.v2ex.R;
import com.sonaive.v2ex.ui.widgets.DrawShadowFrameLayout;
import com.sonaive.v2ex.ui.widgets.OnQueryListener;
import com.sonaive.v2ex.ui.widgets.SimpleSearchView;
import com.sonaive.v2ex.util.UIUtils;
import static com.sonaive.v2ex.util.LogUtils.makeLogTag;
/**
* Created by liutao on 1/1/15.
*/
public class SearchActivity extends BaseActivity implements OnQueryListener {
private static final String TAG = makeLogTag(SearchActivity.class);
public static final int EXTRA_SEARCH_FEEDS = 1;
public static final int EXTRA_SEARCH_NODES = 2;
private static final String ARG_ACTION_SEARCH = "action_search";
private static final String ARG_SHOW_SEARCH_FRG = "show_search_frg";
/** The handler message for updating the search query. */
private static final int MESSAGE_QUERY_UPDATE = 1;
/** The delay before actual requerying in millisecs. */
private static final int QUERY_UPDATE_DELAY_MILLIS = 2000;
FragmentManager fm;
FeedsFragment mFeedsFragment = null;
NodesFragment mNodesFragment = null;
SearchFragment mSearchFragment = null;
SimpleSearchView searchView;
private DrawShadowFrameLayout mDrawShadowFrameLayout;
private FrameLayout feedsFrgContainer;
private FrameLayout nodesFrgContainer;
private FrameLayout searchFrgContainer;
private View mButterBar;
private boolean isShowSearchFragment = true;
private int actionSearch;
String mQuery = "";
private Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
if (msg.what == MESSAGE_QUERY_UPDATE) {
Bundle args = (Bundle) msg.obj;
if (args != null) {
String keyword = args.getString("keyword");
if (mSearchFragment == null) {
mSearchFragment = (SearchFragment) getFragmentManager().findFragmentByTag("search_fragment");
}
mSearchFragment.updateLocalRecords(keyword);
}
}
}
};
public static Intent getCallingIntent(Context context, int extra) {
Intent intent = new Intent(context, SearchActivity.class);
intent.putExtra(ARG_ACTION_SEARCH, extra);
return intent;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_search);
if (savedInstanceState != null) {
actionSearch = savedInstanceState.getInt(ARG_ACTION_SEARCH);
isShowSearchFragment = savedInstanceState.getBoolean(ARG_SHOW_SEARCH_FRG);
} else {
actionSearch = getIntent().getIntExtra(ARG_ACTION_SEARCH, 0);
}
Toolbar toolbar = getActionBarToolbar();
toolbar.setNavigationIcon(R.drawable.ic_up_grey);
toolbar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
finish();
}
});
mDrawShadowFrameLayout = (DrawShadowFrameLayout) findViewById(R.id.main_content);
feedsFrgContainer = (FrameLayout) findViewById(R.id.feeds_fragment_container);
nodesFrgContainer = (FrameLayout) findViewById(R.id.nodes_fragment_container);
searchFrgContainer = (FrameLayout) findViewById(R.id.search_fragment_container);
mButterBar = findViewById(R.id.butter_bar);
feedsFrgContainer.setVisibility(View.INVISIBLE);
nodesFrgContainer.setVisibility(View.INVISIBLE);
searchFrgContainer.setVisibility(View.VISIBLE);
fm = getFragmentManager();
String query = getIntent().getStringExtra(SearchManager.QUERY);
query = query == null ? "" : query;
mQuery = query;
overridePendingTransition(0, 0);
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putInt(ARG_ACTION_SEARCH, actionSearch);
outState.putBoolean(ARG_SHOW_SEARCH_FRG, isShowSearchFragment);
}
@Override
protected Toolbar getActionBarToolbar() {
Toolbar actionBarToolbar = super.getActionBarToolbar();
searchView = (SimpleSearchView) actionBarToolbar.findViewById(R.id.search_view);
if (searchView != null) {
searchView.setOnQueryListener(this);
if (actionSearch == EXTRA_SEARCH_FEEDS) {
searchView.setHint(R.string.hint_search_title);
} else {
searchView.setHint(R.string.hint_search_nodes);
}
}
return actionBarToolbar;
}
@Override
protected void onResume() {
super.onResume();
mFeedsFragment = (FeedsFragment) getFragmentManager().findFragmentById(R.id.feeds_fragment);
mNodesFragment = (NodesFragment) getFragmentManager().findFragmentById(R.id.nodes_fragment);
mSearchFragment = (SearchFragment) getFragmentManager().findFragmentById(R.id.search_fragment);
checkShowNoNetworkButterBar();
updateFragContentTopClearance();
}
@Override
protected void onPause() {
super.onPause();
if (isFinishing()) {
overridePendingTransition(0, 0);
}
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == R.id.menu_search) {
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
protected void onNetworkChange() {
checkShowNoNetworkButterBar();
}
// Updates the Feeds fragment content top clearance to take our chrome into account
private void updateFragContentTopClearance() {
if (mSearchFragment == null || mFeedsFragment == null || mNodesFragment == null) {
return;
}
final boolean butterBarVisible = mButterBar != null
&& mButterBar.getVisibility() == View.VISIBLE;
int actionBarClearance = UIUtils.calculateActionBarSize(this);
int butterBarClearance = butterBarVisible
? getResources().getDimensionPixelSize(R.dimen.butter_bar_height) : 0;
mDrawShadowFrameLayout.setShadowTopOffset(actionBarClearance + butterBarClearance);
mFeedsFragment.setContentTopClearance(actionBarClearance + butterBarClearance, isActionBarShown());
mSearchFragment.setContentTopClearance(actionBarClearance + butterBarClearance);
mNodesFragment.setContentTopClearance(actionBarClearance + butterBarClearance);
}
private void onQuery(final String s) {
if (mSearchFragment == null || mFeedsFragment == null || mNodesFragment == null) {
mFeedsFragment = (FeedsFragment) getFragmentManager().findFragmentById(R.id.feeds_fragment);
mNodesFragment = (NodesFragment) getFragmentManager().findFragmentById(R.id.nodes_fragment);
mSearchFragment = (SearchFragment) getFragmentManager().findFragmentById(R.id.search_fragment);
}
if (s.trim().isEmpty()) {
if (actionSearch == EXTRA_SEARCH_FEEDS) {
fm.beginTransaction().show(mSearchFragment).hide(mFeedsFragment).commit();
feedsFrgContainer.setVisibility(View.INVISIBLE);
} else if (actionSearch == EXTRA_SEARCH_NODES) {
fm.beginTransaction().show(mSearchFragment).hide(mNodesFragment).commit();
nodesFrgContainer.setVisibility(View.INVISIBLE);
}
searchFrgContainer.setVisibility(View.VISIBLE);
isShowSearchFragment = true;
} else {
Bundle args = new Bundle();
args.putString("keyword", s);
args.putInt("menu", ITEM_SEARCH);
requestQueryUpdate(args);
if (actionSearch == EXTRA_SEARCH_FEEDS) {
if (mNodesFragment != null) {
fm.beginTransaction().show(mFeedsFragment).hide(mSearchFragment).remove(mNodesFragment).commit();
} else {
fm.beginTransaction().show(mFeedsFragment).hide(mSearchFragment).commit();
}
feedsFrgContainer.setVisibility(View.VISIBLE);
if (null != mFeedsFragment) {
mFeedsFragment.requestQueryUpdate(args);
}
} else if (actionSearch == EXTRA_SEARCH_NODES) {
if (mFeedsFragment != null) {
fm.beginTransaction().show(mNodesFragment).hide(mSearchFragment).remove(mFeedsFragment).commit();
} else {
fm.beginTransaction().show(mNodesFragment).hide(mSearchFragment).commit();
}
nodesFrgContainer.setVisibility(View.VISIBLE);
if (null != mNodesFragment) {
mNodesFragment.requestQueryUpdate(args);
}
}
searchFrgContainer.setVisibility(View.INVISIBLE);
isShowSearchFragment = false;
}
updateFragContentTopClearance();
}
void requestQueryUpdate(Bundle arguments) {
mHandler.removeMessages(MESSAGE_QUERY_UPDATE);
mHandler.sendMessageDelayed(Message.obtain(mHandler, MESSAGE_QUERY_UPDATE, arguments),
QUERY_UPDATE_DELAY_MILLIS);
}
private boolean checkShowNoNetworkButterBar() {
if (!isOnline()) {
UIUtils.setUpButterBar(mButterBar, getString(R.string.error_network_unavailable),
getString(R.string.close), new View.OnClickListener() {
@Override
public void onClick(View v) {
mButterBar.setVisibility(View.GONE);
updateFragContentTopClearance();
}
}
);
return true;
} else {
if (mButterBar.getVisibility() == View.VISIBLE) {
mButterBar.setVisibility(View.GONE);
updateFragContentTopClearance();
}
return false;
}
}
@Override
public void onSubmit(String s) {
onQuery(s);
}
@Override
public void onClear() {
onQuery("");
}
@Override
public void onQueryTextChange(String s) {
onQuery(s);
}
public void onEvent(String keyword) {
if (searchView != null) {
searchView.setText(keyword);
}
}
}