package org.wordpress.android.ui.reader; import android.app.Dialog; import android.content.Context; import android.content.Intent; import android.content.res.Configuration; import android.net.Uri; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentStatePagerAdapter; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.RelativeLayout; import android.widget.TextView; import com.actionbarsherlock.app.ActionBar; import com.actionbarsherlock.view.Menu; import com.actionbarsherlock.view.MenuInflater; import com.actionbarsherlock.view.MenuItem; import com.actionbarsherlock.view.Window; import com.justsystems.hpb.pad.R; import org.wordpress.android.Constants; import org.wordpress.android.WordPress; import org.wordpress.android.ui.WPActionBarActivity; import org.wordpress.android.ui.reader.ReaderBaseFragment.ChangeTopicListener; import org.wordpress.android.ui.reader.ReaderBaseFragment.GetLastSelectedItemListener; import org.wordpress.android.ui.reader.ReaderBaseFragment.GetLoadedItemsListener; import org.wordpress.android.ui.reader.ReaderBaseFragment.GetPermalinkListener; import org.wordpress.android.ui.reader.ReaderBaseFragment.UpdateButtonStatusListener; import org.wordpress.android.ui.reader.ReaderBaseFragment.UpdateTopicIDListener; import org.wordpress.android.ui.reader.ReaderBaseFragment.UpdateTopicTitleListener; import org.wordpress.android.ui.reader.ReaderDetailPageFragment.LoadExternalURLListener; import org.wordpress.android.ui.reader.ReaderImplFragment.LoadDetailListener; import org.wordpress.android.ui.reader.ReaderImplFragment.PostSelectedListener; import org.wordpress.android.ui.reader.ReaderImplFragment.ShowTopicsListener; import org.wordpress.android.util.WPViewPager; public class ReaderActivity extends WPActionBarActivity implements ChangeTopicListener, PostSelectedListener, UpdateTopicIDListener, UpdateTopicTitleListener, GetLoadedItemsListener, UpdateButtonStatusListener, ShowTopicsListener, LoadExternalURLListener, GetPermalinkListener, GetLastSelectedItemListener, LoadDetailListener { private WPViewPager readerPager; private ReaderPagerAdapter readerAdapter; private Fragment readerPage; private Fragment detailPage; private Fragment topicPage; private Fragment webPage; private Dialog topicsDialog; private boolean isShare; private RelativeLayout topicSelector; private TextView topicText; private MenuItem refreshMenuItem; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { requestWindowFeature(Window.FEATURE_PROGRESS); super.onCreate(savedInstanceState); getSupportActionBar().setDisplayShowTitleEnabled(false); setSupportProgressBarVisibility(false); if (savedInstanceState != null) { // Restore fragments readerPage = getSupportFragmentManager().getFragment( savedInstanceState, ReaderImplFragment.class.getName()); topicPage = getSupportFragmentManager().getFragment( savedInstanceState, ReaderTopicsSelectorFragment.class.getName()); detailPage = getSupportFragmentManager().getFragment( savedInstanceState, ReaderDetailPageFragment.class.getName()); webPage = getSupportFragmentManager().getFragment( savedInstanceState, ReaderWebPageFragment.class.getName()); } createMenuDrawer(R.layout.reader_wpcom_pager); readerPager = (WPViewPager) findViewById(R.id.pager); readerPager.setOffscreenPageLimit(3); readerAdapter = new ReaderPagerAdapter( super.getSupportFragmentManager()); readerPager.setAdapter(readerAdapter); readerPager.setCurrentItem(1, true); ActionBar actionBar = getSupportActionBar(); actionBar.setDisplayShowCustomEnabled(true); // No blog selector for the Reader actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD); LayoutInflater inflator = (LayoutInflater) this .getSystemService(Context.LAYOUT_INFLATER_SERVICE); topicSelector = (RelativeLayout) inflator.inflate( R.layout.reader_topics, null); topicText = (TextView) topicSelector.findViewById(R.id.topic_title); topicSelector.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if (!isFinishing()) showTopics(); } }); actionBar.setCustomView(topicSelector); } @Override protected void onPause() { super.onPause(); if (refreshMenuItem != null && isAnimatingRefreshButton) this.stopAnimatingButton(); } @Override protected void onSaveInstanceState(Bundle outState) { if (outState.isEmpty()) { outState.putBoolean("bug_19917_fix", true); } getSupportFragmentManager().putFragment(outState, ReaderImplFragment.class.getName(), readerPage); getSupportFragmentManager().putFragment(outState, ReaderTopicsSelectorFragment.class.getName(), topicPage); getSupportFragmentManager().putFragment(outState, ReaderDetailPageFragment.class.getName(), detailPage); getSupportFragmentManager().putFragment(outState, ReaderWebPageFragment.class.getName(), webPage); super.onSaveInstanceState(outState); } private class ReaderPagerAdapter extends FragmentStatePagerAdapter { public ReaderPagerAdapter(FragmentManager fm) { super(fm); } @Override public int getCount() { return 4; } @Override public Fragment getItem(int location) { Fragment f = null; switch (location) { case 0: f = ReaderTopicsSelectorFragment.newInstance(); topicPage = f; break; case 1: f = ReaderImplFragment.newInstance(); readerPage = f; break; case 2: f = ReaderDetailPageFragment.newInstance(); detailPage = f; break; case 3: f = ReaderWebPageFragment.newInstance(); webPage = f; break; } return f; } } @Override public boolean onCreateOptionsMenu(Menu menu) { super.onCreateOptionsMenu(menu); MenuInflater inflater = getSupportMenuInflater(); inflater.inflate(R.menu.reader, menu); refreshMenuItem = menu.findItem(R.id.menu_refresh); if (shouldAnimateRefreshButton) { shouldAnimateRefreshButton = false; startAnimatingRefreshButton(refreshMenuItem); } if (readerPager.getCurrentItem() > 1) { menu.findItem(R.id.menu_refresh).setVisible(false); menu.findItem(R.id.menu_browser).setVisible(true); menu.findItem(R.id.menu_share_link).setVisible(true); } else { menu.findItem(R.id.menu_refresh).setVisible(true); menu.findItem(R.id.menu_browser).setVisible(false); menu.findItem(R.id.menu_share_link).setVisible(false); } return true; } public boolean onOptionsItemSelected(final MenuItem item) { final ReaderWebPageFragment readerWebPageFragment = (ReaderWebPageFragment) webPage; final ReaderDetailPageFragment readerPageDetailFragment = (ReaderDetailPageFragment) detailPage; int itemId = item.getItemId(); if (itemId == R.id.menu_refresh) { ReaderImplFragment readerPageFragment = (ReaderImplFragment) readerPage; readerPageFragment.refreshReader(); return true; } else if (itemId == R.id.menu_browser) { if (readerPageDetailFragment != null && readerPageDetailFragment != null) { if (readerPager.getCurrentItem() == 2) { runOnUiThread(new Runnable() { public void run() { readerPageDetailFragment.wv .loadUrl("javascript:Reader2.get_article_permalink();"); } }); } else { String url = readerWebPageFragment.wv.getUrl(); if (url != null) { Uri uri = Uri.parse(url); if (uri != null) { Intent i = new Intent(Intent.ACTION_VIEW); i.setData(uri); startActivity(i); } } } } return true; } else if (itemId == R.id.menu_share_link) { if (readerWebPageFragment != null && readerPageDetailFragment != null) { if (readerPager.getCurrentItem() == 2) { runOnUiThread(new Runnable() { public void run() { isShare = true; readerPageDetailFragment.wv .loadUrl("javascript:Reader2.get_article_permalink();"); } }); } else { String url = readerWebPageFragment.wv.getUrl(); if (url != null) { Intent share = new Intent(Intent.ACTION_SEND); share.setType("text/plain"); share.putExtra(Intent.EXTRA_TEXT, url); startActivity(Intent.createChooser(share, getResources().getText(R.string.share_url))); } } } return true; } else if (itemId == android.R.id.home) { if (readerPager.getCurrentItem() > 1) { readerPager.setCurrentItem(readerPager.getCurrentItem() - 1); supportInvalidateOptionsMenu(); if (readerPager.getCurrentItem() == 1) { try { mMenuDrawer.setDrawerIndicatorEnabled(true); } catch (Exception e) { } } return true; } } return super.onOptionsItemSelected(item); } @Override public void onConfigurationChanged(Configuration newConfig) { // ignore orientation change super.onConfigurationChanged(newConfig); } @Override public void onChangeTopic(final String topicID, final String topicName) { try { final ReaderImplFragment readerPageFragment = (ReaderImplFragment) readerPage; readerPageFragment.topicsID = topicID; runOnUiThread(new Runnable() { public void run() { String methodCall = "Reader2.load_topic('" + topicID + "')"; readerPageFragment.wv.loadUrl("javascript:" + methodCall); if (topicName != null) { topicText.setText(topicName); } if (readerPager.getCurrentItem() != 1) { readerPager.setCurrentItem(1, true); supportInvalidateOptionsMenu(); } } }); } catch (Exception e) { } } @Override public void onPostSelected(String requestedURL) { readerPager.setCurrentItem(2, true); try { mMenuDrawer.setDrawerIndicatorEnabled(false); } catch (Exception e) { } supportInvalidateOptionsMenu(); } @Override public void onBackPressed() { if (readerPager.getCurrentItem() > 1) { if (readerPager.getCurrentItem() == 2) { ReaderDetailPageFragment readerPageDetailFragment = (ReaderDetailPageFragment) detailPage; readerPageDetailFragment.wv .loadUrl("javascript:Reader2.clear_article_details();"); } readerPager.setCurrentItem(readerPager.getCurrentItem() - 1, true); if (readerPager.getCurrentItem() == 1) { try { mMenuDrawer.setDrawerIndicatorEnabled(true); } catch (Exception e) { } } supportInvalidateOptionsMenu(); } else super.onBackPressed(); } @Override public void updateTopicTitle(final String topicTitle) { runOnUiThread(new Runnable() { public void run() { if (topicsDialog != null) { if (topicsDialog.isShowing()) topicsDialog.cancel(); } if (topicTitle != null) { topicText.setText(topicTitle); } // readerPager.setCurrentItem(1, true); } }); } @Override public void onUpdateTopicID(String topicID) { if (topicPage == null) topicPage = readerAdapter.getItem(0); final ReaderTopicsSelectorFragment topicsFragment = (ReaderTopicsSelectorFragment) topicPage; final String methodCall = "document.setSelectedTopic('" + topicID + "')"; runOnUiThread(new Runnable() { public void run() { if (topicsFragment.wv != null) topicsFragment.wv.loadUrl("javascript:" + methodCall); } }); } @Override public void getLoadedItems(String items) { if (items == null) return; if (!items.equals("[]")) { final ReaderDetailPageFragment readerPageDetailFragment = (ReaderDetailPageFragment) detailPage; readerPageDetailFragment.readerItems = items; final String method = "Reader2.set_loaded_items(" + readerPageDetailFragment.readerItems + ")"; runOnUiThread(new Runnable() { public void run() { readerPageDetailFragment.wv.loadUrl("javascript:" + method); } }); } } @Override public void updateButtonStatus(final int button, final boolean enabled) { final ReaderDetailPageFragment readerPageDetailFragment = (ReaderDetailPageFragment) detailPage; runOnUiThread(new Runnable() { public void run() { readerPageDetailFragment.updateButtonStatus(button, enabled); } }); } @Override public void showTopics() { ReaderTopicsSelectorFragment topicsFragment = (ReaderTopicsSelectorFragment) topicPage; ((ViewGroup) topicsFragment.getView().getParent()) .removeView(topicsFragment.getView()); topicsDialog = new Dialog(this); topicsDialog.setContentView(topicsFragment.getView()); topicsDialog.setTitle(getResources().getText(R.string.topics)); topicsDialog.setCancelable(true); if (!isFinishing()) { try { topicsDialog.show(); } catch (Exception e) { e.printStackTrace(); } } } @Override public void loadExternalURL(String url) { ReaderWebPageFragment readerWebPageFragment = (ReaderWebPageFragment) webPage; readerWebPageFragment.wv.clearView(); readerWebPageFragment.wv.loadUrl(url); readerPager.setCurrentItem(3, true); } @Override public void getPermalink(String permalink) { if (!permalink.equals("")) { if (isShare) { isShare = false; Intent share = new Intent(Intent.ACTION_SEND); share.setType("text/plain"); share.putExtra(Intent.EXTRA_TEXT, permalink); startActivity(Intent.createChooser(share, getResources() .getText(R.string.share_link))); } else { Uri uri = Uri.parse(permalink); if (uri != null) { Intent i = new Intent(Intent.ACTION_VIEW); i.setData(uri); startActivity(i); } } } } @Override public void getLastSelectedItem(final String lastSelectedItem) { final ReaderDetailPageFragment readerPageDetailFragment = (ReaderDetailPageFragment) detailPage; runOnUiThread(new Runnable() { public void run() { String methodCall = "Reader2.show_article_details(" + lastSelectedItem + ")"; if (readerPageDetailFragment.wv != null) { readerPageDetailFragment.wv.loadUrl("javascript:" + methodCall); readerPageDetailFragment.wv .loadUrl("javascript:Reader2.is_next_item();"); readerPageDetailFragment.wv .loadUrl("javascript:Reader2.is_prev_item();"); } } }); } @Override public void onLoadDetail() { final ReaderDetailPageFragment readerPageDetailFragment = (ReaderDetailPageFragment) detailPage; runOnUiThread(new Runnable() { public void run() { readerPageDetailFragment.wv.loadUrl(Constants.readerDetailURL); } }); } public void startAnimatingButton() { shouldAnimateRefreshButton = true; startAnimatingRefreshButton(refreshMenuItem); } public void stopAnimatingButton() { stopAnimatingRefreshButton(refreshMenuItem); } @Override public void onBlogChanged() { super.onBlogChanged(); if (WordPress.currentBlog.isDotcomFlag()) { ReaderImplFragment readerPageFragment = (ReaderImplFragment) readerPage; readerPageFragment.reloadReader(); } } }