/* * Copyright (c) 2013 Andrew Fontaine, James Finlay, Jesse Tucker, Jacob Viau, and * Evan DeGraff * * Permission is hereby granted, free of charge, to any person obtaining a copy of * this software and associated documentation files (the "Software"), to deal in * the Software without restriction, including without limitation the rights to * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of * the Software, and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all * copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ package ca.cmput301f13t03.adventure_datetime.view; import android.app.ActionBar; import android.app.ActionBar.Tab; import android.content.Context; import android.app.FragmentTransaction; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentActivity; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentPagerAdapter; import android.support.v4.view.ViewPager; import android.util.Log; import android.view.KeyEvent; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.View.OnClickListener; import android.view.inputmethod.EditorInfo; import android.view.inputmethod.InputMethodManager; import android.widget.Button; import android.widget.EditText; import android.widget.LinearLayout; import android.widget.TextView; import ca.cmput301f13t03.adventure_datetime.R; import ca.cmput301f13t03.adventure_datetime.model.Interfaces.ILocalStoriesListener; import ca.cmput301f13t03.adventure_datetime.model.Interfaces.IOnlineStoriesListener; import ca.cmput301f13t03.adventure_datetime.model.Story; import ca.cmput301f13t03.adventure_datetime.serviceLocator.Locator; import java.util.Collection; import java.util.Map; import java.util.UUID; /** * * Contains three fragments/tabs where user can see list of cached stories, * authored stories, and online stories. * * @author James Finlay * */ public class BrowseView extends FragmentActivity implements ILocalStoriesListener, IOnlineStoriesListener { private static final String TAG = "BrowseView"; private ViewPager _viewPager; private ViewPagerAdapter _adapter; private LinearLayout _searchBar; @Override public void OnLocalStoriesChange(Map<UUID, Story> newStories) { _adapter.setLocalStories(Locator.getAuthorController().checkIfNotAuthored(newStories.values())); _adapter.setAuthorStories(Locator.getAuthorController().checkIfAuthored(newStories.values())); } @Override public void OnOnlineStoriesChange(Map<UUID, Story> newStories) { Log.v(TAG, "online stories"); _adapter.setOnlineStories(newStories.values()); } // TODO::JF Listen for Server stories @Override public void onResume() { Locator.getPresenter().Subscribe((ILocalStoriesListener)this); Locator.getPresenter().Subscribe((IOnlineStoriesListener)this); super.onResume(); } @Override public void onPause() { Locator.getPresenter().Unsubscribe((ILocalStoriesListener)this); Locator.getPresenter().Unsubscribe((IOnlineStoriesListener)this); super.onPause(); } @Override public void onSaveInstanceState(Bundle outState) {} @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.browse_viewpager); /* Search bar */ final Button btnSearch = (Button) findViewById(R.id.search); final EditText txtSearch = (EditText) findViewById(R.id.content); _searchBar = (LinearLayout) findViewById(R.id.header); _searchBar.setVisibility(View.GONE); txtSearch.setOnEditorActionListener(new TextView.OnEditorActionListener() { @Override public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { if (actionId == EditorInfo.IME_ACTION_DONE) { Locator.getUserController().search(txtSearch.getText().toString()); txtSearch.setText(""); InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(v.getApplicationWindowToken(), 0); _searchBar.setVisibility(View.GONE); } return false; } }); btnSearch.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Locator.getUserController().search(txtSearch.getText().toString()); txtSearch.setText(""); InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(v.getApplicationWindowToken(), 0); _searchBar.setVisibility(View.GONE); } }); /* Set up View Pager */ _adapter = new ViewPagerAdapter(getSupportFragmentManager()); _viewPager = (ViewPager) findViewById(R.id.pager); _viewPager.setAdapter(_adapter); /* Set up Tabs */ final ActionBar actionBar = getActionBar(); actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); ActionBar.TabListener tabListener = new ActionBar.TabListener() { @Override public void onTabReselected(Tab tab, FragmentTransaction ft) {} @Override public void onTabSelected(Tab tab, FragmentTransaction ft) { _viewPager.setCurrentItem(tab.getPosition()); } @Override public void onTabUnselected(Tab tab, FragmentTransaction ft) {} }; actionBar.addTab(actionBar.newTab() .setText("Saved") .setTabListener(tabListener)); actionBar.addTab(actionBar.newTab() .setText("My Stories") .setTabListener(tabListener)); actionBar.addTab(actionBar.newTab() .setText("Online") .setTabListener(tabListener)); /* Change tabs when View Pager swiped */ _viewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() { @Override public void onPageSelected(int position) { getActionBar().setSelectedNavigationItem(position); if (position != 2) _searchBar.setVisibility(View.GONE); } }); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.search_menu, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.action_search: getActionBar().setSelectedNavigationItem(2); _searchBar.setVisibility(View.VISIBLE); break; } return super.onOptionsItemSelected(item); } public class ViewPagerAdapter extends FragmentPagerAdapter { private BrowseFragment cached, authored, online; public ViewPagerAdapter(FragmentManager fm) { super(fm); cached = new BrowseFragment(); authored = new BrowseFragment(); online = new BrowseFragment(); } public void setLocalStories(Collection<Story> stories) { cached.setStories(stories, BrowseFragment.SOURCE_CACHE); } public void setAuthorStories(Collection<Story> stories) { authored.setStories(stories, BrowseFragment.SOURCE_AUTHOR); } public void setOnlineStories(Collection<Story> stories) { online.setStories(stories, BrowseFragment.SOURCE_ONLINE); } @Override public Fragment getItem(int i) { switch(i) { case 0: return cached; case 1: return authored; case 2: return online; default: return null; } } @Override public int getCount() { return 3; } @Override public CharSequence getPageTitle(int position) { switch (position) { case 0: return "Saved"; case 1: return "My Stories"; case 2: return "Online"; default: return "It be a Pirate!"; } } } }