package what.whatandroid.torrentgroup;
import android.app.DownloadManager;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.SharedPreferences;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.LoaderManager;
import android.support.v4.content.Loader;
import android.view.Window;
import android.widget.Toast;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import api.soup.MySoup;
import api.torrents.torrents.TorrentGroup;
import what.whatandroid.R;
import what.whatandroid.announcements.AnnouncementsActivity;
import what.whatandroid.artist.ArtistActivity;
import what.whatandroid.barcode.BarcodeActivity;
import what.whatandroid.bookmarks.BookmarksActivity;
import what.whatandroid.callbacks.LoadingListener;
import what.whatandroid.callbacks.ViewArtistCallbacks;
import what.whatandroid.callbacks.ViewTorrentCallbacks;
import what.whatandroid.callbacks.ViewUserCallbacks;
import what.whatandroid.forums.ForumActivity;
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.settings.SettingsActivity;
import what.whatandroid.subscriptions.SubscriptionsActivity;
import what.whatandroid.top10.Top10Activity;
import what.whatandroid.torrentgroup.group.TorrentGroupFragment;
import what.whatandroid.torrentgroup.torrent.TorrentsFragment;
/**
* View information about a torrent group and the torrents in it. Must pass in the intent at least one
* of group id or torrent id within the group to view
*/
public class TorrentGroupActivity extends LoggedInActivity
implements ViewArtistCallbacks, ViewTorrentCallbacks, ViewUserCallbacks, DownloadDialog.DownloadDialogListener,
LoaderManager.LoaderCallbacks<TorrentGroup> {
/**
* Param to pass the torrent group id to be shown
*/
public static final String GROUP_ID = "what.whatandroid.GROUP_ID",
TORRENT_ID = "what.whatandroid.TORRENT_ID";
/**
* For use in viewTorrent to indicate that the group of the torrent is the currently open one
*/
public static final int CURRENT_GROUP = -1;
/**
* The torrent group and comments being viewed the various view fragments get their data from
* the activity using the torrent group callbacks
*/
private int groupId, torrentId;
private LoadingListener<TorrentGroup> loadingListener;
/**
* Patter to match group ids in urls
*/
private static final Pattern groupIdPattern = Pattern.compile(".*id=(\\d+).*"),
torrentIdPattern = Pattern.compile(".*torrentid=(\\d+).*");
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_frame);
setupNavDrawer();
setTitle(getTitle());
//Check if our saved state matches the group we want to view
Intent intent = getIntent();
groupId = intent.getIntExtra(GROUP_ID, -1);
torrentId = intent.getIntExtra(TORRENT_ID, -1);
FragmentManager manager = getSupportFragmentManager();
if (savedInstanceState != null) {
Fragment f = manager.findFragmentById(R.id.container);
loadingListener = (LoadingListener) f;
Bundle args = new Bundle();
args.putInt(GROUP_ID, groupId);
args.putInt(TORRENT_ID, torrentId);
getSupportLoaderManager().initLoader(0, args, this);
} else {
//If we're opening a group url parse out the group id
String site = MySoup.getSite();
if (intent.getScheme() != null && intent.getDataString() != null && intent.getDataString().contains(site)) {
Matcher m = torrentIdPattern.matcher(intent.getDataString());
if (m.find()) {
torrentId = Integer.parseInt(m.group(1));
}
//If no torrent id we're just linking to a normal torrent
else {
m = groupIdPattern.matcher(intent.getDataString());
if (m.find()) {
groupId = Integer.parseInt(m.group(1));
}
}
//If no id at all see if it's a search link maybe?
}
//We always want the group fragment to be accessible, in the case of viewing a specific torrent
//we push it on the back stack so we can go back to it
Fragment f = TorrentGroupFragment.newInstance(groupId);
manager.beginTransaction().add(R.id.container, f).commit();
if (torrentId != -1) {
f = TorrentsFragment.newInstance(torrentId);
getSupportFragmentManager().beginTransaction()
.replace(R.id.container, f)
.addToBackStack(null)
.commit();
}
loadingListener = (LoadingListener) f;
}
}
@Override
public void onLoggedIn() {
Bundle args = new Bundle();
args.putInt(GROUP_ID, groupId);
args.putInt(TORRENT_ID, torrentId);
getSupportLoaderManager().initLoader(0, args, this);
}
@Override
public void onBackPressed() {
FragmentManager fm = getSupportFragmentManager();
if (fm.getBackStackEntryCount() > 0) {
fm.popBackStackImmediate();
//The only fragment we go back to is the MasterFragment
loadingListener = (LoadingListener) fm.findFragmentById(R.id.container);
Bundle args = new Bundle();
args.putInt(GROUP_ID, groupId);
args.putInt(TORRENT_ID, torrentId);
getSupportLoaderManager().initLoader(0, args, this);
} else {
super.onBackPressed();
}
}
@Override
public Loader<TorrentGroup> onCreateLoader(int id, Bundle args) {
setProgressBarIndeterminate(true);
setProgressBarIndeterminateVisibility(true);
return new TorrentGroupAsyncLoader(this, args);
}
@Override
public void onLoadFinished(Loader<TorrentGroup> loader, TorrentGroup data) {
setProgressBarIndeterminateVisibility(false);
if (data == null || !data.getStatus()) {
Toast.makeText(this, "Could not load torrent group", Toast.LENGTH_LONG).show();
} else {
groupId = data.getId();
loadingListener.onLoadingComplete(data);
}
}
@Override
public void onLoaderReset(Loader<TorrentGroup> loader) {
}
@Override
public void viewArtist(int id) {
Intent intent = new Intent(this, ArtistActivity.class);
intent.putExtra(ArtistActivity.ARTIST_ID, id);
startActivity(intent);
}
@Override
public void viewUser(int id) {
Intent intent = new Intent(this, ProfileActivity.class);
intent.putExtra(ProfileActivity.USER_ID, id);
startActivity(intent);
}
@Override
public void viewTorrentGroup(int id) {
}
@Override
public void viewTorrent(int group, int torrent) {
if (group == CURRENT_GROUP) {
TorrentsFragment f = TorrentsFragment.newInstance(torrent);
loadingListener = f;
getSupportFragmentManager().beginTransaction()
.replace(R.id.container, f)
.addToBackStack(null)
.commit();
Bundle args = new Bundle();
args.putInt(GROUP_ID, groupId);
args.putInt(TORRENT_ID, torrentId);
getSupportLoaderManager().initLoader(0, args, this);
}
}
@Override
public void sendToPywa(int torrentId) {
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
String host = preferences.getString(getString(R.string.key_pref_pywhat_host), "");
String port = preferences.getString(getString(R.string.key_pref_pywhat_port), "");
String pass = preferences.getString(getString(R.string.key_pref_pywhat_password), "");
if (host.isEmpty() || port.isEmpty() || pass.isEmpty()) {
Toast.makeText(getApplicationContext(), "Please fill out your PyWA server information",
Toast.LENGTH_LONG).show();
Intent intent = new Intent(this, SettingsActivity.class);
startActivity(intent);
} else {
new SendToPyWA().execute(host, port, pass, Integer.toString(torrentId));
}
}
@Override
public void downloadToPhone(int torrent, String link, String title) {
//Register our listener for downloading torrents to the phone
getApplicationContext().registerReceiver(new DownloadCompleteReceiver(), new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE));
DownloadManager dm = (DownloadManager) getSystemService(DOWNLOAD_SERVICE);
DownloadManager.Request request = new DownloadManager.Request(Uri.parse(link));
request.setTitle(title);
dm.enqueue(request);
}
@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.forums))) {
Intent intent = new Intent(this, ForumActivity.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.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);
}
}
/**
* Async task to instruct the user's PyWA server to download some torrent from the site
* params should be: 0: host, 1: port, 2: PyWA password, 3: torrent id
*/
private class SendToPyWA extends AsyncTask<String, Void, Boolean> {
@Override
protected Boolean doInBackground(String... params) {
String url = params[0] + ":" + params[1] + "/dl.pywa?pass=" + params[2]
+ "&site=whatcd&id=" + params[3];
try {
String result = MySoup.scrapeOther(url);
if (result.contains("success")) {
return true;
}
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
@Override
protected void onPostExecute(Boolean status) {
if (status) {
Toast.makeText(TorrentGroupActivity.this, "Torrent sent", Toast.LENGTH_LONG).show();
} else {
Toast.makeText(TorrentGroupActivity.this, "Failed to send torrent, check PyWA settings",
Toast.LENGTH_SHORT).show();
}
}
}
}