package org.sugr.gearshift.ui;
import android.content.Intent;
import android.content.SharedPreferences;
import android.database.Cursor;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.NavUtils;
import android.support.v7.widget.Toolbar;
import android.text.Html;
import android.text.Spanned;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Toast;
import org.sugr.gearshift.G;
import org.sugr.gearshift.R;
import org.sugr.gearshift.core.TransmissionSession;
import org.sugr.gearshift.service.DataService;
import org.sugr.gearshift.service.DataServiceManager;
import java.util.ArrayList;
import java.util.List;
/**
* An activity representing a single Torrent detail screen. This
* activity is only used on handset devices. On tablet-size devices,
* item details are presented side-by-side with a list of items
* in a {@link TorrentListActivity}.
* <p>
* This activity is mostly just a 'shell' activity containing nothing
* more than a {@link TorrentDetailFragment}.
*/
public class TorrentDetailActivity extends BaseTorrentActivity {
private int currentTorrentPosition = 0;
@Override protected void onCreate(Bundle savedInstanceState) {
Intent in = getIntent();
profile = in.getParcelableExtra(G.ARG_PROFILE);
session = in.getParcelableExtra(G.ARG_SESSION);
setSession(session);
lastServerActivity = in.getLongExtra(G.ARG_LAST_SERVER_ACTIVITY, 0);
if (in.hasExtra(G.ARG_REFRESH_TYPE)) {
setRefreshing(true, in.getStringExtra(G.ARG_REFRESH_TYPE));
}
manager = new DataServiceManager(this, profile)
.setDetails(true).onRestoreInstanceState(savedInstanceState).startUpdating();
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_torrent_detail);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
// Show the Up button in the action bar.
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
currentTorrentPosition = in.getIntExtra(G.ARG_PAGE_POSITION, 0);
if (currentTorrentPosition < 0) {
currentTorrentPosition = 0;
}
if (savedInstanceState == null) {
Bundle arguments = new Bundle();
arguments.putInt(G.ARG_PAGE_POSITION, currentTorrentPosition);
arguments.putBoolean(TorrentDetailFragment.ARG_SHOW_PAGER,
true);
TorrentDetailFragment fragment = new TorrentDetailFragment();
fragment.setArguments(arguments);
getSupportFragmentManager().beginTransaction()
.replace(R.id.torrent_detail_container, fragment, G.DETAIL_FRAGMENT_TAG)
.commit();
}
new SessionTask(this, SessionTask.Flags.START_TORRENT_TASK).execute();
}
@Override public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
this.menu = menu;
getMenuInflater().inflate(R.menu.torrent_detail_activity, menu);
setRefreshing(refreshing, refreshType);
return true;
}
@Override public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
NavUtils.navigateUpTo(this, new Intent(this, TorrentListActivity.class));
overridePendingTransition(android.R.anim.fade_in , R.anim.slide_out_right);
return true;
case R.id.menu_refresh:
manager.update();
setRefreshing(true, DataService.Requests.GET_TORRENTS);
return true;
}
return super.onOptionsItemSelected(item);
}
@Override public void onTrimMemory(int level) {
switch (level) {
case TRIM_MEMORY_RUNNING_LOW:
case TRIM_MEMORY_RUNNING_CRITICAL:
case TRIM_MEMORY_COMPLETE:
break;
default:
return;
}
if (!isFinishing()) {
finish();
Toast.makeText(this, "Low memory", Toast.LENGTH_SHORT).show();
}
}
@Override public void onPageSelected(int position) {
currentTorrentPosition = position;
if (manager != null) {
manager.setTorrentsToUpdate(getCurrentTorrentHashStrings());
}
}
@Override public void onBackPressed() {
super.onBackPressed();
overridePendingTransition(android.R.anim.fade_in , R.anim.slide_out_right);
}
@Override protected boolean handleSuccessServiceBroadcast(String type, Intent intent) {
if (manager == null) {
return false;
}
int flags = TorrentTask.Flags.CONNECTED;
switch (type) {
case DataService.Requests.GET_SESSION:
new SessionTask(TorrentDetailActivity.this, 0).execute();
break;
case DataService.Requests.SET_SESSION:
manager.getSession();
break;
case DataService.Requests.GET_TORRENTS:
boolean added = intent.getBooleanExtra(G.ARG_ADDED, false);
boolean removed = intent.getBooleanExtra(G.ARG_REMOVED, false);
boolean statusChanged = intent.getBooleanExtra(G.ARG_STATUS_CHANGED, false);
boolean incomplete = intent.getBooleanExtra(G.ARG_INCOMPLETE_METADATA, false);
if (added) {
flags |= TorrentTask.Flags.HAS_ADDED;
}
if (removed) {
flags |= TorrentTask.Flags.HAS_REMOVED;
}
if (statusChanged) {
flags |= TorrentTask.Flags.HAS_STATUS_CHANGED;
}
if (incomplete) {
flags |= TorrentTask.Flags.HAS_INCOMPLETE_METADATA;
}
new TorrentTask(TorrentDetailActivity.this, flags).execute();
break;
case DataService.Requests.ADD_TORRENT:
manager.update();
flags |= TorrentTask.Flags.HAS_ADDED | TorrentTask.Flags.HAS_INCOMPLETE_METADATA;
new TorrentTask(TorrentDetailActivity.this, flags).execute();
break;
case DataService.Requests.REMOVE_TORRENT:
manager.update();
flags |= TorrentTask.Flags.HAS_REMOVED;
new TorrentTask(TorrentDetailActivity.this, flags).execute();
break;
case DataService.Requests.SET_TORRENT_LOCATION:
manager.update();
flags |= TorrentTask.Flags.HAS_ADDED | TorrentTask.Flags.HAS_REMOVED;
new TorrentTask(TorrentDetailActivity.this, flags).execute();
break;
case DataService.Requests.SET_TORRENT:
case DataService.Requests.SET_TORRENT_ACTION:
manager.update();
flags |= TorrentTask.Flags.HAS_STATUS_CHANGED;
new TorrentTask(TorrentDetailActivity.this, flags).execute();
break;
}
return true;
}
@Override protected boolean handleErrorServiceBroadcast(String type, int error, Intent intent) {
FragmentManager fm = getSupportFragmentManager();
TorrentDetailFragment fragment =
(TorrentDetailFragment) fm.findFragmentByTag(G.DETAIL_FRAGMENT_TAG);
if (fragment != null) {
fragment.notifyTorrentListChanged(null, error, false, false, false, false, false);
}
return true;
}
@Override protected void onSessionTaskPostExecute(TransmissionSession session) {
}
@Override protected void onTorrentTaskPostExecute(Cursor cursor, boolean added, boolean removed, boolean statusChanged, boolean incompleteMetadata, boolean connected) {
if (cursor.getCount() == 0) {
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(TorrentDetailActivity.this);
Spanned text;
if (prefs.getString(G.PREF_LIST_SEARCH, "").equals("")
&& prefs.getString(G.PREF_LIST_DIRECTORY, "").equals("")
&& prefs.getString(G.PREF_LIST_TRACKER, "").equals("")
&& prefs.getString(G.PREF_LIST_FILTER, G.FilterBy.ALL.name()).equals(G.FilterBy.ALL.name())) {
text = Html.fromHtml(getString(R.string.no_torrents_empty_list));
} else {
text = Html.fromHtml(getString(R.string.no_filtered_torrents_empty_list));
}
Toast.makeText(TorrentDetailActivity.this, text, Toast.LENGTH_SHORT).show();
}
FragmentManager fm = getSupportFragmentManager();
TorrentDetailFragment detail = (TorrentDetailFragment) fm.findFragmentByTag(
G.DETAIL_FRAGMENT_TAG);
if (detail != null) {
detail.notifyTorrentListChanged(cursor, 0, added, removed,
statusChanged, incompleteMetadata, connected);
}
}
private String[] getCurrentTorrentHashStrings() {
TorrentDetailFragment fragment =
(TorrentDetailFragment) getSupportFragmentManager().findFragmentByTag(G.DETAIL_FRAGMENT_TAG);
if (fragment == null) {
return null;
}
int current = currentTorrentPosition;
int offscreen = 1;
int count = offscreen * 2 + 1;
if (current == 0) {
count--;
}
List<String> hashList = new ArrayList<>();
for (int i = 0; i < count; i++) {
int position = current + i - (current == 0 ? 0 : offscreen);
String hash = fragment.getTorrentHashString(position);
if (hash != null) {
hashList.add(hash);
}
}
return hashList.toArray(new String[hashList.size()]);
}
}