2017-11-11 23:47:34 +01:00
|
|
|
package org.schabi.newpipe.info_list;
|
|
|
|
|
2021-12-27 16:16:40 +01:00
|
|
|
import static org.schabi.newpipe.extractor.utils.Utils.isNullOrEmpty;
|
|
|
|
|
2017-11-11 23:47:34 +01:00
|
|
|
import android.app.Activity;
|
|
|
|
import android.content.DialogInterface;
|
|
|
|
import android.view.View;
|
|
|
|
import android.widget.TextView;
|
|
|
|
|
2020-03-31 19:20:15 +02:00
|
|
|
import androidx.annotation.NonNull;
|
2021-04-01 21:46:29 +02:00
|
|
|
import androidx.appcompat.app.AlertDialog;
|
2021-12-27 16:16:40 +01:00
|
|
|
import androidx.fragment.app.Fragment;
|
|
|
|
import androidx.preference.PreferenceManager;
|
2020-03-31 19:20:15 +02:00
|
|
|
|
2017-11-11 23:47:34 +01:00
|
|
|
import org.schabi.newpipe.R;
|
2017-11-14 06:13:52 +01:00
|
|
|
import org.schabi.newpipe.extractor.stream.StreamInfoItem;
|
2021-12-27 16:16:40 +01:00
|
|
|
import org.schabi.newpipe.extractor.stream.StreamType;
|
|
|
|
import org.schabi.newpipe.player.helper.PlayerHolder;
|
|
|
|
import org.schabi.newpipe.util.StreamDialogDefaultEntry;
|
|
|
|
import org.schabi.newpipe.util.StreamDialogEntry;
|
|
|
|
import org.schabi.newpipe.util.external_communication.KoreUtils;
|
2017-11-11 23:47:34 +01:00
|
|
|
|
2021-12-27 16:16:40 +01:00
|
|
|
import java.util.ArrayList;
|
|
|
|
import java.util.List;
|
2017-11-11 23:47:34 +01:00
|
|
|
|
2021-12-27 16:16:40 +01:00
|
|
|
/**
|
|
|
|
* Dialog with actions for a {@link StreamInfoItem}.
|
|
|
|
* This dialog is mostly used for longpress context menus.
|
|
|
|
*/
|
|
|
|
public final class InfoItemDialog {
|
|
|
|
private final AlertDialog dialog;
|
2017-11-14 06:13:52 +01:00
|
|
|
|
2021-12-27 16:16:40 +01:00
|
|
|
private InfoItemDialog(@NonNull final Activity activity,
|
|
|
|
@NonNull final Fragment fragment,
|
|
|
|
@NonNull final StreamInfoItem info,
|
|
|
|
@NonNull final List<StreamDialogEntry> entries) {
|
2017-11-11 23:47:34 +01:00
|
|
|
|
2018-01-16 20:48:52 +01:00
|
|
|
final View bannerView = View.inflate(activity, R.layout.dialog_title, null);
|
2017-11-11 23:47:34 +01:00
|
|
|
bannerView.setSelected(true);
|
2017-11-14 06:13:52 +01:00
|
|
|
|
2020-08-16 10:24:58 +02:00
|
|
|
final TextView titleView = bannerView.findViewById(R.id.itemTitleView);
|
2021-12-27 16:16:40 +01:00
|
|
|
titleView.setText(info.getName());
|
2017-11-14 06:13:52 +01:00
|
|
|
|
2020-08-16 10:24:58 +02:00
|
|
|
final TextView detailsView = bannerView.findViewById(R.id.itemAdditionalDetails);
|
2021-12-27 16:16:40 +01:00
|
|
|
if (info.getUploaderName() != null) {
|
|
|
|
detailsView.setText(info.getUploaderName());
|
2017-11-14 06:13:52 +01:00
|
|
|
detailsView.setVisibility(View.VISIBLE);
|
|
|
|
} else {
|
|
|
|
detailsView.setVisibility(View.GONE);
|
|
|
|
}
|
2017-11-11 23:47:34 +01:00
|
|
|
|
2021-12-27 16:16:40 +01:00
|
|
|
final String[] items = entries.stream()
|
|
|
|
.map(entry -> entry.getString(activity)).toArray(String[]::new);
|
|
|
|
|
|
|
|
final DialogInterface.OnClickListener action = (d, index) ->
|
|
|
|
entries.get(index).action.onClick(fragment, info);
|
|
|
|
|
2017-11-11 23:47:34 +01:00
|
|
|
dialog = new AlertDialog.Builder(activity)
|
|
|
|
.setCustomTitle(bannerView)
|
2021-12-27 16:16:40 +01:00
|
|
|
.setItems(items, action)
|
2017-11-11 23:47:34 +01:00
|
|
|
.create();
|
2021-12-27 16:16:40 +01:00
|
|
|
|
2017-11-11 23:47:34 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
public void show() {
|
|
|
|
dialog.show();
|
|
|
|
}
|
2021-12-27 16:16:40 +01:00
|
|
|
|
|
|
|
/**
|
|
|
|
* <p>Builder to generate a {@link InfoItemDialog}.</p>
|
|
|
|
* Use {@link #addEntry(StreamDialogDefaultEntry)}
|
|
|
|
* and {@link #addAllEntries(StreamDialogDefaultEntry...)} to add options to the dialog.
|
|
|
|
* <br>
|
|
|
|
* Custom actions for entries can be set using
|
|
|
|
* {@link #setAction(StreamDialogDefaultEntry, StreamDialogEntry.StreamDialogEntryAction)}.
|
|
|
|
*/
|
|
|
|
public static class Builder {
|
|
|
|
@NonNull private final Activity activity;
|
|
|
|
@NonNull private final StreamInfoItem info;
|
|
|
|
@NonNull private final Fragment fragment;
|
|
|
|
@NonNull private final List<StreamDialogEntry> entries = new ArrayList<>();
|
|
|
|
|
|
|
|
public Builder(@NonNull final Activity activity,
|
|
|
|
@NonNull final Fragment fragment,
|
|
|
|
@NonNull final StreamInfoItem info) {
|
|
|
|
this.activity = activity;
|
|
|
|
this.fragment = fragment;
|
|
|
|
this.info = info;
|
|
|
|
}
|
|
|
|
|
|
|
|
public void addEntry(@NonNull final StreamDialogDefaultEntry entry) {
|
|
|
|
entries.add(entry.toStreamDialogEntry());
|
|
|
|
}
|
|
|
|
|
|
|
|
public void addAllEntries(@NonNull final StreamDialogDefaultEntry... newEntries) {
|
|
|
|
for (final StreamDialogDefaultEntry entry: newEntries) {
|
|
|
|
this.entries.add(entry.toStreamDialogEntry());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public void setAction(@NonNull final StreamDialogDefaultEntry entry,
|
|
|
|
@NonNull final StreamDialogEntry.StreamDialogEntryAction action) {
|
|
|
|
for (int i = 0; i < entries.size(); i++) {
|
|
|
|
if (entries.get(i).resource == entry.resource) {
|
|
|
|
entries.set(i, new StreamDialogEntry(entry.resource, action));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public void addChannelDetailsEntryIfPossible() {
|
|
|
|
if (!isNullOrEmpty(info.getUploaderUrl())) {
|
|
|
|
addEntry(StreamDialogDefaultEntry.SHOW_CHANNEL_DETAILS);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public void addEnqueueEntriesIfNeeded() {
|
|
|
|
if (PlayerHolder.getInstance().isPlayerOpen()) {
|
|
|
|
addEntry(StreamDialogDefaultEntry.ENQUEUE);
|
|
|
|
|
|
|
|
if (PlayerHolder.getInstance().getQueueSize() > 1) {
|
|
|
|
addEntry(StreamDialogDefaultEntry.ENQUEUE_NEXT);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public void addStartHereEntries() {
|
|
|
|
addEntry(StreamDialogDefaultEntry.START_HERE_ON_BACKGROUND);
|
|
|
|
if (info.getStreamType() != StreamType.AUDIO_STREAM
|
|
|
|
&& info.getStreamType() != StreamType.AUDIO_LIVE_STREAM) {
|
|
|
|
addEntry(StreamDialogDefaultEntry.START_HERE_ON_POPUP);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Adds {@link StreamDialogDefaultEntry.MARK_AS_WATCHED} if the watch history is enabled
|
|
|
|
* and the stream is not a livestream.
|
|
|
|
* @param streamType the item's stream type
|
|
|
|
*/
|
|
|
|
public void addMarkAsWatchedEntryIfNeeded(final StreamType streamType) {
|
|
|
|
final boolean isWatchHistoryEnabled = PreferenceManager
|
|
|
|
.getDefaultSharedPreferences(activity)
|
|
|
|
.getBoolean(activity.getString(R.string.enable_watch_history_key), false);
|
|
|
|
if (streamType != StreamType.AUDIO_LIVE_STREAM
|
|
|
|
&& streamType != StreamType.LIVE_STREAM
|
|
|
|
&& isWatchHistoryEnabled) {
|
|
|
|
addEntry(StreamDialogDefaultEntry.MARK_AS_WATCHED);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public void addPlayWithKodiEntryIfNeeded() {
|
|
|
|
if (KoreUtils.shouldShowPlayWithKodi(activity, info.getServiceId())) {
|
|
|
|
addEntry(StreamDialogDefaultEntry.PLAY_WITH_KODI);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Creates the {@link InfoItemDialog}.
|
|
|
|
* @return a new instance of {@link InfoItemDialog}
|
|
|
|
*/
|
|
|
|
public InfoItemDialog create() {
|
|
|
|
return new InfoItemDialog(this.activity, this.fragment, this.info, this.entries);
|
|
|
|
}
|
|
|
|
}
|
2017-11-11 23:47:34 +01:00
|
|
|
}
|