package what.whatandroid.forums; import android.content.Intent; import android.os.AsyncTask; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.view.Window; import android.widget.Toast; import java.util.regex.Matcher; import java.util.regex.Pattern; import api.forum.thread.Poll; import api.soup.MySoup; import what.whatandroid.R; import what.whatandroid.announcements.AnnouncementsActivity; import what.whatandroid.barcode.BarcodeActivity; import what.whatandroid.bookmarks.BookmarksActivity; import what.whatandroid.callbacks.AddQuoteCallback; import what.whatandroid.callbacks.OnLoggedInCallback; import what.whatandroid.callbacks.ViewForumCallbacks; import what.whatandroid.callbacks.ViewUserCallbacks; import what.whatandroid.forums.categories.ForumCategoriesFragment; import what.whatandroid.forums.forum.ForumFragment; import what.whatandroid.forums.poll.PollDialog; import what.whatandroid.forums.thread.ThreadFragment; import what.whatandroid.inbox.InboxActivity; import what.whatandroid.login.LoggedInActivity; import what.whatandroid.notifications.NotificationsActivity; import what.whatandroid.profile.ProfileActivity; import what.whatandroid.search.SearchActivity; import what.whatandroid.subscriptions.SubscriptionsActivity; import what.whatandroid.top10.Top10Activity; /** * Activity for viewing the forums */ public class ForumActivity extends LoggedInActivity implements ViewUserCallbacks, ViewForumCallbacks, PollDialog.PollDialogListener, AddQuoteCallback { public static final String FORUM_ID = "what.whatandroid.forums.FORUM_ID", THREAD_ID = "what.whatandroid.forums.THREAD_ID", PAGE = "what.whatandroid.forums.PAGE", POST_ID = "what.whatandroid.forums.POST_ID", CATEGORY_TAG = "what.whatandroid.forums.categoriesfragment"; /** * Matchers to match against forum url links */ private static final Pattern forumId = Pattern.compile(".*forumid=(\\d+).*"), threadId = Pattern.compile(".*threadid=(\\d+).*"), page = Pattern.compile(".*page=(\\d+).*"), postId = Pattern.compile(".*postid=(\\d+).*"); /** * Logged in callback to the fragment being shown so we can let it know * when to start loading */ private OnLoggedInCallback loginListener; @Override protected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.activity_frame); setupNavDrawer(); setTitle(getTitle()); FragmentManager fm = getSupportFragmentManager(); if (savedInstanceState != null){ loginListener = (OnLoggedInCallback)fm.findFragmentById(R.id.container); } else { //Determine what part of the forums we want to view, eg. jump to a post, thread or forum Fragment f; Intent intent = getIntent(); String tag = null; //If we're coming from some link to the forums parse it and return the corresponding fragment if (intent.getScheme() != null && intent.getDataString() != null && intent.getDataString().contains("what.cd")){ f = parseLink(intent.getDataString()); } //Jumping to a post in some thread else if (intent.hasExtra(THREAD_ID) && intent.hasExtra(POST_ID)){ f = ThreadFragment.newInstance(intent.getIntExtra(THREAD_ID, 0), intent.getIntExtra(POST_ID, 0)); } //Jumping to a thread else if (intent.hasExtra(THREAD_ID)){ f = ThreadFragment.newInstance(intent.getIntExtra(THREAD_ID, 0)); } //Jumping to a forum else if (intent.hasExtra(FORUM_ID)){ f = ForumFragment.newInstance(intent.getIntExtra(FORUM_ID, 0)); } //Not jumping anywhere, just going to the regular categories view else { f = new ForumCategoriesFragment(); tag = CATEGORY_TAG; } loginListener = (OnLoggedInCallback)f; fm.beginTransaction().add(R.id.container, f, tag).commit(); } } /** * Parse the forum link url for the appropriate forum fragment to display and return it * Will return the categories view if we can't parse where to go or don't support * it (eg. forum search) */ private Fragment parseLink(String url){ //Handle forum links Matcher m = forumId.matcher(url); if (m.find()){ return ForumFragment.newInstance(Integer.parseInt(m.group(1))); } //Handle thread links m = threadId.matcher(url); if (m.find()){ int thread = Integer.parseInt(m.group(1)); m = postId.matcher(url); //If we're also linking to a post within the thread if (m.find()){ return ThreadFragment.newInstance(thread, Integer.parseInt(m.group(1))); } return ThreadFragment.newInstance(thread); } return new ForumCategoriesFragment(); } @Override public void onBackPressed(){ FragmentManager fm = getSupportFragmentManager(); if (fm.getBackStackEntryCount() > 0){ fm.popBackStackImmediate(); loginListener = (OnLoggedInCallback)fm.findFragmentById(R.id.container); } else { super.onBackPressed(); } } @Override public void onLoggedIn(){ loginListener.onLoggedIn(); } @Override public void viewUser(int id){ Intent intent = new Intent(this, ProfileActivity.class); intent.putExtra(ProfileActivity.USER_ID, id); startActivity(intent); } @Override public void viewForum(int id){ ForumFragment f = ForumFragment.newInstance(id); loginListener = f; getSupportFragmentManager().beginTransaction() .replace(R.id.container, f) .addToBackStack(CATEGORY_TAG) .commit(); } @Override public void viewThread(int id){ ThreadFragment f = ThreadFragment.newInstance(id); loginListener = f; getSupportFragmentManager().beginTransaction() .replace(R.id.container, f) .addToBackStack(null) .commit(); } @Override public void viewThread(int id, int postId){ ThreadFragment f = ThreadFragment.newInstance(id, postId); loginListener = f; getSupportFragmentManager().beginTransaction() .replace(R.id.container, f) .addToBackStack(null) .commit(); } @Override public void makeVote(int thread, int vote){ new PollVoteTask().execute(thread, vote); //Also notify the thread fragment showing that it should update the poll it's caching ThreadFragment fragment = (ThreadFragment)getSupportFragmentManager().findFragmentById(R.id.container); if (fragment != null){ fragment.updatePoll(vote); } } @Override public void quote(String quote){ //Notify the thread fragment about the quote so it can be added to the draft ThreadFragment fragment = (ThreadFragment)getSupportFragmentManager().findFragmentById(R.id.container); if (fragment != null){ fragment.quote(quote); } } @Override public void onNavigationDrawerItemSelected(int position){ if (navDrawer == null){ return; } //Pass an argument to the activity telling it which to show? String selection = navDrawer.getItem(position); if (selection.equalsIgnoreCase(getString(R.string.announcements))){ //Launch AnnouncementsActivity viewing announcements //For now both just return to the announcements view Intent intent = new Intent(this, AnnouncementsActivity.class); intent.putExtra(AnnouncementsActivity.SHOW, AnnouncementsActivity.ANNOUNCEMENTS); startActivity(intent); } else if (selection.equalsIgnoreCase(getString(R.string.blog))){ //Launch AnnouncementsActivity viewing blog posts Intent intent = new Intent(this, AnnouncementsActivity.class); intent.putExtra(AnnouncementsActivity.SHOW, AnnouncementsActivity.BLOGS); startActivity(intent); } else if (selection.equalsIgnoreCase(getString(R.string.profile))){ //Launch profile view activity Intent intent = new Intent(this, ProfileActivity.class); intent.putExtra(ProfileActivity.USER_ID, MySoup.getUserId()); startActivity(intent); } else if (selection.equalsIgnoreCase(getString(R.string.bookmarks))){ Intent intent = new Intent(this, BookmarksActivity.class); startActivity(intent); } else if (selection.contains(getString(R.string.messages))){ Intent intent = new Intent(this, InboxActivity.class); startActivity(intent); } else if (selection.contains(getString(R.string.notifications))){ Intent intent = new Intent(this, NotificationsActivity.class); startActivity(intent); } else if (selection.contains(getString(R.string.subscriptions))){ Intent intent = new Intent(this, SubscriptionsActivity.class); startActivity(intent); } else if (selection.equalsIgnoreCase(getString(R.string.top10))){ Intent intent = new Intent(this, Top10Activity.class); startActivity(intent); } else if (selection.equalsIgnoreCase(getString(R.string.forums))) { //Need to check if the category fragment is in the back stack since we may have come //here through an intent and not through the categories view FragmentManager fm = getSupportFragmentManager(); if (fm.findFragmentByTag(CATEGORY_TAG) != null) { fm.popBackStack(CATEGORY_TAG, FragmentManager.POP_BACK_STACK_INCLUSIVE); } else { ForumCategoriesFragment f = new ForumCategoriesFragment(); loginListener = f; fm.beginTransaction().replace(R.id.container, f, CATEGORY_TAG).commit(); if (MySoup.isLoggedIn()) { loginListener.onLoggedIn(); } } } else if (selection.equalsIgnoreCase(getString(R.string.torrents))){ Intent intent = new Intent(this, SearchActivity.class); intent.putExtra(SearchActivity.SEARCH, SearchActivity.TORRENT); startActivity(intent); } else if (selection.equalsIgnoreCase(getString(R.string.artists))){ Intent intent = new Intent(this, SearchActivity.class); intent.putExtra(SearchActivity.SEARCH, SearchActivity.ARTIST); startActivity(intent); } else if (selection.equalsIgnoreCase(getString(R.string.requests))){ Intent intent = new Intent(this, SearchActivity.class); intent.putExtra(SearchActivity.SEARCH, SearchActivity.REQUEST); startActivity(intent); } else if (selection.equalsIgnoreCase(getString(R.string.users))){ Intent intent = new Intent(this, SearchActivity.class); intent.putExtra(SearchActivity.SEARCH, SearchActivity.USER); startActivity(intent); } else if (selection.equalsIgnoreCase(getString(R.string.barcode_lookup))){ Intent intent = new Intent(this, BarcodeActivity.class); startActivity(intent); } } /** * Makes a vote on a poll in the background, params should be { thread, vote } */ private class PollVoteTask extends AsyncTask<Integer, Void, Boolean> { @Override protected Boolean doInBackground(Integer... params){ return Poll.vote(params[0], params[1]); } @Override protected void onPostExecute(Boolean status){ if (!status){ Toast.makeText(ForumActivity.this, "Could not vote on poll", Toast.LENGTH_LONG).show(); } } } }