You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
236 lines
9.0 KiB
236 lines
9.0 KiB
/* |
|
* Copyright 2010-2018 Eric Kok et al. |
|
* |
|
* Transdroid 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. |
|
* |
|
* Transdroid 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 Transdroid. If not, see <http://www.gnu.org/licenses/>. |
|
*/ |
|
package org.transdroid.core.gui.lists; |
|
|
|
import java.util.ArrayList; |
|
import java.util.List; |
|
|
|
import org.transdroid.R; |
|
import org.transdroid.core.gui.navigation.*; |
|
import org.transdroid.core.gui.lists.PiecesMapView; |
|
import org.transdroid.daemon.Torrent; |
|
import org.transdroid.daemon.TorrentFile; |
|
|
|
import android.content.Context; |
|
import android.text.util.Linkify; |
|
import android.view.View; |
|
import android.view.ViewGroup; |
|
import android.widget.BaseAdapter; |
|
|
|
/** |
|
* List adapter that holds a header view showing torrent details and show the list list contained by the torrent. |
|
* |
|
* @author Eric Kok |
|
*/ |
|
public class DetailsAdapter extends MergeAdapter { |
|
|
|
private ViewHolderAdapter torrentDetailsViewAdapter = null; |
|
private TorrentDetailsView torrentDetailsView = null; |
|
private ViewHolderAdapter piecesSeparatorAdapter = null; |
|
private ViewHolderAdapter piecesMapViewAdapter = null; |
|
private PiecesMapView piecesMapView = null; |
|
private ViewHolderAdapter trackersSeparatorAdapter = null; |
|
private SimpleListItemAdapter trackersAdapter = null; |
|
private ViewHolderAdapter errorsSeparatorAdapter = null; |
|
private SimpleListItemAdapter errorsAdapter = null; |
|
private ViewHolderAdapter torrentFilesSeparatorAdapter = null; |
|
private TorrentFilesAdapter torrentFilesAdapter = null; |
|
|
|
public DetailsAdapter(Context context) { |
|
// Immediately bind the adapters, or the MergeAdapter will not be able to determine the view types and instead |
|
// display nothing at all |
|
|
|
// Torrent details header |
|
torrentDetailsView = TorrentDetailsView_.build(context); |
|
torrentDetailsViewAdapter = new ViewHolderAdapter(torrentDetailsView); |
|
torrentDetailsViewAdapter.setViewEnabled(false); |
|
torrentDetailsViewAdapter.setViewVisibility(View.GONE); |
|
addAdapter(torrentDetailsViewAdapter); |
|
|
|
// Pieces map |
|
piecesSeparatorAdapter = new ViewHolderAdapter(FilterSeparatorView_.build(context).setText( |
|
context.getString(R.string.status_pieces))); |
|
piecesSeparatorAdapter.setViewEnabled(false); |
|
piecesSeparatorAdapter.setViewVisibility(View.GONE); |
|
addAdapter(piecesSeparatorAdapter); |
|
piecesMapView = new PiecesMapView(context); |
|
piecesMapViewAdapter = new ViewHolderAdapter(piecesMapView); |
|
piecesMapViewAdapter.setViewEnabled(false); |
|
piecesMapViewAdapter.setViewVisibility(View.GONE); |
|
addAdapter(piecesMapViewAdapter); |
|
|
|
// Tracker errors |
|
errorsSeparatorAdapter = new ViewHolderAdapter(FilterSeparatorView_.build(context).setText( |
|
context.getString(R.string.status_errors))); |
|
errorsSeparatorAdapter.setViewEnabled(false); |
|
errorsSeparatorAdapter.setViewVisibility(View.GONE); |
|
addAdapter(errorsSeparatorAdapter); |
|
this.errorsAdapter = new SimpleListItemAdapter(context, new ArrayList<SimpleListItem>()); |
|
this.errorsAdapter.setAutoLinkMask(Linkify.WEB_URLS); |
|
addAdapter(errorsAdapter); |
|
|
|
// Trackers |
|
trackersSeparatorAdapter = new ViewHolderAdapter(FilterSeparatorView_.build(context).setText( |
|
context.getString(R.string.status_trackers))); |
|
trackersSeparatorAdapter.setViewEnabled(false); |
|
trackersSeparatorAdapter.setViewVisibility(View.GONE); |
|
addAdapter(trackersSeparatorAdapter); |
|
this.trackersAdapter = new SimpleListItemAdapter(context, new ArrayList<SimpleListItem>()); |
|
addAdapter(trackersAdapter); |
|
|
|
// Torrent files |
|
torrentFilesSeparatorAdapter = new ViewHolderAdapter(FilterSeparatorView_.build(context).setText( |
|
context.getString(R.string.status_files))); |
|
torrentFilesSeparatorAdapter.setViewEnabled(false); |
|
torrentFilesSeparatorAdapter.setViewVisibility(View.GONE); |
|
addAdapter(torrentFilesSeparatorAdapter); |
|
this.torrentFilesAdapter = new TorrentFilesAdapter(context, new ArrayList<TorrentFile>()); |
|
addAdapter(torrentFilesAdapter); |
|
|
|
} |
|
|
|
/** |
|
* Update the torrent data in the details header of this merge adapter |
|
* |
|
* @param torrent The torrent for which detailed data is shown |
|
*/ |
|
public void updateTorrent(Torrent torrent) { |
|
torrentDetailsView.update(torrent); |
|
torrentDetailsViewAdapter.setViewVisibility(torrent == null ? View.GONE : View.VISIBLE); |
|
} |
|
|
|
/** |
|
* Update the list of files contained in this torrent |
|
* |
|
* @param torrentFiles The new list of files, or null if the list and header should be hidden |
|
*/ |
|
public void updateTorrentFiles(List<TorrentFile> torrentFiles) { |
|
if (torrentFiles == null) { |
|
torrentFilesAdapter.update(new ArrayList<TorrentFile>()); |
|
torrentFilesSeparatorAdapter.setViewVisibility(View.GONE); |
|
} else { |
|
torrentFilesAdapter.update(torrentFiles); |
|
torrentFilesSeparatorAdapter.setViewVisibility(View.VISIBLE); |
|
} |
|
} |
|
|
|
/** |
|
* Update the list of trackers |
|
* |
|
* @param trackers The new list of trackers known for this torrent, or null if the list and header should be hidden |
|
*/ |
|
public void updateTrackers(List<? extends SimpleListItem> trackers) { |
|
if (trackers == null || trackers.isEmpty()) { |
|
trackersAdapter.update(new ArrayList<SimpleListItemAdapter.SimpleStringItem>()); |
|
trackersSeparatorAdapter.setViewVisibility(View.GONE); |
|
} else { |
|
trackersAdapter.update(trackers); |
|
trackersSeparatorAdapter.setViewVisibility(View.VISIBLE); |
|
} |
|
} |
|
|
|
/** |
|
* Update the list of errors |
|
* |
|
* @param errors The new list of errors known for this torrent, or null if the list and header should be hidden |
|
*/ |
|
public void updateErrors(List<? extends SimpleListItem> errors) { |
|
if (errors == null || errors.isEmpty()) { |
|
errorsAdapter.update(new ArrayList<SimpleListItemAdapter.SimpleStringItem>()); |
|
errorsSeparatorAdapter.setViewVisibility(View.GONE); |
|
} else { |
|
errorsAdapter.update(errors); |
|
errorsSeparatorAdapter.setViewVisibility(View.VISIBLE); |
|
} |
|
} |
|
|
|
public void updatePieces(List<Integer> pieces) { |
|
if (pieces == null || pieces.isEmpty()) { |
|
piecesSeparatorAdapter.setViewEnabled(false); |
|
piecesSeparatorAdapter.setViewVisibility(View.GONE); |
|
piecesMapViewAdapter.setViewEnabled(false); |
|
piecesMapViewAdapter.setViewVisibility(View.GONE); |
|
} else { |
|
piecesMapView.setPieces(pieces); |
|
|
|
piecesMapViewAdapter.setViewEnabled(true); |
|
piecesMapViewAdapter.setViewVisibility(View.VISIBLE); |
|
piecesSeparatorAdapter.setViewEnabled(true); |
|
piecesSeparatorAdapter.setViewVisibility(View.VISIBLE); |
|
} |
|
} |
|
|
|
/** |
|
* Clear currently visible torrent, including header and shown lists |
|
*/ |
|
public void clear() { |
|
updateTorrent(null); |
|
updateTorrentFiles(null); |
|
updateErrors(null); |
|
updateTrackers(null); |
|
} |
|
|
|
protected static class TorrentFilesAdapter extends BaseAdapter { |
|
|
|
private final Context context; |
|
private List<TorrentFile> items; |
|
|
|
public TorrentFilesAdapter(Context context, List<TorrentFile> items) { |
|
this.context = context; |
|
this.items = items; |
|
} |
|
|
|
/** |
|
* Allows updating of the full data list underlying this adapter, replacing all items |
|
* |
|
* @param newItems The new list of files to display |
|
*/ |
|
public void update(List<TorrentFile> newItems) { |
|
this.items = newItems; |
|
notifyDataSetChanged(); |
|
} |
|
|
|
@Override |
|
public int getCount() { |
|
return items.size(); |
|
} |
|
|
|
@Override |
|
public TorrentFile getItem(int position) { |
|
return items.get(position); |
|
} |
|
|
|
@Override |
|
public long getItemId(int position) { |
|
return position; |
|
} |
|
|
|
@Override |
|
public View getView(int position, View convertView, ViewGroup parent) { |
|
TorrentFileView torrentFileView; |
|
if (convertView == null) { |
|
torrentFileView = TorrentFileView_.build(context); |
|
} else { |
|
torrentFileView = (TorrentFileView) convertView; |
|
} |
|
torrentFileView.bind(getItem(position)); |
|
return torrentFileView; |
|
} |
|
|
|
} |
|
|
|
}
|
|
|