1
0
mirror of https://framagit.org/tom79/fedilab-tube synced 2025-04-15 19:07:21 +02:00

Add torrent

This commit is contained in:
Thomas 2020-11-06 17:32:12 +01:00
parent 4457259dfd
commit c8fc98ee71
11 changed files with 155 additions and 107 deletions

View File

@ -97,7 +97,7 @@ dependencies {
implementation 'androidx.appcompat:appcompat:1.2.0' implementation 'androidx.appcompat:appcompat:1.2.0'
implementation 'androidx.preference:preference:1.1.1' implementation 'androidx.preference:preference:1.1.1'
implementation 'com.google.android.material:material:1.2.1' implementation 'com.google.android.material:material:1.2.1'
implementation 'androidx.constraintlayout:constraintlayout:2.0.3' implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
implementation 'androidx.vectordrawable:vectordrawable:1.1.0' implementation 'androidx.vectordrawable:vectordrawable:1.1.0'
implementation 'androidx.navigation:navigation-fragment:2.3.1' implementation 'androidx.navigation:navigation-fragment:2.3.1'
implementation "androidx.fragment:fragment:1.2.5" implementation "androidx.fragment:fragment:1.2.5"
@ -127,6 +127,8 @@ dependencies {
implementation 'com.squareup.retrofit2:converter-gson:2.9.0' implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
implementation 'com.github.mancj:MaterialSearchBar:0.8.5' implementation 'com.github.mancj:MaterialSearchBar:0.8.5'
implementation "com.github.TorrentStream:TorrentStream-Android:2.7.0"
implementation "io.github.kobakei:ratethisapp:1.2.0" implementation "io.github.kobakei:ratethisapp:1.2.0"
implementation 'com.github.HITGIF:TextFieldBoxes:1.4.5' implementation 'com.github.HITGIF:TextFieldBoxes:1.4.5'
implementation 'com.github.vkay94:DoubleTapPlayerView:1.0.0' implementation 'com.github.vkay94:DoubleTapPlayerView:1.0.0'

View File

@ -271,8 +271,9 @@
<string name="report_account">Signaler le compte</string> <string name="report_account">Signaler le compte</string>
<string-array name="settings_video_mode"> <string-array name="settings_video_mode">
<item>Normal</item> <item>Normal</item>
<item>Streaming</item> <item>Navigateur</item>
<item>Flux direct</item> <item>Magnet</item>
<item>Torrent</item>
</string-array> </string-array>
<string-array name="settings_video_quality"> <string-array name="settings_video_quality">
<item>Élevée</item> <item>Élevée</item>

View File

@ -305,7 +305,8 @@
<string-array name="settings_video_mode"> <string-array name="settings_video_mode">
<item>Normal</item> <item>Normal</item>
<item>Webview</item> <item>Webview</item>
<item>Direct stream</item> <item>Magnet</item>
<item>Torrent</item>
</string-array> </string-array>

View File

@ -214,6 +214,8 @@ public class MainActivity extends AppCompatActivity {
if (token == null && Helper.instanceOnline(instance)) { if (token == null && Helper.instanceOnline(instance)) {
runOnUiThread(() -> Helper.logoutCurrentUser(MainActivity.this, finalAccount)); runOnUiThread(() -> Helper.logoutCurrentUser(MainActivity.this, finalAccount));
return; return;
}else if(token == null) {
return;
} }
runOnUiThread(() -> { runOnUiThread(() -> {
//To avoid a token issue with subscriptions, adding fragment is done when the token is refreshed. //To avoid a token issue with subscriptions, adding fragment is done when the token is refreshed.

View File

@ -66,6 +66,11 @@ import androidx.lifecycle.ViewModelProvider;
import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
import com.github.se_bastiaan.torrentstream.StreamStatus;
import com.github.se_bastiaan.torrentstream.Torrent;
import com.github.se_bastiaan.torrentstream.TorrentOptions;
import com.github.se_bastiaan.torrentstream.TorrentStream;
import com.github.se_bastiaan.torrentstream.listeners.TorrentListener;
import com.github.vkay94.dtpv.youtube.YouTubeOverlay; import com.github.vkay94.dtpv.youtube.YouTubeOverlay;
import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.C;
import com.google.android.exoplayer2.ExoPlaybackException; import com.google.android.exoplayer2.ExoPlaybackException;
@ -74,7 +79,6 @@ import com.google.android.exoplayer2.MediaItem;
import com.google.android.exoplayer2.Player; import com.google.android.exoplayer2.Player;
import com.google.android.exoplayer2.SimpleExoPlayer; import com.google.android.exoplayer2.SimpleExoPlayer;
import com.google.android.exoplayer2.ext.mediasession.MediaSessionConnector; import com.google.android.exoplayer2.ext.mediasession.MediaSessionConnector;
import com.google.android.exoplayer2.source.MediaSource;
import com.google.android.exoplayer2.source.MergingMediaSource; import com.google.android.exoplayer2.source.MergingMediaSource;
import com.google.android.exoplayer2.source.ProgressiveMediaSource; import com.google.android.exoplayer2.source.ProgressiveMediaSource;
import com.google.android.exoplayer2.source.SingleSampleMediaSource; import com.google.android.exoplayer2.source.SingleSampleMediaSource;
@ -142,7 +146,7 @@ import static app.fedilab.fedilabtube.helper.Helper.isLoggedIn;
import static com.google.android.exoplayer2.Player.MEDIA_ITEM_TRANSITION_REASON_AUTO; import static com.google.android.exoplayer2.Player.MEDIA_ITEM_TRANSITION_REASON_AUTO;
public class PeertubeActivity extends AppCompatActivity implements CommentListAdapter.AllCommentRemoved, Player.EventListener, VideoListener { public class PeertubeActivity extends AppCompatActivity implements CommentListAdapter.AllCommentRemoved, Player.EventListener, VideoListener, TorrentListener {
public static String video_id; public static String video_id;
private String peertubeInstance, videoUuid; private String peertubeInstance, videoUuid;
@ -171,6 +175,7 @@ public class PeertubeActivity extends AppCompatActivity implements CommentListAd
private Intent urlIntent; private Intent urlIntent;
public static List<String> playedVideos = new ArrayList<>(); public static List<String> playedVideos = new ArrayList<>();
private VideoData.Video nextVideo; private VideoData.Video nextVideo;
private TorrentStream torrentStream;
@Override @Override
public void onVideoSizeChanged(int width, int height, int unappliedRotationDegrees, float pixelWidthHeightRatio) { public void onVideoSizeChanged(int width, int height, int unappliedRotationDegrees, float pixelWidthHeightRatio) {
@ -181,6 +186,32 @@ public class PeertubeActivity extends AppCompatActivity implements CommentListAd
} }
} }
@Override
public void onStreamPrepared(Torrent torrent) {
torrent.startDownload();
}
@Override
public void onStreamStarted(Torrent torrent) {
startStream(torrent.getVideoFile().getAbsolutePath(), null, autoPlay, -1, null, null);
}
@Override
public void onStreamError(Torrent torrent, Exception e) {
e.printStackTrace();
}
@Override
public void onStreamReady(Torrent torrent) {
}
@Override
public void onStreamProgress(Torrent torrent, StreamStatus status) {
}
@Override
public void onStreamStopped() {}
enum videoOrientation { enum videoOrientation {
LANDSCAPE, LANDSCAPE,
PORTRAIT PORTRAIT
@ -217,6 +248,14 @@ public class PeertubeActivity extends AppCompatActivity implements CommentListAd
Helper.loadGiF(PeertubeActivity.this, account.getAvatar() != null ? account.getAvatar().getPath() : null, binding.myPpReply); Helper.loadGiF(PeertubeActivity.this, account.getAvatar() != null ? account.getAvatar().getPath() : null, binding.myPpReply);
} }
TorrentOptions torrentOptions = new TorrentOptions.Builder()
.saveLocation(getCacheDir())
.autoDownload(true)
.removeFilesAfterStop(true)
.build();
torrentStream = TorrentStream.init(torrentOptions);
torrentStream.addListener(PeertubeActivity.this);
if (Helper.isTablet(PeertubeActivity.this)) { if (Helper.isTablet(PeertubeActivity.this)) {
@ -776,35 +815,16 @@ public class PeertubeActivity extends AppCompatActivity implements CommentListAd
if (mode == Helper.VIDEO_MODE_NORMAL) { if (mode == Helper.VIDEO_MODE_NORMAL) {
int video_cache = sharedpreferences.getInt(Helper.SET_VIDEO_CACHE, Helper.DEFAULT_VIDEO_CACHE_MB);
ProgressiveMediaSource videoSource;
player = new SimpleExoPlayer.Builder(PeertubeActivity.this).build(); player = new SimpleExoPlayer.Builder(PeertubeActivity.this).build();
player.addVideoListener(PeertubeActivity.this); player.addVideoListener(PeertubeActivity.this);
player.addListener(this); player.addListener(this);
binding.mediaVideo.player(player); binding.mediaVideo.player(player);
binding.doubleTapPlayerView.setPlayer(player); binding.doubleTapPlayerView.setPlayer(player);
binding.loader.setVisibility(View.GONE); binding.loader.setVisibility(View.GONE);
startStream(
if (apiResponse.getPeertubes().get(0).getFiles() != null && apiResponse.getPeertubes().get(0).getFiles().size() > 0) { apiResponse.getPeertubes().get(0).getFileUrl(null, PeertubeActivity.this),
if (video_cache == 0) { apiResponse.getPeertubes().get(0).getStreamingPlaylists().size()>0?apiResponse.getPeertubes().get(0).getStreamingPlaylists().get(0).getPlaylistUrl():null,
DataSource.Factory dataSourceFactory = new DefaultDataSourceFactory(PeertubeActivity.this, autoPlay,-1, null, null);
Util.getUserAgent(PeertubeActivity.this, null), null);
MediaItem mediaItem = new MediaItem.Builder().setUri(Uri.parse(apiResponse.getPeertubes().get(0).getFileUrl(null, PeertubeActivity.this))).build();
videoSource = new ProgressiveMediaSource.Factory(dataSourceFactory).createMediaSource(mediaItem);
} else {
CacheDataSourceFactory cacheDataSourceFactory = new CacheDataSourceFactory(PeertubeActivity.this);
MediaItem mediaItem = new MediaItem.Builder().setUri(Uri.parse(apiResponse.getPeertubes().get(0).getFileUrl(null, PeertubeActivity.this))).build();
videoSource = new ProgressiveMediaSource.Factory(cacheDataSourceFactory)
.createMediaSource(mediaItem);
}
player.setMediaSource(videoSource);
} else {
MediaItem mediaItem = new MediaItem.Builder().setUri(Uri.parse(apiResponse.getPeertubes().get(0).getStreamingPlaylists().get(0).getPlaylistUrl())).build();
HlsMediaSource hlsMediaSource = new HlsMediaSource.Factory(new DefaultHttpDataSourceFactory(System.getProperty("http.agent")))
.createMediaSource(mediaItem);
player.setMediaSource(hlsMediaSource);
}
player.prepare(); player.prepare();
player.setPlayWhenReady(autoPlay); player.setPlayWhenReady(autoPlay);
} }
@ -900,9 +920,6 @@ public class PeertubeActivity extends AppCompatActivity implements CommentListAd
uri = Uri.parse("https://" + peertubeInstance + captions.get(which - 1).getCaptionPath()); uri = Uri.parse("https://" + peertubeInstance + captions.get(which - 1).getCaptionPath());
} }
} }
int video_cache = sharedpreferences.getInt(Helper.SET_VIDEO_CACHE, Helper.DEFAULT_VIDEO_CACHE_MB);
long position = player.getCurrentPosition(); long position = player.getCurrentPosition();
if (player != null) if (player != null)
@ -911,43 +928,15 @@ public class PeertubeActivity extends AppCompatActivity implements CommentListAd
TrackSelector trackSelector = new DefaultTrackSelector(PeertubeActivity.this, new AdaptiveTrackSelection.Factory()); TrackSelector trackSelector = new DefaultTrackSelector(PeertubeActivity.this, new AdaptiveTrackSelection.Factory());
player = new SimpleExoPlayer.Builder(PeertubeActivity.this).setTrackSelector(trackSelector).build(); player = new SimpleExoPlayer.Builder(PeertubeActivity.this).setTrackSelector(trackSelector).build();
binding.mediaVideo.player(player); binding.mediaVideo.player(player);
ProgressiveMediaSource videoSource; binding.doubleTapPlayerView.setPlayer(player);
MediaSource subtitleSource = null; startStream(
if (apiResponse.getPeertubes().get(0).getFiles() != null && apiResponse.getPeertubes().get(0).getFiles().size() > 0) { apiResponse.getPeertubes().get(0).getFileUrl(null, PeertubeActivity.this),
if (video_cache == 0) { null,
DataSource.Factory dataSourceFactory = new DefaultDataSourceFactory(PeertubeActivity.this, true,
Util.getUserAgent(PeertubeActivity.this, null), null); position,
MediaItem mediaItem = new MediaItem.Builder().setUri(Uri.parse(apiResponse.getPeertubes().get(0).getFileUrl(null, PeertubeActivity.this))).build(); uri,
videoSource = new ProgressiveMediaSource.Factory(dataSourceFactory) itemsKeyLanguage[which]
.createMediaSource(mediaItem); );
if (uri != null) {
MediaItem.Subtitle mediaSubtitle = new MediaItem.Subtitle(uri, MimeTypes.TEXT_VTT, itemsKeyLanguage[which]);
subtitleSource = new SingleSampleMediaSource.Factory(dataSourceFactory).createMediaSource(mediaSubtitle, C.TIME_UNSET);
}
} else {
CacheDataSourceFactory cacheDataSourceFactory = new CacheDataSourceFactory(PeertubeActivity.this);
MediaItem mediaItem = new MediaItem.Builder().setUri(Uri.parse(apiResponse.getPeertubes().get(0).getFileUrl(null, PeertubeActivity.this))).build();
videoSource = new ProgressiveMediaSource.Factory(cacheDataSourceFactory)
.createMediaSource(mediaItem);
if (uri != null) {
MediaItem.Subtitle mediaSubtitle = new MediaItem.Subtitle(uri, MimeTypes.TEXT_VTT, itemsKeyLanguage[which], Format.NO_VALUE);
subtitleSource = new SingleSampleMediaSource.Factory(cacheDataSourceFactory).createMediaSource(mediaSubtitle, C.TIME_UNSET);
}
}
binding.doubleTapPlayerView.setPlayer(player);
if (which > 0 && subtitleSource != null) {
MergingMediaSource mergedSource =
new MergingMediaSource(videoSource, subtitleSource);
player.setMediaSource(mergedSource);
}
player.prepare();
player.seekTo(0, position);
player.setPlayWhenReady(true);
}
dialog.dismiss(); dialog.dismiss();
}); });
@ -977,8 +966,59 @@ public class PeertubeActivity extends AppCompatActivity implements CommentListAd
}); });
popup.show(); popup.show();
}); });
}
private void startStream(String videoURL, String streamingPlaylistsURLS, boolean autoPlay, long position, Uri subtitles, String lang) {
if (videoURL != null) {
if( videoURL.endsWith(".torrent")) {
torrentStream.startStream(videoURL);
return;
}else {
SharedPreferences sharedpreferences = getSharedPreferences(Helper.APP_PREFS, MODE_PRIVATE);
int video_cache = sharedpreferences.getInt(Helper.SET_VIDEO_CACHE, Helper.DEFAULT_VIDEO_CACHE_MB);
ProgressiveMediaSource videoSource;
SingleSampleMediaSource subtitleSource = null;
if (video_cache == 0) {
DataSource.Factory dataSourceFactory = new DefaultDataSourceFactory(PeertubeActivity.this,
Util.getUserAgent(PeertubeActivity.this, null), null);
if (subtitles != null) {
MediaItem.Subtitle mediaSubtitle = new MediaItem.Subtitle(subtitles, MimeTypes.TEXT_VTT, lang);
subtitleSource = new SingleSampleMediaSource.Factory(dataSourceFactory).createMediaSource(mediaSubtitle, C.TIME_UNSET);
}
MediaItem mediaItem = new MediaItem.Builder().setUri(videoURL).build();
videoSource = new ProgressiveMediaSource.Factory(dataSourceFactory).createMediaSource(mediaItem);
} else {
CacheDataSourceFactory cacheDataSourceFactory = new CacheDataSourceFactory(PeertubeActivity.this);
MediaItem mediaItem = new MediaItem.Builder().setUri(videoURL).build();
videoSource = new ProgressiveMediaSource.Factory(cacheDataSourceFactory)
.createMediaSource(mediaItem);
if (subtitles != null) {
MediaItem.Subtitle mediaSubtitle = new MediaItem.Subtitle(subtitles, MimeTypes.TEXT_VTT, lang, Format.NO_VALUE);
subtitleSource = new SingleSampleMediaSource.Factory(cacheDataSourceFactory).createMediaSource(mediaSubtitle, C.TIME_UNSET);
}
}
if (lang != null && subtitleSource != null) {
MergingMediaSource mergedSource =
new MergingMediaSource(videoSource, subtitleSource);
player.setMediaSource(mergedSource);
}else {
player.setMediaSource(videoSource);
}
}
} else {
MediaItem mediaItem = new MediaItem.Builder().setUri(Uri.parse(streamingPlaylistsURLS)).build();
HlsMediaSource hlsMediaSource = new HlsMediaSource.Factory(new DefaultHttpDataSourceFactory(System.getProperty("http.agent")))
.createMediaSource(mediaItem);
player.setMediaSource(hlsMediaSource);
}
player.prepare();
if( position > 0) {
player.seekTo(0, position);
}
player.setPlayWhenReady(autoPlay);
} }
@Override @Override
@ -1006,6 +1046,9 @@ public class PeertubeActivity extends AppCompatActivity implements CommentListAd
if (player != null) { if (player != null) {
player.release(); player.release();
} }
if( torrentStream != null && torrentStream.isStreaming()) {
torrentStream.stopStream();
}
unregisterReceiver(); unregisterReceiver();
if (fullScreenDialog != null && fullScreenDialog.isShowing()) { if (fullScreenDialog != null && fullScreenDialog.isShowing()) {
fullScreenDialog.dismiss(); fullScreenDialog.dismiss();
@ -1129,8 +1172,6 @@ public class PeertubeActivity extends AppCompatActivity implements CommentListAd
public void displayResolution() { public void displayResolution() {
SharedPreferences sharedpreferences = getSharedPreferences(Helper.APP_PREFS, MODE_PRIVATE);
AlertDialog.Builder builderSingle = new AlertDialog.Builder(PeertubeActivity.this); AlertDialog.Builder builderSingle = new AlertDialog.Builder(PeertubeActivity.this);
builderSingle.setTitle(R.string.pickup_resolution); builderSingle.setTitle(R.string.pickup_resolution);
final ArrayAdapter<String> arrayAdapter = new ArrayAdapter<>(PeertubeActivity.this, android.R.layout.select_dialog_item); final ArrayAdapter<String> arrayAdapter = new ArrayAdapter<>(PeertubeActivity.this, android.R.layout.select_dialog_item);
@ -1157,24 +1198,10 @@ public class PeertubeActivity extends AppCompatActivity implements CommentListAd
binding.mediaVideo.player(player); binding.mediaVideo.player(player);
binding.doubleTapPlayerView.setPlayer(player); binding.doubleTapPlayerView.setPlayer(player);
binding.loader.setVisibility(View.GONE); binding.loader.setVisibility(View.GONE);
int video_cache = sharedpreferences.getInt(Helper.SET_VIDEO_CACHE, Helper.DEFAULT_VIDEO_CACHE_MB); startStream(
ProgressiveMediaSource videoSource; peertube.getFileUrl(res, PeertubeActivity.this),
if (video_cache == 0) { peertube.getStreamingPlaylists().size()>0?peertube.getStreamingPlaylists().get(0).getPlaylistUrl():null,
DataSource.Factory dataSourceFactory = new DefaultDataSourceFactory(PeertubeActivity.this, true, position, null, null);
Util.getUserAgent(PeertubeActivity.this, null), null);
MediaItem mediaItem = new MediaItem.Builder().setUri(Uri.parse(peertube.getFileUrl(res, PeertubeActivity.this))).build();
videoSource = new ProgressiveMediaSource.Factory(dataSourceFactory)
.createMediaSource(mediaItem);
} else {
CacheDataSourceFactory cacheDataSourceFactory = new CacheDataSourceFactory(PeertubeActivity.this);
MediaItem mediaItem = new MediaItem.Builder().setUri(Uri.parse(peertube.getFileUrl(res, PeertubeActivity.this))).build();
videoSource = new ProgressiveMediaSource.Factory(cacheDataSourceFactory)
.createMediaSource(mediaItem);
}
player.setMediaSource(videoSource);
player.prepare();
player.seekTo(0, position);
player.setPlayWhenReady(true);
} }
}); });
@ -1483,6 +1510,8 @@ public class PeertubeActivity extends AppCompatActivity implements CommentListAd
} }
} }
private void updateHistory(long position) { private void updateHistory(long position) {
SharedPreferences sharedpreferences = getSharedPreferences(Helper.APP_PREFS, MODE_PRIVATE); SharedPreferences sharedpreferences = getSharedPreferences(Helper.APP_PREFS, MODE_PRIVATE);
boolean storeInHistory = sharedpreferences.getBoolean(getString(R.string.set_store_in_history), true); boolean storeInHistory = sharedpreferences.getBoolean(getString(R.string.set_store_in_history), true);

View File

@ -54,7 +54,6 @@ import app.fedilab.fedilabtube.client.entities.AccountCreation;
import app.fedilab.fedilabtube.client.entities.ChannelParams; import app.fedilab.fedilabtube.client.entities.ChannelParams;
import app.fedilab.fedilabtube.client.entities.Error; import app.fedilab.fedilabtube.client.entities.Error;
import app.fedilab.fedilabtube.client.entities.InstanceParams; import app.fedilab.fedilabtube.client.entities.InstanceParams;
import app.fedilab.fedilabtube.client.entities.NotificationSettings;
import app.fedilab.fedilabtube.client.entities.Oauth; import app.fedilab.fedilabtube.client.entities.Oauth;
import app.fedilab.fedilabtube.client.entities.OauthParams; import app.fedilab.fedilabtube.client.entities.OauthParams;
import app.fedilab.fedilabtube.client.entities.OverviewVideo; import app.fedilab.fedilabtube.client.entities.OverviewVideo;

View File

@ -186,27 +186,29 @@ public class VideoData {
public String getFileUrl(String resolution, Context context) { public String getFileUrl(String resolution, Context context) {
SharedPreferences sharedpreferences = context.getSharedPreferences(Helper.APP_PREFS, Context.MODE_PRIVATE); SharedPreferences sharedpreferences = context.getSharedPreferences(Helper.APP_PREFS, Context.MODE_PRIVATE);
boolean streamService = sharedpreferences.getInt(Helper.SET_VIDEO_MODE, Helper.VIDEO_MODE_NORMAL) == Helper.VIDEO_MODE_STREAMING; int mode = sharedpreferences.getInt(Helper.SET_VIDEO_MODE, Helper.VIDEO_MODE_NORMAL);
if (files != null && files.size() > 0) { if (files != null && files.size() > 0) {
if (resolution != null) { if (resolution != null) {
for (File file : files) { for (File file : files) {
if (file.getResolutions().getLabel().compareTo(resolution) == 0) { if (file.getResolutions().getLabel().compareTo(resolution) == 0) {
if (streamService) { if (mode == Helper.VIDEO_MODE_MAGNET) {
return file.getMagnetUri(); return file.getMagnetUri();
} else { } else if (mode == Helper.VIDEO_MODE_TORRENT) {
return file.getTorrentUrl();
}else {
return file.getFileUrl(); return file.getFileUrl();
} }
} }
} }
} }
File file = Helper.defaultFile(context, files); File file = Helper.defaultFile(context, files);
if (file != null) { if (file != null) {
if (streamService) { if (mode == Helper.VIDEO_MODE_MAGNET) {
return file.getMagnetUri(); return file.getMagnetUri();
} else if (mode == Helper.VIDEO_MODE_TORRENT) {
return file.getTorrentUrl();
} else { } else {
return file.getFileUrl(); return file.getFileUrl();
} }
} else { } else {
return null; return null;

View File

@ -96,11 +96,14 @@ public class SettingsFragment extends PreferenceFragmentCompat implements Shared
editor.putInt(Helper.SET_VIDEO_MODE, Helper.VIDEO_MODE_NORMAL); editor.putInt(Helper.SET_VIDEO_MODE, Helper.VIDEO_MODE_NORMAL);
break; break;
case "1": case "1":
editor.putInt(Helper.SET_VIDEO_MODE, Helper.VIDEO_MODE_STREAMING); editor.putInt(Helper.SET_VIDEO_MODE, Helper.VIDEO_MODE_MAGNET);
break; break;
case "2": case "2":
editor.putInt(Helper.SET_VIDEO_MODE, Helper.VIDEO_MODE_WEBVIEW); editor.putInt(Helper.SET_VIDEO_MODE, Helper.VIDEO_MODE_WEBVIEW);
break; break;
case "3":
editor.putInt(Helper.SET_VIDEO_MODE, Helper.VIDEO_MODE_TORRENT);
break;
} }
} }
@ -232,6 +235,7 @@ public class SettingsFragment extends PreferenceFragmentCompat implements Shared
//****** My Account ****** //****** My Account ******
Preference my_account = findPreference("my_account"); Preference my_account = findPreference("my_account");
assert my_account != null;
if(!Helper.isLoggedIn(getActivity()) || userMe == null) { if(!Helper.isLoggedIn(getActivity()) || userMe == null) {
my_account.setVisible(false); my_account.setVisible(false);
} else { } else {
@ -276,11 +280,12 @@ public class SettingsFragment extends PreferenceFragmentCompat implements Shared
ListPreference set_video_mode_choice = findPreference(getString(R.string.set_video_mode_choice)); ListPreference set_video_mode_choice = findPreference(getString(R.string.set_video_mode_choice));
List<String> array = Arrays.asList(getResources().getStringArray(R.array.settings_video_mode)); List<String> array = Arrays.asList(getResources().getStringArray(R.array.settings_video_mode));
CharSequence[] entries = array.toArray(new CharSequence[0]); CharSequence[] entries = array.toArray(new CharSequence[0]);
CharSequence[] entryValues = new CharSequence[3]; CharSequence[] entryValues = new CharSequence[4];
int video_mode = sharedpref.getInt(Helper.SET_VIDEO_MODE, Helper.VIDEO_MODE_NORMAL); int video_mode = sharedpref.getInt(Helper.SET_VIDEO_MODE, Helper.VIDEO_MODE_NORMAL);
entryValues[0] = String.valueOf(Helper.VIDEO_MODE_NORMAL); entryValues[0] = String.valueOf(Helper.VIDEO_MODE_NORMAL);
entryValues[1] = String.valueOf(Helper.VIDEO_MODE_STREAMING); entryValues[1] = String.valueOf(Helper.VIDEO_MODE_MAGNET);
entryValues[2] = String.valueOf(Helper.VIDEO_MODE_WEBVIEW); entryValues[2] = String.valueOf(Helper.VIDEO_MODE_WEBVIEW);
entryValues[3] = String.valueOf(Helper.VIDEO_MODE_TORRENT);
if (set_video_mode_choice != null) { if (set_video_mode_choice != null) {
set_video_mode_choice.setEntries(entries); set_video_mode_choice.setEntries(entries);
set_video_mode_choice.setEntryValues(entryValues); set_video_mode_choice.setEntryValues(entryValues);

View File

@ -85,7 +85,8 @@ public class Helper {
public static final int DEFAULT_MODE = 2; public static final int DEFAULT_MODE = 2;
public static final String TIMELINE_TYPE = "timeline_type"; public static final String TIMELINE_TYPE = "timeline_type";
public static final int VIDEO_MODE_NORMAL = 0; public static final int VIDEO_MODE_NORMAL = 0;
public static final int VIDEO_MODE_STREAMING = 2; public static final int VIDEO_MODE_MAGNET = 2;
public static final int VIDEO_MODE_TORRENT = 3;
public static final int VIDEO_MODE_WEBVIEW = 1; public static final int VIDEO_MODE_WEBVIEW = 1;
public static final int QUALITY_HIGH = 0; public static final int QUALITY_HIGH = 0;
public static final int QUALITY_MEDIUM = 1; public static final int QUALITY_MEDIUM = 1;

View File

@ -53,10 +53,10 @@ public class NotificationHelper {
NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(context, FETCH_NOTIFICATION_CHANNEL_ID) NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(context, FETCH_NOTIFICATION_CHANNEL_ID)
.setSmallIcon(R.drawable.ic_notification_tubelab).setTicker(message) .setSmallIcon(R.drawable.ic_notification_tubelab).setTicker(message)
.setWhen(System.currentTimeMillis()) .setWhen(System.currentTimeMillis());
.setAutoCancel(true);
notificationBuilder.setGroup(account.getAcct()) notificationBuilder.setGroup(account.getAcct())
.setContentIntent(pIntent) .setContentIntent(pIntent)
.setAutoCancel(true)
.setContentText(message); .setContentText(message);
@ -76,6 +76,7 @@ public class NotificationHelper {
.setContentText(context.getApplicationContext().getString(R.string.fetch_notification_channel_name)) .setContentText(context.getApplicationContext().getString(R.string.fetch_notification_channel_name))
.setContentIntent(pIntent) .setContentIntent(pIntent)
.setLargeIcon(icon) .setLargeIcon(icon)
.setAutoCancel(true)
.setSmallIcon(R.drawable.ic_notification_tubelab) .setSmallIcon(R.drawable.ic_notification_tubelab)
.setGroup(account.getAcct()) .setGroup(account.getAcct())
.setGroupSummary(true) .setGroupSummary(true)

View File

@ -98,13 +98,18 @@ public class NotificationsWorker extends Worker {
for(AccountData.Account account: accounts) { for(AccountData.Account account: accounts) {
RetrofitPeertubeAPI retrofitPeertubeAPI = new RetrofitPeertubeAPI(getApplicationContext(), account.getHost(), account.getToken()); RetrofitPeertubeAPI retrofitPeertubeAPI = new RetrofitPeertubeAPI(getApplicationContext(), account.getHost(), account.getToken());
APIResponse apiResponse = retrofitPeertubeAPI.getNotifications(); APIResponse apiResponse = retrofitPeertubeAPI.getNotifications();
if( apiResponse == null) {
return;
}
try { try {
UserMe userMe = retrofitPeertubeAPI.verifyCredentials(); UserMe userMe = retrofitPeertubeAPI.verifyCredentials();
if( userMe != null) { if( userMe != null) {
List<NotificationData.Notification> notifications = apiResponse.getPeertubeNotifications(); List<NotificationData.Notification> notifications = apiResponse.getPeertubeNotifications();
NotificationSettings notificationSettings = userMe.getNotificationSettings(); NotificationSettings notificationSettings = userMe.getNotificationSettings();
if( apiResponse != null && apiResponse.getPeertubeNotifications() != null && apiResponse.getPeertubeNotifications().size() > 0 ) { if( apiResponse.getPeertubeNotifications() != null && apiResponse.getPeertubeNotifications().size() > 0 ) {
String last_read = sharedpreferences.getString(Helper.LAST_NOTIFICATION_READ + account.getId() + account.getHost(), null); String last_read = sharedpreferences.getString(Helper.LAST_NOTIFICATION_READ + account.getId() + account.getHost(), null);
editor.putString(Helper.LAST_NOTIFICATION_READ + account.getId() + account.getHost(), apiResponse.getPeertubeNotifications().get(0).getId());
editor.apply();
if( last_read != null) { if( last_read != null) {
for(NotificationData.Notification notification: notifications) { for(NotificationData.Notification notification: notifications) {
String title = ""; String title = "";
@ -121,7 +126,7 @@ public class NotificationsWorker extends Worker {
} }
Intent intent = null; Intent intent = null;
if( last_read == null || notification.getId().compareTo(last_read) > 0) { if(notification.getId().compareTo(last_read) > 0) {
switch (notification.getType()) { switch (notification.getType()) {
case DisplayNotificationsFragment.NEW_VIDEO_FROM_SUBSCRIPTION: case DisplayNotificationsFragment.NEW_VIDEO_FROM_SUBSCRIPTION:
if(notificationSettings.getNewVideoFromSubscription() == 1 || notificationSettings.getNewVideoFromSubscription() == 3) { if(notificationSettings.getNewVideoFromSubscription() == 1 || notificationSettings.getNewVideoFromSubscription() == 3) {
@ -281,8 +286,6 @@ public class NotificationsWorker extends Worker {
} }
} }
} }
editor.putString(Helper.LAST_NOTIFICATION_READ + account.getId() + account.getHost(), apiResponse.getPeertubeNotifications().get(0).getId());
editor.apply();
} }
} }
@ -300,7 +303,7 @@ public class NotificationsWorker extends Worker {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
NotificationChannel channel = new NotificationChannel(FETCH_NOTIFICATION_CHANNEL_ID, NotificationChannel channel = new NotificationChannel(FETCH_NOTIFICATION_CHANNEL_ID,
getApplicationContext().getString(R.string.fetch_notification_channel_name), getApplicationContext().getString(R.string.fetch_notification_channel_name),
NotificationManager.IMPORTANCE_DEFAULT); NotificationManager.IMPORTANCE_LOW);
channel.setSound(null, null); channel.setSound(null, null);
notificationManager.createNotificationChannel(channel); notificationManager.createNotificationChannel(channel);
} }
@ -317,6 +320,8 @@ public class NotificationsWorker extends Worker {
.setOnlyAlertOnce(true) .setOnlyAlertOnce(true)
.setContentIntent(pendingIntent) .setContentIntent(pendingIntent)
.setSmallIcon(R.drawable.ic_notification_tubelab) .setSmallIcon(R.drawable.ic_notification_tubelab)
.setSound(null)
.setAutoCancel(true)
.setOngoing(true); .setOngoing(true);
return new ForegroundInfo(pendingNotificationID, notificationBuilder.build()); return new ForegroundInfo(pendingNotificationID, notificationBuilder.build());
} }