package info.guardianproject.securereaderinterface; import info.guardianproject.securereaderinterface.PostListFragment.PostListType; import info.guardianproject.securereaderinterface.adapters.StoryListAdapter.OnTagClickedListener; import info.guardianproject.securereaderinterface.uiutil.AnimationHelpers; import info.guardianproject.securereaderinterface.uiutil.UIHelpers; import info.guardianproject.securereaderinterface.uiutil.AnimationHelpers.FadeInFadeOutListener; import info.guardianproject.securereaderinterface.views.CreateAccountView; import info.guardianproject.securereaderinterface.views.FullScreenStoryItemView; import info.guardianproject.securereaderinterface.views.PostSignInView; import info.guardianproject.securereaderinterface.views.CreateAccountView.OnActionListener; import info.guardianproject.securereaderinterface.views.PostSignInView.OnAgreeListener; import info.guardianproject.securereaderinterface.R; import android.content.Context; import android.content.Intent; import android.content.res.Configuration; import android.graphics.drawable.ColorDrawable; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentPagerAdapter; import android.support.v4.app.FragmentTransaction; import android.support.v4.view.ViewPager; import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.View; import android.view.inputmethod.EditorInfo; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.ArrayAdapter; import android.widget.EditText; import android.widget.ListAdapter; import android.widget.ListView; import android.widget.PopupWindow; import android.widget.TextView; import android.widget.TextView.OnEditorActionListener; import com.actionbarsherlock.app.ActionBar; import com.actionbarsherlock.app.ActionBar.Tab; import com.actionbarsherlock.view.Menu; import com.actionbarsherlock.view.MenuItem; public class PostActivity extends ItemExpandActivity implements ActionBar.TabListener, OnActionListener, OnTagClickedListener, OnAgreeListener, FadeInFadeOutListener { PostPagerAdapter mPostPagerAdapter; /** * The {@link ViewPager} that will host the section contents. */ ViewPager mViewPager; CreateAccountView mViewCreateAccount; PostSignInView mViewSignIn; private String mCurrentSearchTag; private MenuItem mMenuItemTag; private MenuItem mMenuAddPost; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_post); setMenuIdentifier(R.menu.activity_post); // Create the adapter that will return a fragment for each of the three // primary sections // of the app. mPostPagerAdapter = new PostPagerAdapter(getSupportFragmentManager()); setActionBarTitle(getString(R.string.title_activity_post)); // Set up the action bar. getSupportActionBar().setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); mViewSignIn = (PostSignInView) findViewById(R.id.signIn); mViewSignIn.setActionListener(this); mViewCreateAccount = (CreateAccountView) findViewById(R.id.createAccount); mViewCreateAccount.setActionListener(this); // Set up the ViewPager with the sections adapter. mViewPager = (ViewPager) findViewById(R.id.pager); mViewPager.setOffscreenPageLimit(3); mViewPager.setAdapter(mPostPagerAdapter); // When swiping between different sections, select the corresponding // tab. // We can also use ActionBar.Tab#select() to do this if we have a // reference to the // Tab. mViewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() { @Override public void onPageSelected(int position) { if (getSupportActionBar().getNavigationMode() == ActionBar.NAVIGATION_MODE_TABS) getSupportActionBar().setSelectedNavigationItem(position); } }); // For each of the sections in the app, add a tab to the action bar. for (int i = 0; i < mPostPagerAdapter.getCount(); i++) { // Create a tab with text corresponding to the page title defined by // the adapter. // Also specify this Activity object, which implements the // TabListener interface, as the // listener for when this tab is selected. getSupportActionBar().addTab(getSupportActionBar().newTab().setText(mPostPagerAdapter.getPageTitle(i)).setTabListener(this)); } } @Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); setIntent(intent); } @Override public boolean onCreateOptionsMenu(Menu menu) { boolean ret = super.onCreateOptionsMenu(menu); mMenuAddPost = menu.findItem(R.id.menu_add_post); mMenuItemTag = menu.findItem(R.id.menu_tag); return ret; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.menu_tag: { showTagSearchPopup(getSupportActionBar().getCustomView()); return true; } } return super.onOptionsItemSelected(item); } /** * A {@link FragmentPagerAdapter} that returns a fragment corresponding to * one of the primary sections of the app. */ public class PostPagerAdapter extends FragmentPagerAdapter { PostListFragment mFragmentPublished; PostListFragment mFragmentOutgoing; PostListFragment mFragmentDrafts; public PostPagerAdapter(FragmentManager fm) { super(fm); } @Override public Fragment getItem(int i) { Bundle args = new Bundle(); if (i == 0) { if (mFragmentPublished == null) { mFragmentPublished = new PostListFragment(); args.putString(PostListFragment.ARG_POST_LIST_TYPE, PostListType.PUBLISHED.toString()); } mFragmentPublished.setStoryListListener(PostActivity.this); mFragmentPublished.setOnTagClickedListener(PostActivity.this); if (mCurrentSearchTag != null) mFragmentPublished.setTagFilter(mCurrentSearchTag); mFragmentPublished.setArguments(args); return mFragmentPublished; } else if (i == 1) { if (mFragmentOutgoing == null) { mFragmentOutgoing = new PostListFragment(); args.putString(PostListFragment.ARG_POST_LIST_TYPE, PostListType.OUTGOING.toString()); mFragmentOutgoing.setStoryListListener(PostActivity.this); mFragmentOutgoing.setOnTagClickedListener(PostActivity.this); if (mCurrentSearchTag != null) mFragmentOutgoing.setTagFilter(mCurrentSearchTag); mFragmentOutgoing.setArguments(args); } return mFragmentOutgoing; } else if (i == 2) { if (mFragmentDrafts == null) { mFragmentDrafts = new PostListFragment(); args.putString(PostListFragment.ARG_POST_LIST_TYPE, PostListType.DRAFTS.toString()); mFragmentDrafts.setStoryListListener(PostActivity.this); mFragmentDrafts.setOnTagClickedListener(PostActivity.this); if (mCurrentSearchTag != null) mFragmentDrafts.setTagFilter(mCurrentSearchTag); mFragmentDrafts.setArguments(args); } return mFragmentDrafts; } return null; } @Override public int getCount() { return 3; } @Override public CharSequence getPageTitle(int position) { switch (position) { case 0: return getString(R.string.post_title_published).toUpperCase(); case 1: return getString(R.string.post_title_outgoing).toUpperCase(); case 2: return getString(R.string.post_title_drafts).toUpperCase(); } return null; } public void setTagFilter(String tag) { if (mFragmentPublished != null) mFragmentPublished.setTagFilter(tag); if (mFragmentOutgoing != null) mFragmentOutgoing.setTagFilter(tag); if (mFragmentDrafts != null) mFragmentDrafts.setTagFilter(tag); } public void updateAdapter() { if (mFragmentPublished != null) mFragmentPublished.updateListAdapter(); if (mFragmentOutgoing != null) mFragmentOutgoing.updateListAdapter(); if (mFragmentDrafts != null) mFragmentDrafts.updateListAdapter(); } } @Override public void onTabReselected(Tab tab, FragmentTransaction ft) { } @Override public void onTabSelected(Tab tab, FragmentTransaction ft) { mViewPager.setCurrentItem(tab.getPosition(), false); } @Override public void onTabUnselected(Tab tab, FragmentTransaction ft) { } @Override protected void onResume() { super.onResume(); showHideCreateAccount(false); if (mPostPagerAdapter != null) mPostPagerAdapter.updateAdapter(); // Anyone telling us where to go? if (getIntent().hasExtra("go_to_tab")) { int tab = getIntent().getIntExtra("go_to_tab", -1); getIntent().removeExtra("go_to_tab"); if (tab >= 0 && tab < 3) mViewPager.setCurrentItem(tab, false); } } @Override public void onTagClicked(String tag) { mCurrentSearchTag = tag; mPostPagerAdapter.setTagFilter(tag); if (tag != null) { getSupportActionBar().setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD); } else { // Clear the tag search. Show the tabs again! // int currentIndex = mViewPager.getCurrentItem(); getSupportActionBar().setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); getSupportActionBar().setSelectedNavigationItem(currentIndex); } } private void showTagSearchPopup(View anchorView) { try { LayoutInflater inflater = getLayoutInflater(); final PopupWindow mMenuPopup = new PopupWindow(inflater.inflate(R.layout.story_search_by_tag, null, false), this.mViewPager.getWidth(), this.mViewPager.getHeight(), true); ListView lvTags = (ListView) mMenuPopup.getContentView().findViewById(R.id.lvTags); String[] rgTags = new String[0]; // rgTags[0] = "#one"; // rgTags[1] = "#two"; // rgTags[2] = "#three"; // rgTags[3] = "#four"; ListAdapter adapter = new ArrayAdapter<String>(this, R.layout.story_search_by_tag_item, R.id.tvTag, rgTags); lvTags.setAdapter(adapter); lvTags.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> arg0, View arg1, int position, long id) { String tag = (String) arg0.getAdapter().getItem(position); onTagClicked(tag); mMenuPopup.dismiss(); } }); EditText editTag = (EditText) mMenuPopup.getContentView().findViewById(R.id.editTag); editTag.setOnEditorActionListener(new OnEditorActionListener() { @Override public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { if (actionId == EditorInfo.IME_NULL || actionId == EditorInfo.IME_ACTION_SEARCH) { onTagClicked(v.getText().toString()); mMenuPopup.dismiss(); return true; } return false; } }); mMenuPopup.setOutsideTouchable(true); mMenuPopup.setBackgroundDrawable(new ColorDrawable(0x80ffffff)); mMenuPopup.showAsDropDown(anchorView); mMenuPopup.getContentView().setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mMenuPopup.dismiss(); } }); } catch (Exception e) { e.printStackTrace(); } } @Override protected void prepareFullScreenView(FullScreenStoryItemView fullView) { super.prepareFullScreenView(fullView); fullView.showFavoriteButton(false); } @Override protected void configureActionBarForFullscreen(boolean fullscreen) { if (mMenuAddPost != null) mMenuAddPost.setVisible(!fullscreen); if (mMenuItemTag != null) mMenuItemTag.setVisible(!fullscreen); if (!fullscreen) { getSupportActionBar().setDisplayShowCustomEnabled(true); setDisplayHomeAsUp(false); toggleActionBarTabs(true); } else { getSupportActionBar().setDisplayShowCustomEnabled(false); setDisplayHomeAsUp(true); toggleActionBarTabs(false); } } private void toggleActionBarTabs(boolean showTabs) { if (showTabs) { // Clear the tag search. Show the tabs again! // int currentIndex = mViewPager.getCurrentItem(); getSupportActionBar().setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); getSupportActionBar().setSelectedNavigationItem(currentIndex); } else { // Dont show tabs when we are searching for a tag getSupportActionBar().setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD); } } private void showHideCreateAccount(boolean animate) { if (App.getSettings().acceptedPostPermission()) { mViewCreateAccount.setVisibility(View.GONE); if (animate) AnimationHelpers.fadeOut(mViewSignIn, 500, 0, false, this); else mViewSignIn.setVisibility(View.GONE); } else if (App.getInstance().socialReporter.getAuthorName() != null) { if (animate) { AnimationHelpers.fadeOut(mViewCreateAccount, 500, 0, false, this); AnimationHelpers.fadeIn(mViewSignIn, 500, 0, false, this); } else { mViewSignIn.setVisibility(View.VISIBLE); mViewCreateAccount.setVisibility(View.GONE); } } else { mViewCreateAccount.setVisibility(View.VISIBLE); } } @Override public void onCreateIdentity(String authorName) { App.getInstance().socialReporter.createAuthorName(authorName); showHideCreateAccount(true); } @Override public void onAgreed() { App.getSettings().setAcceptedPostPermission(true); showHideCreateAccount(true); } @Override protected void onWipe() { super.onWipe(); // Reload the adapters after the the wipe! if (mPostPagerAdapter != null) mPostPagerAdapter.updateAdapter(); } @Override public void onFadeInStarted(View view) { if (view == mViewSignIn) view.setVisibility(View.VISIBLE); } @Override public void onFadeInEnded(View view) { } @Override public void onFadeOutStarted(View view) { } @Override public void onFadeOutEnded(View view) { view.setVisibility(View.GONE); // To avoid old device bug, see // http://stackoverflow.com/questions/4728908/android-view-with-view-gone-still-receives-ontouch-and-onclick view.clearAnimation(); UIHelpers.hideSoftKeyboard(this); } @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); if (mPostPagerAdapter != null) mPostPagerAdapter.updateAdapter(); } }