/******************************************************************************* * This file is part of RedReader. * * RedReader 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. * * RedReader 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 RedReader. If not, see <http://www.gnu.org/licenses/>. ******************************************************************************/ package org.quantumbadger.redreader.activities; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.support.annotation.Nullable; import android.util.Log; import android.view.Menu; import android.view.MenuItem; import android.view.View; import org.quantumbadger.redreader.R; import org.quantumbadger.redreader.account.RedditAccountChangeListener; import org.quantumbadger.redreader.account.RedditAccountManager; import org.quantumbadger.redreader.common.DialogUtils; import org.quantumbadger.redreader.common.General; import org.quantumbadger.redreader.common.LinkHandler; import org.quantumbadger.redreader.common.PrefsUtility; import org.quantumbadger.redreader.fragments.CommentListingFragment; import org.quantumbadger.redreader.fragments.SessionListDialog; import org.quantumbadger.redreader.listingcontrollers.CommentListingController; import org.quantumbadger.redreader.reddit.prepared.RedditPreparedPost; import org.quantumbadger.redreader.reddit.url.PostCommentListingURL; import org.quantumbadger.redreader.reddit.url.RedditURLParser; import org.quantumbadger.redreader.reddit.url.UserCommentListingURL; import org.quantumbadger.redreader.views.RedditPostView; import java.util.UUID; public class CommentListingActivity extends RefreshableActivity implements RedditAccountChangeListener, OptionsMenuUtility.OptionsMenuCommentsListener, RedditPostView.PostSelectionListener, SessionChangeListener { private static final String TAG = "CommentListingActivity"; public static final String EXTRA_SEARCH_STRING = "cla_search_string"; private static final String SAVEDSTATE_SESSION = "cla_session"; private static final String SAVEDSTATE_SORT = "cla_sort"; private static final String SAVEDSTATE_FRAGMENT = "cla_fragment"; private CommentListingController controller; private CommentListingFragment mFragment; public void onCreate(final Bundle savedInstanceState) { PrefsUtility.applyTheme(this); super.onCreate(savedInstanceState); setTitle(getString(R.string.app_name)); RedditAccountManager.getInstance(this).addUpdateListener(this); if(getIntent() != null) { final Intent intent = getIntent(); final String url = intent.getDataString(); final String searchString = intent.getStringExtra(EXTRA_SEARCH_STRING); controller = new CommentListingController(RedditURLParser.parseProbableCommentListing(Uri.parse(url)), this); controller.setSearchString(searchString); Bundle fragmentSavedInstanceState = null; if(savedInstanceState != null) { if(savedInstanceState.containsKey(SAVEDSTATE_SESSION)) { controller.setSession(UUID.fromString(savedInstanceState.getString(SAVEDSTATE_SESSION))); } if(savedInstanceState.containsKey(SAVEDSTATE_SORT)) { controller.setSort(PostCommentListingURL.Sort.valueOf( savedInstanceState.getString(SAVEDSTATE_SORT))); } if(savedInstanceState.containsKey(SAVEDSTATE_FRAGMENT)) { fragmentSavedInstanceState = savedInstanceState.getBundle(SAVEDSTATE_FRAGMENT); } } doRefresh(RefreshableFragment.COMMENTS, false, fragmentSavedInstanceState); } else { throw new RuntimeException("Nothing to show!"); } } @Override protected void onSaveInstanceState(final Bundle outState) { super.onSaveInstanceState(outState); final UUID session = controller.getSession(); if(session != null) { outState.putString(SAVEDSTATE_SESSION, session.toString()); } final PostCommentListingURL.Sort sort = controller.getSort(); if(sort != null) { outState.putString(SAVEDSTATE_SORT, sort.name()); } if(mFragment != null) { outState.putBundle(SAVEDSTATE_FRAGMENT, mFragment.onSaveInstanceState()); } } @Override public boolean onCreateOptionsMenu(final Menu menu) { OptionsMenuUtility.prepare( this, menu, false, false, true, false, false, controller.isUserCommentListing(), false, controller.isSortable(), null, false, true, null, null); if(mFragment != null) { mFragment.onCreateOptionsMenu(menu); } return true; } public void onRedditAccountChanged() { requestRefresh(RefreshableFragment.ALL, false); } @Override protected void doRefresh(final RefreshableFragment which, final boolean force, final Bundle savedInstanceState) { mFragment = controller.get(this, force, savedInstanceState); final View view = mFragment.getView(); setBaseActivityContentView(view); General.setLayoutMatchParent(view); setTitle(controller.getCommentListingUrl().humanReadableName(this, false)); invalidateOptionsMenu(); } public void onRefreshComments() { controller.setSession(null); requestRefresh(RefreshableFragment.COMMENTS, true); } public void onPastComments() { final SessionListDialog sessionListDialog = SessionListDialog.newInstance(controller.getUri(), controller.getSession(), SessionChangeListener.SessionChangeType.COMMENTS); sessionListDialog.show(getSupportFragmentManager(), null); } public void onSortSelected(final PostCommentListingURL.Sort order) { controller.setSort(order); requestRefresh(RefreshableFragment.COMMENTS, false); } public void onSortSelected(final UserCommentListingURL.Sort order) { controller.setSort(order); requestRefresh(RefreshableFragment.COMMENTS, false); } @Override public void onSearchComments() { DialogUtils.showSearchDialog(this, new DialogUtils.OnSearchListener() { @Override public void onSearch(@Nullable String query) { Intent searchIntent = getIntent(); searchIntent.putExtra(EXTRA_SEARCH_STRING, query); startActivity(searchIntent); } }); } @Override public boolean onOptionsItemSelected(final MenuItem item) { if(mFragment != null) { if(mFragment.onOptionsItemSelected(item)) { return true; } } return super.onOptionsItemSelected(item); } public void onSessionRefreshSelected(SessionChangeType type) { onRefreshComments(); } public void onSessionSelected(UUID session, SessionChangeType type) { controller.setSession(session); requestRefresh(RefreshableFragment.COMMENTS, false); } public void onSessionChanged(UUID session, SessionChangeType type, long timestamp) { Log.i(TAG, type.name() + " session changed to " + (session != null ? session.toString() : "<null>")); controller.setSession(session); } public void onPostSelected(final RedditPreparedPost post) { LinkHandler.onLinkClicked(this, post.src.getUrl(), false, post.src.getSrc()); } public void onPostCommentsSelected(final RedditPreparedPost post) { LinkHandler.onLinkClicked(this, PostCommentListingURL.forPostId(post.src.getIdAlone()).toString(), false); } @Override public void onBackPressed() { if(General.onBackPressed()) super.onBackPressed(); } }