/* Copyright (C) 2013 Prasanna Thirumalai This file is part of StackX. StackX is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. StackX is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with StackX. If not, see <http://www.gnu.org/licenses/>. */ package com.prasanna.android.stacknetwork; import android.app.Activity; import android.app.Fragment; import android.app.SearchManager; import android.content.Context; import android.content.Intent; import android.graphics.Bitmap; import android.graphics.drawable.BitmapDrawable; import android.os.Bundle; import android.text.Html; import android.view.Menu; import android.view.MenuItem; import android.view.MenuItem.OnActionExpandListener; import android.view.View; import android.view.View.OnFocusChangeListener; import android.widget.CheckBox; import android.widget.CompoundButton; import android.widget.CompoundButton.OnCheckedChangeListener; import android.widget.LinearLayout; import android.widget.PopupWindow; import android.widget.RelativeLayout; import android.widget.SearchView; import com.prasanna.android.cache.BitmapCache; import com.prasanna.android.stacknetwork.fragment.SettingsFragment; import com.prasanna.android.stacknetwork.model.Site; import com.prasanna.android.stacknetwork.utils.AppUtils; import com.prasanna.android.stacknetwork.utils.OperatingSite; import com.prasanna.android.stacknetwork.utils.SharedPreferencesUtil; import com.prasanna.android.stacknetwork.utils.StringConstants; import com.prasanna.android.task.AsyncTaskCompletionNotifier; import com.prasanna.android.task.AsyncTaskExecutor; import com.prasanna.android.task.GetImageAsyncTask; public abstract class AbstractUserActionBarActivity extends Activity { private boolean showingSearchFilters = false; private PopupWindow popupWindow; private SearchView searchView; private Site site; protected Menu actionBarMenu; protected abstract void refresh(); protected abstract boolean shouldSearchViewBeEnabled(); @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); loadDefaultSite(); initializeActionBar(); } private void loadDefaultSite() { if (OperatingSite.getSite() == null) { OperatingSite.setSite(AppUtils.getDefaultSite(getApplicationContext())); if (OperatingSite.getSite() == null) { startActivity(new Intent(this, StackNetworkListActivity.class)); finish(); } } site = OperatingSite.getSite(); } private void initializeActionBar() { getActionBar().setHomeButtonEnabled(false); setActionBarTitleAndIcon(); } protected void setActionBarTitleAndIcon() { if (OperatingSite.getSite() != null) { setActionBarTitle(OperatingSite.getSite().name); setActionBarHomeIcon(OperatingSite.getSite()); } } protected void setActionBarTitle(String title) { getActionBar().setTitle(Html.fromHtml(title)); } protected void setActionBarHomeIcon(Site site) { if (BitmapCache.getInstance().containsKey(site.name)) setActionBarHomeIcon(BitmapCache.getInstance().get(site.name)); else loadIcon(site.name, site.iconUrl); } protected void setActionBarHomeIcon(Bitmap result) { getActionBar().setIcon(new BitmapDrawable(getResources(), result)); getActionBar().setHomeButtonEnabled(true); } private void loadIcon(final String site, final String siteIconUrl) { GetImageAsyncTask fetchImageAsyncTask = new GetImageAsyncTask(new AsyncTaskCompletionNotifier<Bitmap>() { @Override public void notifyOnCompletion(Bitmap result) { setActionBarHomeIcon(result); BitmapCache.getInstance().add(site, result); } }); AsyncTaskExecutor.getInstance().executeInThreadPoolExecutor(fetchImageAsyncTask, siteIconUrl); } @Override public void onResume() { super.onResume(); AppUtils.loadAccessToken(getApplicationContext()); OperatingSite.setSite(site); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.action_menu, menu); if (shouldSearchViewBeEnabled()) setupSearchItem(menu); else { menu.removeItem(R.id.menu_search); menu.removeItem(R.id.menu_search_filter); } if (!AppUtils.inAuthenticatedRealm(getApplicationContext())) setupActionBarForAnyUser(menu); this.actionBarMenu = menu; getActionBar().setHomeButtonEnabled(true); return true; } private void setupActionBarForAnyUser(Menu menu) { menu.removeItem(R.id.menu_my_profile); menu.removeItem(R.id.menu_my_inbox); } private void setupSearchItem(final Menu menu) { searchView = setupSearchMenuItemAndGetActionView(menu); setupSearchActionView(menu); setupPopupForSearchOptions(); } private void setupSearchActionView(final Menu menu) { SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE); searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName())); searchView.setOnQueryTextFocusChangeListener(new OnFocusChangeListener() { @Override public void onFocusChange(View v, boolean hasFocus) { if (hasFocus && popupWindow.isShowing()) { popupWindow.dismiss(); menu.findItem(R.id.menu_search_filter).setIcon(R.drawable.expand); showingSearchFilters = false; } } }); } private SearchView setupSearchMenuItemAndGetActionView(final Menu menu) { MenuItem searchItem = menu.findItem(R.id.menu_search); searchItem.setOnActionExpandListener(new OnActionExpandListener() { @Override public boolean onMenuItemActionExpand(MenuItem item) { menu.findItem(R.id.menu_search_filter).setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS); menu.findItem(R.id.menu_search_filter).setVisible(true); return true; } @Override public boolean onMenuItemActionCollapse(MenuItem item) { menu.findItem(R.id.menu_search_filter).setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER); menu.findItem(R.id.menu_search_filter).setVisible(false); if (popupWindow.isShowing()) popupWindow.dismiss(); menu.findItem(R.id.menu_search_filter).setIcon(R.drawable.expand); showingSearchFilters = false; return true; } }); return ((SearchView) searchItem.getActionView()); } private void setupPopupForSearchOptions() { RelativeLayout popupLayout = (RelativeLayout) getLayoutInflater().inflate(R.layout.search_options, null); popupWindow = new PopupWindow(popupLayout, RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT); setupSearchPrefCheckBox((CheckBox) popupLayout.findViewById(R.id.searchInTitleCB), SettingsFragment.KEY_PREF_SEARCH_IN_TITLE); setupSearchPrefCheckBox((CheckBox) popupLayout.findViewById(R.id.searchOnlyAnsweredCB), SettingsFragment.KEY_PREF_SEARCH_ONLY_ANSWERED); setupSearchPrefCheckBox((CheckBox) popupLayout.findViewById(R.id.searchOnlyWithAnswersCB), SettingsFragment.KEY_PREF_SEARCH_ONLY_WITH_ANSWERS); } private void setupSearchPrefCheckBox(final CheckBox checkBox, final String prefName) { checkBox.setChecked(SharedPreferencesUtil.isSet(getApplicationContext(), prefName, false)); checkBox.setOnCheckedChangeListener(new OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { SharedPreferencesUtil.setBoolean(getApplicationContext(), prefName, isChecked); } }); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: return onActionBarHomeButtonClick(item); case R.id.menu_refresh: refresh(); return true; case R.id.menu_search_filter: showSearchFilterOptions(item); return true; case R.id.menu_advanced_search: startActivity(new Intent(this, AdvancedSearchActivity.class)); return true; case R.id.menu_my_profile: Intent userProfileIntent = new Intent(getApplicationContext(), UserProfileActivity.class); userProfileIntent.putExtra(StringConstants.SITE, OperatingSite.getSite()); userProfileIntent.putExtra(StringConstants.ME, true); startActivity(userProfileIntent); return true; case R.id.menu_my_inbox: Intent userInboxIntent = new Intent(getApplicationContext(), UserInboxActivity.class); userInboxIntent.putExtra(StringConstants.ACCESS_TOKEN, AppUtils.loadAccessToken(getApplicationContext())); startActivity(userInboxIntent); return true; case R.id.menu_option_change_site: startActivity(new Intent(this, StackNetworkListActivity.class)); return true; case R.id.menu_option_settings: startActivity(new Intent(this, SettingsActivity.class)); return true; } return false; } private void showSearchFilterOptions(MenuItem item) { if (showingSearchFilters) { item.setIcon(R.drawable.expand); popupWindow.dismiss(); showingSearchFilters = false; searchView.requestFocus(); } else { item.setIcon(R.drawable.navigation_collapse); searchView.measure(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT); popupWindow.showAsDropDown(searchView, 300, 0); showingSearchFilters = true; searchView.clearFocus(); } } protected boolean onActionBarHomeButtonClick(MenuItem item) { if (this instanceof QuestionsActivity) finish(); Intent intent = new Intent(this, QuestionsActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent); return true; } @SuppressWarnings("unchecked") protected <T extends Fragment> T findFragmentByTag(String tag, Class<T> clazz){ return (T) getFragmentManager().findFragmentByTag(tag); } }