2017-04-09 19:34:00 +02:00
|
|
|
package org.schabi.newpipe.util;
|
|
|
|
|
2018-03-08 15:50:46 +01:00
|
|
|
import android.annotation.SuppressLint;
|
2017-07-04 09:31:53 +02:00
|
|
|
import android.app.Activity;
|
2017-10-30 21:15:06 +01:00
|
|
|
import android.content.ActivityNotFoundException;
|
2017-04-09 19:34:00 +02:00
|
|
|
import android.content.Context;
|
|
|
|
import android.content.Intent;
|
2017-10-30 21:15:06 +01:00
|
|
|
import android.net.Uri;
|
2017-11-02 06:33:13 +01:00
|
|
|
import android.os.Build;
|
2017-04-09 19:34:00 +02:00
|
|
|
import android.preference.PreferenceManager;
|
2019-10-04 14:59:08 +02:00
|
|
|
import androidx.annotation.NonNull;
|
|
|
|
import androidx.annotation.Nullable;
|
|
|
|
import androidx.fragment.app.Fragment;
|
|
|
|
import androidx.fragment.app.FragmentManager;
|
|
|
|
import androidx.fragment.app.FragmentTransaction;
|
|
|
|
import androidx.appcompat.app.AlertDialog;
|
2018-01-23 01:40:00 +01:00
|
|
|
import android.util.Log;
|
2017-11-02 06:33:13 +01:00
|
|
|
import android.widget.Toast;
|
2017-06-05 21:33:01 +02:00
|
|
|
|
|
|
|
import com.nostra13.universalimageloader.core.ImageLoader;
|
2017-04-09 19:34:00 +02:00
|
|
|
|
|
|
|
import org.schabi.newpipe.MainActivity;
|
|
|
|
import org.schabi.newpipe.R;
|
2019-03-02 00:42:06 +01:00
|
|
|
import org.schabi.newpipe.RouterActivity;
|
2017-09-03 08:04:18 +02:00
|
|
|
import org.schabi.newpipe.about.AboutActivity;
|
2017-07-04 09:31:53 +02:00
|
|
|
import org.schabi.newpipe.download.DownloadActivity;
|
2017-04-09 19:34:00 +02:00
|
|
|
import org.schabi.newpipe.extractor.NewPipe;
|
|
|
|
import org.schabi.newpipe.extractor.StreamingService;
|
2017-09-15 19:27:39 +02:00
|
|
|
import org.schabi.newpipe.extractor.exceptions.ExtractionException;
|
2018-01-23 01:40:00 +01:00
|
|
|
import org.schabi.newpipe.extractor.stream.AudioStream;
|
|
|
|
import org.schabi.newpipe.extractor.stream.Stream;
|
|
|
|
import org.schabi.newpipe.extractor.stream.StreamInfo;
|
|
|
|
import org.schabi.newpipe.extractor.stream.VideoStream;
|
2017-06-05 21:33:01 +02:00
|
|
|
import org.schabi.newpipe.fragments.MainFragment;
|
2017-04-09 19:34:00 +02:00
|
|
|
import org.schabi.newpipe.fragments.detail.VideoDetailFragment;
|
2017-09-03 08:04:18 +02:00
|
|
|
import org.schabi.newpipe.fragments.list.channel.ChannelFragment;
|
2018-09-23 03:32:19 +02:00
|
|
|
import org.schabi.newpipe.fragments.list.comments.CommentsFragment;
|
2017-10-05 14:57:19 +02:00
|
|
|
import org.schabi.newpipe.fragments.list.kiosk.KioskFragment;
|
2017-09-03 08:04:18 +02:00
|
|
|
import org.schabi.newpipe.fragments.list.playlist.PlaylistFragment;
|
|
|
|
import org.schabi.newpipe.fragments.list.search.SearchFragment;
|
2019-03-02 00:42:06 +01:00
|
|
|
import org.schabi.newpipe.local.bookmark.BookmarkFragment;
|
|
|
|
import org.schabi.newpipe.local.feed.FeedFragment;
|
2018-04-28 15:37:27 +02:00
|
|
|
import org.schabi.newpipe.local.history.StatisticsPlaylistFragment;
|
2018-04-12 23:46:03 +02:00
|
|
|
import org.schabi.newpipe.local.playlist.LocalPlaylistFragment;
|
2018-06-08 21:07:25 +02:00
|
|
|
import org.schabi.newpipe.local.subscription.SubscriptionFragment;
|
2018-04-15 20:29:58 +02:00
|
|
|
import org.schabi.newpipe.local.subscription.SubscriptionsImportFragment;
|
2017-11-02 06:33:13 +01:00
|
|
|
import org.schabi.newpipe.player.BackgroundPlayer;
|
|
|
|
import org.schabi.newpipe.player.BackgroundPlayerActivity;
|
2017-04-17 06:21:48 +02:00
|
|
|
import org.schabi.newpipe.player.BasePlayer;
|
2017-11-02 06:33:13 +01:00
|
|
|
import org.schabi.newpipe.player.MainVideoPlayer;
|
|
|
|
import org.schabi.newpipe.player.PopupVideoPlayer;
|
|
|
|
import org.schabi.newpipe.player.PopupVideoPlayerActivity;
|
2017-04-17 06:21:48 +02:00
|
|
|
import org.schabi.newpipe.player.VideoPlayer;
|
2018-04-21 23:10:01 +02:00
|
|
|
import org.schabi.newpipe.player.playqueue.PlayQueue;
|
2017-07-04 09:31:53 +02:00
|
|
|
import org.schabi.newpipe.settings.SettingsActivity;
|
2017-04-09 19:34:00 +02:00
|
|
|
|
2018-01-23 01:40:00 +01:00
|
|
|
import java.util.ArrayList;
|
|
|
|
|
2017-04-09 19:34:00 +02:00
|
|
|
@SuppressWarnings({"unused", "WeakerAccess"})
|
|
|
|
public class NavigationHelper {
|
2017-07-10 05:09:57 +02:00
|
|
|
public static final String MAIN_FRAGMENT_TAG = "main_fragment_tag";
|
2018-02-03 12:03:55 +01:00
|
|
|
public static final String SEARCH_FRAGMENT_TAG = "search_fragment_tag";
|
2017-04-09 19:34:00 +02:00
|
|
|
|
2017-04-26 21:32:20 +02:00
|
|
|
/*//////////////////////////////////////////////////////////////////////////
|
|
|
|
// Players
|
|
|
|
//////////////////////////////////////////////////////////////////////////*/
|
2018-01-23 01:40:00 +01:00
|
|
|
|
2018-03-01 08:25:45 +01:00
|
|
|
@NonNull
|
2018-03-01 02:47:12 +01:00
|
|
|
public static Intent getPlayerIntent(@NonNull final Context context,
|
|
|
|
@NonNull final Class targetClazz,
|
|
|
|
@NonNull final PlayQueue playQueue,
|
2019-04-13 09:31:32 +02:00
|
|
|
@Nullable final String quality,
|
|
|
|
final boolean resumePlayback) {
|
2018-03-01 02:47:12 +01:00
|
|
|
Intent intent = new Intent(context, targetClazz);
|
|
|
|
|
|
|
|
final String cacheKey = SerializedCache.getInstance().put(playQueue, PlayQueue.class);
|
|
|
|
if (cacheKey != null) intent.putExtra(VideoPlayer.PLAY_QUEUE_KEY, cacheKey);
|
2017-10-25 06:47:14 +02:00
|
|
|
if (quality != null) intent.putExtra(VideoPlayer.PLAYBACK_QUALITY, quality);
|
2019-04-13 09:31:32 +02:00
|
|
|
intent.putExtra(VideoPlayer.RESUME_PLAYBACK, resumePlayback);
|
2017-10-25 06:47:14 +02:00
|
|
|
|
|
|
|
return intent;
|
2017-04-12 08:07:15 +02:00
|
|
|
}
|
|
|
|
|
2018-03-01 08:25:45 +01:00
|
|
|
@NonNull
|
2018-03-01 02:47:12 +01:00
|
|
|
public static Intent getPlayerIntent(@NonNull final Context context,
|
|
|
|
@NonNull final Class targetClazz,
|
2019-04-13 09:31:32 +02:00
|
|
|
@NonNull final PlayQueue playQueue,
|
|
|
|
final boolean resumePlayback) {
|
|
|
|
return getPlayerIntent(context, targetClazz, playQueue, null, resumePlayback);
|
2017-10-13 02:02:07 +02:00
|
|
|
}
|
|
|
|
|
2018-03-01 08:25:45 +01:00
|
|
|
@NonNull
|
2018-03-01 02:47:12 +01:00
|
|
|
public static Intent getPlayerEnqueueIntent(@NonNull final Context context,
|
|
|
|
@NonNull final Class targetClazz,
|
|
|
|
@NonNull final PlayQueue playQueue,
|
2019-04-13 09:31:32 +02:00
|
|
|
final boolean selectOnAppend,
|
|
|
|
final boolean resumePlayback) {
|
|
|
|
return getPlayerIntent(context, targetClazz, playQueue, resumePlayback)
|
2018-01-23 01:40:00 +01:00
|
|
|
.putExtra(BasePlayer.APPEND_ONLY, true)
|
|
|
|
.putExtra(BasePlayer.SELECT_ON_APPEND, selectOnAppend);
|
2017-04-17 06:21:48 +02:00
|
|
|
}
|
|
|
|
|
2018-03-01 08:25:45 +01:00
|
|
|
@NonNull
|
2018-03-01 02:47:12 +01:00
|
|
|
public static Intent getPlayerIntent(@NonNull final Context context,
|
|
|
|
@NonNull final Class targetClazz,
|
|
|
|
@NonNull final PlayQueue playQueue,
|
2017-10-25 06:47:14 +02:00
|
|
|
final int repeatMode,
|
|
|
|
final float playbackSpeed,
|
|
|
|
final float playbackPitch,
|
2018-05-08 20:24:42 +02:00
|
|
|
final boolean playbackSkipSilence,
|
2019-04-13 09:31:32 +02:00
|
|
|
@Nullable final String playbackQuality,
|
2020-01-16 20:44:08 +01:00
|
|
|
final boolean resumePlayback,
|
|
|
|
final boolean startPaused) {
|
2019-04-13 09:31:32 +02:00
|
|
|
return getPlayerIntent(context, targetClazz, playQueue, playbackQuality, resumePlayback)
|
2017-10-25 06:47:14 +02:00
|
|
|
.putExtra(BasePlayer.REPEAT_MODE, repeatMode)
|
|
|
|
.putExtra(BasePlayer.PLAYBACK_SPEED, playbackSpeed)
|
2018-05-08 20:24:42 +02:00
|
|
|
.putExtra(BasePlayer.PLAYBACK_PITCH, playbackPitch)
|
2020-01-16 20:44:08 +01:00
|
|
|
.putExtra(BasePlayer.PLAYBACK_SKIP_SILENCE, playbackSkipSilence)
|
|
|
|
.putExtra(BasePlayer.START_PAUSED, startPaused);
|
2017-10-25 06:47:14 +02:00
|
|
|
}
|
|
|
|
|
2019-04-13 09:31:32 +02:00
|
|
|
public static void playOnMainPlayer(final Context context, final PlayQueue queue, final boolean resumePlayback) {
|
|
|
|
final Intent playerIntent = getPlayerIntent(context, MainVideoPlayer.class, queue, resumePlayback);
|
2018-01-23 01:40:00 +01:00
|
|
|
playerIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
|
|
|
context.startActivity(playerIntent);
|
|
|
|
}
|
|
|
|
|
2019-04-13 09:31:32 +02:00
|
|
|
public static void playOnPopupPlayer(final Context context, final PlayQueue queue, final boolean resumePlayback) {
|
2018-01-23 01:40:00 +01:00
|
|
|
if (!PermissionHelper.isPopupEnabled(context)) {
|
|
|
|
PermissionHelper.showPopupEnablementToast(context);
|
2018-01-04 07:53:31 +01:00
|
|
|
return;
|
|
|
|
}
|
2018-01-23 01:40:00 +01:00
|
|
|
|
|
|
|
Toast.makeText(context, R.string.popup_playing_toast, Toast.LENGTH_SHORT).show();
|
2019-04-13 09:31:32 +02:00
|
|
|
startService(context, getPlayerIntent(context, PopupVideoPlayer.class, queue, resumePlayback));
|
2017-11-02 06:33:13 +01:00
|
|
|
}
|
|
|
|
|
2019-04-13 09:31:32 +02:00
|
|
|
public static void playOnBackgroundPlayer(final Context context, final PlayQueue queue, final boolean resumePlayback) {
|
2017-11-02 06:33:13 +01:00
|
|
|
Toast.makeText(context, R.string.background_player_playing_toast, Toast.LENGTH_SHORT).show();
|
2019-04-13 09:31:32 +02:00
|
|
|
startService(context, getPlayerIntent(context, BackgroundPlayer.class, queue, resumePlayback));
|
2017-11-02 06:33:13 +01:00
|
|
|
}
|
|
|
|
|
2019-04-13 09:31:32 +02:00
|
|
|
public static void enqueueOnPopupPlayer(final Context context, final PlayQueue queue, final boolean resumePlayback) {
|
|
|
|
enqueueOnPopupPlayer(context, queue, false, resumePlayback);
|
2018-01-23 01:40:00 +01:00
|
|
|
}
|
|
|
|
|
2019-04-13 09:31:32 +02:00
|
|
|
public static void enqueueOnPopupPlayer(final Context context, final PlayQueue queue, boolean selectOnAppend, final boolean resumePlayback) {
|
2018-01-23 01:40:00 +01:00
|
|
|
if (!PermissionHelper.isPopupEnabled(context)) {
|
|
|
|
PermissionHelper.showPopupEnablementToast(context);
|
2018-01-04 07:53:31 +01:00
|
|
|
return;
|
|
|
|
}
|
2018-01-23 01:40:00 +01:00
|
|
|
|
|
|
|
Toast.makeText(context, R.string.popup_playing_append, Toast.LENGTH_SHORT).show();
|
2018-03-06 04:03:49 +01:00
|
|
|
startService(context,
|
2019-04-13 09:31:32 +02:00
|
|
|
getPlayerEnqueueIntent(context, PopupVideoPlayer.class, queue, selectOnAppend, resumePlayback));
|
2017-11-02 06:33:13 +01:00
|
|
|
}
|
|
|
|
|
2019-04-13 09:31:32 +02:00
|
|
|
public static void enqueueOnBackgroundPlayer(final Context context, final PlayQueue queue, final boolean resumePlayback) {
|
|
|
|
enqueueOnBackgroundPlayer(context, queue, false, resumePlayback);
|
2018-01-23 01:40:00 +01:00
|
|
|
}
|
|
|
|
|
2019-04-13 09:31:32 +02:00
|
|
|
public static void enqueueOnBackgroundPlayer(final Context context, final PlayQueue queue, boolean selectOnAppend, final boolean resumePlayback) {
|
2017-11-02 06:33:13 +01:00
|
|
|
Toast.makeText(context, R.string.background_player_append, Toast.LENGTH_SHORT).show();
|
2018-03-06 04:03:49 +01:00
|
|
|
startService(context,
|
2019-04-13 09:31:32 +02:00
|
|
|
getPlayerEnqueueIntent(context, BackgroundPlayer.class, queue, selectOnAppend, resumePlayback));
|
2018-03-06 04:03:49 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
public static void startService(@NonNull final Context context, @NonNull final Intent intent) {
|
|
|
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
|
|
|
context.startForegroundService(intent);
|
|
|
|
} else {
|
|
|
|
context.startService(intent);
|
|
|
|
}
|
2018-01-23 01:40:00 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/*//////////////////////////////////////////////////////////////////////////
|
|
|
|
// External Players
|
|
|
|
//////////////////////////////////////////////////////////////////////////*/
|
|
|
|
|
|
|
|
public static void playOnExternalAudioPlayer(Context context, StreamInfo info) {
|
|
|
|
final int index = ListHelper.getDefaultAudioFormat(context, info.getAudioStreams());
|
|
|
|
|
|
|
|
if (index == -1) {
|
|
|
|
Toast.makeText(context, R.string.audio_streams_empty, Toast.LENGTH_SHORT).show();
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
AudioStream audioStream = info.getAudioStreams().get(index);
|
|
|
|
playOnExternalPlayer(context, info.getName(), info.getUploaderName(), audioStream);
|
|
|
|
}
|
|
|
|
|
|
|
|
public static void playOnExternalVideoPlayer(Context context, StreamInfo info) {
|
|
|
|
ArrayList<VideoStream> videoStreamsList = new ArrayList<>(ListHelper.getSortedStreamVideosList(context, info.getVideoStreams(), null, false));
|
|
|
|
int index = ListHelper.getDefaultResolutionIndex(context, videoStreamsList);
|
|
|
|
|
|
|
|
if (index == -1) {
|
|
|
|
Toast.makeText(context, R.string.video_streams_empty, Toast.LENGTH_SHORT).show();
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
VideoStream videoStream = videoStreamsList.get(index);
|
|
|
|
playOnExternalPlayer(context, info.getName(), info.getUploaderName(), videoStream);
|
|
|
|
}
|
|
|
|
|
|
|
|
public static void playOnExternalPlayer(Context context, String name, String artist, Stream stream) {
|
|
|
|
Intent intent = new Intent();
|
|
|
|
intent.setAction(Intent.ACTION_VIEW);
|
|
|
|
intent.setDataAndType(Uri.parse(stream.getUrl()), stream.getFormat().getMimeType());
|
|
|
|
intent.putExtra(Intent.EXTRA_TITLE, name);
|
|
|
|
intent.putExtra("title", name);
|
|
|
|
intent.putExtra("artist", artist);
|
|
|
|
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
|
|
|
|
|
|
|
resolveActivityOrAskToInstall(context, intent);
|
|
|
|
}
|
|
|
|
|
|
|
|
public static void resolveActivityOrAskToInstall(Context context, Intent intent) {
|
|
|
|
if (intent.resolveActivity(context.getPackageManager()) != null) {
|
|
|
|
context.startActivity(intent);
|
|
|
|
} else {
|
|
|
|
if (context instanceof Activity) {
|
|
|
|
new AlertDialog.Builder(context)
|
|
|
|
.setMessage(R.string.no_player_found)
|
|
|
|
.setPositiveButton(R.string.install, (dialog, which) -> {
|
|
|
|
Intent i = new Intent();
|
|
|
|
i.setAction(Intent.ACTION_VIEW);
|
|
|
|
i.setData(Uri.parse(context.getString(R.string.fdroid_vlc_url)));
|
|
|
|
context.startActivity(i);
|
|
|
|
})
|
|
|
|
.setNegativeButton(R.string.cancel, (dialog, which) -> Log.i("NavigationHelper", "You unlocked a secret unicorn."))
|
|
|
|
.show();
|
|
|
|
//Log.e("NavigationHelper", "Either no Streaming player for audio was installed, or something important crashed:");
|
|
|
|
} else {
|
|
|
|
Toast.makeText(context, R.string.no_player_found_toast, Toast.LENGTH_LONG).show();
|
|
|
|
}
|
|
|
|
}
|
2017-11-02 06:33:13 +01:00
|
|
|
}
|
2018-01-23 01:40:00 +01:00
|
|
|
|
2017-04-09 19:34:00 +02:00
|
|
|
/*//////////////////////////////////////////////////////////////////////////
|
2017-06-05 21:33:01 +02:00
|
|
|
// Through FragmentManager
|
2017-04-09 19:34:00 +02:00
|
|
|
//////////////////////////////////////////////////////////////////////////*/
|
|
|
|
|
2018-03-08 15:50:46 +01:00
|
|
|
@SuppressLint("CommitTransaction")
|
|
|
|
private static FragmentTransaction defaultTransaction(FragmentManager fragmentManager) {
|
|
|
|
return fragmentManager.beginTransaction()
|
|
|
|
.setCustomAnimations(R.animator.custom_fade_in, R.animator.custom_fade_out, R.animator.custom_fade_in, R.animator.custom_fade_out);
|
|
|
|
}
|
|
|
|
|
2017-07-10 05:09:57 +02:00
|
|
|
public static void gotoMainFragment(FragmentManager fragmentManager) {
|
2017-06-05 21:33:01 +02:00
|
|
|
ImageLoader.getInstance().clearMemoryCache();
|
2017-07-10 05:09:57 +02:00
|
|
|
|
|
|
|
boolean popped = fragmentManager.popBackStackImmediate(MAIN_FRAGMENT_TAG, 0);
|
|
|
|
if (!popped) openMainFragment(fragmentManager);
|
|
|
|
}
|
|
|
|
|
2017-10-13 13:49:31 +02:00
|
|
|
public static void openMainFragment(FragmentManager fragmentManager) {
|
2017-09-03 08:04:18 +02:00
|
|
|
InfoCache.getInstance().trimCache();
|
|
|
|
|
2017-07-10 05:09:57 +02:00
|
|
|
fragmentManager.popBackStackImmediate(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
|
2018-03-08 15:50:46 +01:00
|
|
|
defaultTransaction(fragmentManager)
|
2017-06-05 21:33:01 +02:00
|
|
|
.replace(R.id.fragment_holder, new MainFragment())
|
2017-07-10 05:09:57 +02:00
|
|
|
.addToBackStack(MAIN_FRAGMENT_TAG)
|
2017-06-05 21:33:01 +02:00
|
|
|
.commit();
|
2017-04-09 19:34:00 +02:00
|
|
|
}
|
|
|
|
|
2018-02-03 12:03:55 +01:00
|
|
|
public static boolean tryGotoSearchFragment(FragmentManager fragmentManager) {
|
|
|
|
if (MainActivity.DEBUG) {
|
|
|
|
for (int i = 0; i < fragmentManager.getBackStackEntryCount(); i++) {
|
|
|
|
Log.d("NavigationHelper", "tryGoToSearchFragment() [" + i + "] = [" + fragmentManager.getBackStackEntryAt(i) + "]");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return fragmentManager.popBackStackImmediate(SEARCH_FRAGMENT_TAG, 0);
|
|
|
|
}
|
|
|
|
|
2018-07-10 16:26:42 +02:00
|
|
|
public static void openSearchFragment(FragmentManager fragmentManager,
|
|
|
|
int serviceId,
|
|
|
|
String searchString) {
|
2018-03-08 15:50:46 +01:00
|
|
|
defaultTransaction(fragmentManager)
|
2018-07-10 16:26:42 +02:00
|
|
|
.replace(R.id.fragment_holder, SearchFragment.getInstance(serviceId, searchString))
|
2018-02-03 12:03:55 +01:00
|
|
|
.addToBackStack(SEARCH_FRAGMENT_TAG)
|
2017-06-05 21:33:01 +02:00
|
|
|
.commit();
|
2017-04-09 19:34:00 +02:00
|
|
|
}
|
|
|
|
|
2017-06-05 21:33:01 +02:00
|
|
|
public static void openVideoDetailFragment(FragmentManager fragmentManager, int serviceId, String url, String title) {
|
|
|
|
openVideoDetailFragment(fragmentManager, serviceId, url, title, false);
|
2017-04-09 19:34:00 +02:00
|
|
|
}
|
|
|
|
|
2017-06-05 21:33:01 +02:00
|
|
|
public static void openVideoDetailFragment(FragmentManager fragmentManager, int serviceId, String url, String title, boolean autoPlay) {
|
|
|
|
Fragment fragment = fragmentManager.findFragmentById(R.id.fragment_holder);
|
|
|
|
if (title == null) title = "";
|
|
|
|
|
|
|
|
if (fragment instanceof VideoDetailFragment && fragment.isVisible()) {
|
|
|
|
VideoDetailFragment detailFragment = (VideoDetailFragment) fragment;
|
|
|
|
detailFragment.setAutoplay(autoPlay);
|
|
|
|
detailFragment.selectAndLoadVideo(serviceId, url, title);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
VideoDetailFragment instance = VideoDetailFragment.getInstance(serviceId, url, title);
|
|
|
|
instance.setAutoplay(autoPlay);
|
|
|
|
|
2018-03-08 15:50:46 +01:00
|
|
|
defaultTransaction(fragmentManager)
|
2017-06-05 21:33:01 +02:00
|
|
|
.replace(R.id.fragment_holder, instance)
|
|
|
|
.addToBackStack(null)
|
|
|
|
.commit();
|
|
|
|
}
|
|
|
|
|
2018-07-10 16:26:42 +02:00
|
|
|
public static void openChannelFragment(
|
|
|
|
FragmentManager fragmentManager,
|
|
|
|
int serviceId,
|
|
|
|
String url,
|
|
|
|
String name) {
|
2017-06-05 21:33:01 +02:00
|
|
|
if (name == null) name = "";
|
2018-03-08 15:50:46 +01:00
|
|
|
defaultTransaction(fragmentManager)
|
2018-07-10 16:26:42 +02:00
|
|
|
.replace(R.id.fragment_holder, ChannelFragment.getInstance(serviceId, url, name))
|
2017-06-05 21:33:01 +02:00
|
|
|
.addToBackStack(null)
|
|
|
|
.commit();
|
2017-04-09 19:34:00 +02:00
|
|
|
}
|
|
|
|
|
2018-09-23 03:32:19 +02:00
|
|
|
public static void openCommentsFragment(
|
|
|
|
FragmentManager fragmentManager,
|
|
|
|
int serviceId,
|
|
|
|
String url,
|
|
|
|
String name) {
|
|
|
|
if (name == null) name = "";
|
2018-09-23 11:52:45 +02:00
|
|
|
fragmentManager.beginTransaction().setCustomAnimations(R.anim.switch_service_in, R.anim.switch_service_out)
|
2018-09-23 03:32:19 +02:00
|
|
|
.replace(R.id.fragment_holder, CommentsFragment.getInstance(serviceId, url, name))
|
|
|
|
.addToBackStack(null)
|
|
|
|
.commit();
|
|
|
|
}
|
|
|
|
|
2018-07-10 16:26:42 +02:00
|
|
|
public static void openPlaylistFragment(FragmentManager fragmentManager,
|
|
|
|
int serviceId,
|
|
|
|
String url,
|
|
|
|
String name) {
|
2017-09-03 08:04:18 +02:00
|
|
|
if (name == null) name = "";
|
2018-03-08 15:50:46 +01:00
|
|
|
defaultTransaction(fragmentManager)
|
2018-07-10 16:26:42 +02:00
|
|
|
.replace(R.id.fragment_holder, PlaylistFragment.getInstance(serviceId, url, name))
|
2017-09-03 08:04:18 +02:00
|
|
|
.addToBackStack(null)
|
|
|
|
.commit();
|
|
|
|
}
|
|
|
|
|
2017-08-07 15:02:30 +02:00
|
|
|
public static void openWhatsNewFragment(FragmentManager fragmentManager) {
|
2018-03-08 15:50:46 +01:00
|
|
|
defaultTransaction(fragmentManager)
|
2017-08-07 15:02:30 +02:00
|
|
|
.replace(R.id.fragment_holder, new FeedFragment())
|
|
|
|
.addToBackStack(null)
|
|
|
|
.commit();
|
|
|
|
}
|
|
|
|
|
2018-06-08 21:07:25 +02:00
|
|
|
public static void openBookmarksFragment(FragmentManager fragmentManager) {
|
|
|
|
defaultTransaction(fragmentManager)
|
|
|
|
.replace(R.id.fragment_holder, new BookmarkFragment())
|
|
|
|
.addToBackStack(null)
|
|
|
|
.commit();
|
|
|
|
}
|
|
|
|
|
|
|
|
public static void openSubscriptionFragment(FragmentManager fragmentManager) {
|
|
|
|
defaultTransaction(fragmentManager)
|
|
|
|
.replace(R.id.fragment_holder, new SubscriptionFragment())
|
|
|
|
.addToBackStack(null)
|
|
|
|
.commit();
|
|
|
|
}
|
|
|
|
|
2018-03-08 15:50:46 +01:00
|
|
|
public static void openKioskFragment(FragmentManager fragmentManager, int serviceId, String kioskId) throws ExtractionException {
|
|
|
|
defaultTransaction(fragmentManager)
|
2017-10-05 14:57:19 +02:00
|
|
|
.replace(R.id.fragment_holder, KioskFragment.getInstance(serviceId, kioskId))
|
|
|
|
.addToBackStack(null)
|
|
|
|
.commit();
|
|
|
|
}
|
|
|
|
|
2018-01-17 06:12:03 +01:00
|
|
|
public static void openLocalPlaylistFragment(FragmentManager fragmentManager, long playlistId, String name) {
|
|
|
|
if (name == null) name = "";
|
2018-03-08 15:50:46 +01:00
|
|
|
defaultTransaction(fragmentManager)
|
2018-01-17 06:12:03 +01:00
|
|
|
.replace(R.id.fragment_holder, LocalPlaylistFragment.getInstance(playlistId, name))
|
|
|
|
.addToBackStack(null)
|
|
|
|
.commit();
|
|
|
|
}
|
|
|
|
|
2018-04-28 15:37:27 +02:00
|
|
|
public static void openStatisticFragment(FragmentManager fragmentManager) {
|
2018-03-08 15:50:46 +01:00
|
|
|
defaultTransaction(fragmentManager)
|
2018-04-28 15:37:27 +02:00
|
|
|
.replace(R.id.fragment_holder, new StatisticsPlaylistFragment())
|
2018-01-17 06:12:03 +01:00
|
|
|
.addToBackStack(null)
|
|
|
|
.commit();
|
|
|
|
}
|
2018-03-08 15:50:46 +01:00
|
|
|
|
|
|
|
public static void openSubscriptionsImportFragment(FragmentManager fragmentManager, int serviceId) {
|
|
|
|
defaultTransaction(fragmentManager)
|
|
|
|
.replace(R.id.fragment_holder, SubscriptionsImportFragment.getInstance(serviceId))
|
|
|
|
.addToBackStack(null)
|
|
|
|
.commit();
|
|
|
|
}
|
|
|
|
|
2017-04-09 19:34:00 +02:00
|
|
|
/*//////////////////////////////////////////////////////////////////////////
|
|
|
|
// Through Intents
|
|
|
|
//////////////////////////////////////////////////////////////////////////*/
|
|
|
|
|
2018-07-08 17:46:21 +02:00
|
|
|
public static void openSearch(Context context, int serviceId, String searchString) {
|
2017-06-05 21:33:01 +02:00
|
|
|
Intent mIntent = new Intent(context, MainActivity.class);
|
|
|
|
mIntent.putExtra(Constants.KEY_SERVICE_ID, serviceId);
|
2018-07-08 17:46:21 +02:00
|
|
|
mIntent.putExtra(Constants.KEY_SEARCH_STRING, searchString);
|
2017-06-05 21:33:01 +02:00
|
|
|
mIntent.putExtra(Constants.KEY_OPEN_SEARCH, true);
|
|
|
|
context.startActivity(mIntent);
|
2017-04-09 19:34:00 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
public static void openChannel(Context context, int serviceId, String url) {
|
|
|
|
openChannel(context, serviceId, url, null);
|
|
|
|
}
|
|
|
|
|
|
|
|
public static void openChannel(Context context, int serviceId, String url, String name) {
|
|
|
|
Intent openIntent = getOpenIntent(context, url, serviceId, StreamingService.LinkType.CHANNEL);
|
|
|
|
if (name != null && !name.isEmpty()) openIntent.putExtra(Constants.KEY_TITLE, name);
|
|
|
|
context.startActivity(openIntent);
|
|
|
|
}
|
|
|
|
|
|
|
|
public static void openVideoDetail(Context context, int serviceId, String url) {
|
|
|
|
openVideoDetail(context, serviceId, url, null);
|
|
|
|
}
|
|
|
|
|
|
|
|
public static void openVideoDetail(Context context, int serviceId, String url, String title) {
|
|
|
|
Intent openIntent = getOpenIntent(context, url, serviceId, StreamingService.LinkType.STREAM);
|
|
|
|
if (title != null && !title.isEmpty()) openIntent.putExtra(Constants.KEY_TITLE, title);
|
|
|
|
context.startActivity(openIntent);
|
|
|
|
}
|
|
|
|
|
|
|
|
public static void openMainActivity(Context context) {
|
|
|
|
Intent mIntent = new Intent(context, MainActivity.class);
|
2017-09-03 08:04:18 +02:00
|
|
|
mIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
|
|
|
mIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
|
2017-04-09 19:34:00 +02:00
|
|
|
context.startActivity(mIntent);
|
|
|
|
}
|
|
|
|
|
2019-03-02 00:42:06 +01:00
|
|
|
public static void openRouterActivity(Context context, String url) {
|
|
|
|
Intent mIntent = new Intent(context, RouterActivity.class);
|
|
|
|
mIntent.setData(Uri.parse(url));
|
|
|
|
mIntent.putExtra(RouterActivity.internalRouteKey, true);
|
|
|
|
context.startActivity(mIntent);
|
|
|
|
}
|
|
|
|
|
2017-09-03 08:04:18 +02:00
|
|
|
public static void openAbout(Context context) {
|
|
|
|
Intent intent = new Intent(context, AboutActivity.class);
|
|
|
|
context.startActivity(intent);
|
|
|
|
}
|
|
|
|
|
|
|
|
public static void openSettings(Context context) {
|
|
|
|
Intent intent = new Intent(context, SettingsActivity.class);
|
|
|
|
context.startActivity(intent);
|
|
|
|
}
|
|
|
|
|
|
|
|
public static boolean openDownloads(Activity activity) {
|
2019-08-15 04:00:11 +02:00
|
|
|
if (!PermissionHelper.checkStoragePermissions(activity, PermissionHelper.DOWNLOADS_REQUEST_CODE)) {
|
|
|
|
return false;
|
|
|
|
}
|
2017-09-03 08:04:18 +02:00
|
|
|
Intent intent = new Intent(activity, DownloadActivity.class);
|
|
|
|
activity.startActivity(intent);
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2018-01-04 07:53:31 +01:00
|
|
|
public static Intent getBackgroundPlayerActivityIntent(final Context context) {
|
|
|
|
return getServicePlayerActivityIntent(context, BackgroundPlayerActivity.class);
|
2017-11-02 06:33:13 +01:00
|
|
|
}
|
|
|
|
|
2018-01-04 07:53:31 +01:00
|
|
|
public static Intent getPopupPlayerActivityIntent(final Context context) {
|
|
|
|
return getServicePlayerActivityIntent(context, PopupVideoPlayerActivity.class);
|
2017-11-02 06:33:13 +01:00
|
|
|
}
|
|
|
|
|
2018-01-04 07:53:31 +01:00
|
|
|
private static Intent getServicePlayerActivityIntent(final Context context,
|
|
|
|
final Class activityClass) {
|
|
|
|
Intent intent = new Intent(context, activityClass);
|
2017-11-02 06:33:13 +01:00
|
|
|
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) {
|
|
|
|
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
|
|
|
}
|
2017-12-29 17:29:15 +01:00
|
|
|
return intent;
|
|
|
|
}
|
2017-09-03 08:04:18 +02:00
|
|
|
/*//////////////////////////////////////////////////////////////////////////
|
|
|
|
// Link handling
|
|
|
|
//////////////////////////////////////////////////////////////////////////*/
|
|
|
|
|
2017-04-09 19:34:00 +02:00
|
|
|
private static Intent getOpenIntent(Context context, String url, int serviceId, StreamingService.LinkType type) {
|
|
|
|
Intent mIntent = new Intent(context, MainActivity.class);
|
|
|
|
mIntent.putExtra(Constants.KEY_SERVICE_ID, serviceId);
|
|
|
|
mIntent.putExtra(Constants.KEY_URL, url);
|
|
|
|
mIntent.putExtra(Constants.KEY_LINK_TYPE, type);
|
|
|
|
return mIntent;
|
|
|
|
}
|
|
|
|
|
2017-09-15 19:27:39 +02:00
|
|
|
public static Intent getIntentByLink(Context context, String url) throws ExtractionException {
|
|
|
|
return getIntentByLink(context, NewPipe.getServiceByUrl(url), url);
|
|
|
|
}
|
|
|
|
|
|
|
|
public static Intent getIntentByLink(Context context, StreamingService service, String url) throws ExtractionException {
|
2017-09-03 08:04:18 +02:00
|
|
|
StreamingService.LinkType linkType = service.getLinkTypeByUrl(url);
|
|
|
|
|
|
|
|
if (linkType == StreamingService.LinkType.NONE) {
|
2018-01-23 01:40:00 +01:00
|
|
|
throw new ExtractionException("Url not known to service. service=" + service + " url=" + url);
|
2017-09-03 08:04:18 +02:00
|
|
|
}
|
|
|
|
|
2018-01-23 01:40:00 +01:00
|
|
|
Intent rIntent = getOpenIntent(context, url, service.getServiceId(), linkType);
|
2017-09-03 08:04:18 +02:00
|
|
|
|
|
|
|
switch (linkType) {
|
2017-04-09 19:34:00 +02:00
|
|
|
case STREAM:
|
2018-07-10 16:26:42 +02:00
|
|
|
rIntent.putExtra(VideoDetailFragment.AUTO_PLAY,
|
|
|
|
PreferenceManager.getDefaultSharedPreferences(context)
|
2017-04-09 19:34:00 +02:00
|
|
|
.getBoolean(context.getString(R.string.autoplay_through_intent_key), false));
|
2017-09-03 08:04:18 +02:00
|
|
|
break;
|
2017-04-09 19:34:00 +02:00
|
|
|
}
|
2017-07-04 09:31:53 +02:00
|
|
|
|
2017-09-03 08:04:18 +02:00
|
|
|
return rIntent;
|
2017-07-04 09:31:53 +02:00
|
|
|
}
|
|
|
|
|
2017-10-30 21:15:06 +01:00
|
|
|
private static Uri openMarketUrl(String packageName) {
|
|
|
|
return Uri.parse("market://details")
|
|
|
|
.buildUpon()
|
|
|
|
.appendQueryParameter("id", packageName)
|
|
|
|
.build();
|
|
|
|
}
|
|
|
|
|
|
|
|
private static Uri getGooglePlayUrl(String packageName) {
|
|
|
|
return Uri.parse("https://play.google.com/store/apps/details")
|
|
|
|
.buildUpon()
|
|
|
|
.appendQueryParameter("id", packageName)
|
|
|
|
.build();
|
|
|
|
}
|
|
|
|
|
|
|
|
private static void installApp(Context context, String packageName) {
|
|
|
|
try {
|
|
|
|
// Try market:// scheme
|
|
|
|
context.startActivity(new Intent(Intent.ACTION_VIEW, openMarketUrl(packageName)));
|
|
|
|
} catch (ActivityNotFoundException e) {
|
|
|
|
// Fall back to google play URL (don't worry F-Droid can handle it :)
|
|
|
|
context.startActivity(new Intent(Intent.ACTION_VIEW, getGooglePlayUrl(packageName)));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Start an activity to install Kore
|
|
|
|
* @param context the context
|
|
|
|
*/
|
|
|
|
public static void installKore(Context context) {
|
|
|
|
installApp(context, context.getString(R.string.kore_package));
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Start Kore app to show a video on Kodi
|
2017-10-30 21:31:59 +01:00
|
|
|
*
|
|
|
|
* For a list of supported urls see the
|
|
|
|
* <a href="https://github.com/xbmc/Kore/blob/master/app/src/main/AndroidManifest.xml">
|
|
|
|
* Kore source code
|
|
|
|
* </a>.
|
|
|
|
*
|
2017-10-30 21:15:06 +01:00
|
|
|
* @param context the context to use
|
2017-10-30 21:31:59 +01:00
|
|
|
* @param videoURL the url to the video
|
2017-10-30 21:15:06 +01:00
|
|
|
*/
|
2017-10-30 21:31:59 +01:00
|
|
|
public static void playWithKore(Context context, Uri videoURL) {
|
2017-10-30 21:15:06 +01:00
|
|
|
Intent intent = new Intent(Intent.ACTION_VIEW);
|
|
|
|
intent.setPackage(context.getString(R.string.kore_package));
|
|
|
|
intent.setData(videoURL);
|
|
|
|
context.startActivity(intent);
|
|
|
|
}
|
2017-04-09 19:34:00 +02:00
|
|
|
}
|