2018-09-05 04:54:17 +02:00
|
|
|
package org.schabi.newpipe.settings.tabs;
|
|
|
|
|
|
|
|
import android.content.Context;
|
2019-10-20 02:31:14 +02:00
|
|
|
|
2019-10-04 14:59:08 +02:00
|
|
|
import androidx.annotation.DrawableRes;
|
|
|
|
import androidx.annotation.NonNull;
|
|
|
|
import androidx.annotation.Nullable;
|
|
|
|
import androidx.fragment.app.Fragment;
|
2018-09-05 04:54:17 +02:00
|
|
|
|
|
|
|
import com.grack.nanojson.JsonObject;
|
|
|
|
import com.grack.nanojson.JsonSink;
|
|
|
|
|
|
|
|
import org.schabi.newpipe.R;
|
2020-04-30 22:52:47 +02:00
|
|
|
import org.schabi.newpipe.database.LocalItem.LocalItemType;
|
2019-03-10 22:38:30 +01:00
|
|
|
import org.schabi.newpipe.extractor.NewPipe;
|
2019-10-20 02:31:14 +02:00
|
|
|
import org.schabi.newpipe.extractor.StreamingService;
|
2018-09-05 04:54:17 +02:00
|
|
|
import org.schabi.newpipe.extractor.exceptions.ExtractionException;
|
|
|
|
import org.schabi.newpipe.fragments.BlankFragment;
|
|
|
|
import org.schabi.newpipe.fragments.list.channel.ChannelFragment;
|
2019-10-20 02:31:14 +02:00
|
|
|
import org.schabi.newpipe.fragments.list.kiosk.DefaultKioskFragment;
|
2018-09-05 04:54:17 +02:00
|
|
|
import org.schabi.newpipe.fragments.list.kiosk.KioskFragment;
|
2020-04-30 22:52:47 +02:00
|
|
|
import org.schabi.newpipe.fragments.list.playlist.PlaylistFragment;
|
2018-09-05 04:54:17 +02:00
|
|
|
import org.schabi.newpipe.local.bookmark.BookmarkFragment;
|
|
|
|
import org.schabi.newpipe.local.feed.FeedFragment;
|
|
|
|
import org.schabi.newpipe.local.history.StatisticsPlaylistFragment;
|
2020-04-30 22:52:47 +02:00
|
|
|
import org.schabi.newpipe.local.playlist.LocalPlaylistFragment;
|
2018-09-05 04:54:17 +02:00
|
|
|
import org.schabi.newpipe.local.subscription.SubscriptionFragment;
|
2019-10-20 02:31:14 +02:00
|
|
|
import org.schabi.newpipe.report.ErrorActivity;
|
|
|
|
import org.schabi.newpipe.report.UserAction;
|
2018-09-05 04:54:17 +02:00
|
|
|
import org.schabi.newpipe.util.KioskTranslator;
|
2019-03-10 22:38:30 +01:00
|
|
|
import org.schabi.newpipe.util.ServiceHelper;
|
2018-09-05 04:54:17 +02:00
|
|
|
import org.schabi.newpipe.util.ThemeHelper;
|
|
|
|
|
2019-10-20 02:31:15 +02:00
|
|
|
import java.util.Objects;
|
|
|
|
|
2018-09-05 04:54:17 +02:00
|
|
|
public abstract class Tab {
|
|
|
|
private static final String JSON_TAB_ID_KEY = "tab_id";
|
|
|
|
|
2020-04-30 22:52:47 +02:00
|
|
|
Tab() {
|
|
|
|
}
|
2018-09-05 04:54:17 +02:00
|
|
|
|
2020-03-31 19:20:15 +02:00
|
|
|
Tab(@NonNull final JsonObject jsonObject) {
|
|
|
|
readDataFromJson(jsonObject);
|
2018-09-05 04:54:17 +02:00
|
|
|
}
|
|
|
|
|
2020-04-02 13:51:10 +02:00
|
|
|
/*//////////////////////////////////////////////////////////////////////////
|
|
|
|
// Tab Handling
|
|
|
|
//////////////////////////////////////////////////////////////////////////*/
|
|
|
|
|
2018-09-05 04:54:17 +02:00
|
|
|
@Nullable
|
2020-03-31 19:20:15 +02:00
|
|
|
public static Tab from(@NonNull final JsonObject jsonObject) {
|
2018-09-05 04:54:17 +02:00
|
|
|
final int tabId = jsonObject.getInt(Tab.JSON_TAB_ID_KEY, -1);
|
|
|
|
|
|
|
|
if (tabId == -1) {
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
|
|
|
|
return from(tabId, jsonObject);
|
|
|
|
}
|
|
|
|
|
|
|
|
@Nullable
|
|
|
|
public static Tab from(final int tabId) {
|
|
|
|
return from(tabId, null);
|
|
|
|
}
|
|
|
|
|
|
|
|
@Nullable
|
2020-03-31 19:20:15 +02:00
|
|
|
public static Type typeFrom(final int tabId) {
|
2018-09-05 04:54:17 +02:00
|
|
|
for (Type available : Type.values()) {
|
|
|
|
if (available.getTabId() == tabId) {
|
|
|
|
return available;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Nullable
|
2020-03-31 19:20:15 +02:00
|
|
|
private static Tab from(final int tabId, @Nullable final JsonObject jsonObject) {
|
2018-09-05 04:54:17 +02:00
|
|
|
final Type type = typeFrom(tabId);
|
|
|
|
|
|
|
|
if (type == null) {
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (jsonObject != null) {
|
|
|
|
switch (type) {
|
|
|
|
case KIOSK:
|
|
|
|
return new KioskTab(jsonObject);
|
|
|
|
case CHANNEL:
|
|
|
|
return new ChannelTab(jsonObject);
|
2020-04-30 22:52:47 +02:00
|
|
|
case PLAYLIST:
|
|
|
|
return new PlaylistTab(jsonObject);
|
2018-09-05 04:54:17 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return type.getTab();
|
|
|
|
}
|
|
|
|
|
2020-03-31 19:20:15 +02:00
|
|
|
public abstract int getTabId();
|
|
|
|
|
|
|
|
public abstract String getTabName(Context context);
|
|
|
|
|
|
|
|
@DrawableRes
|
|
|
|
public abstract int getTabIconRes(Context context);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Return a instance of the fragment that this tab represent.
|
|
|
|
*
|
|
|
|
* @param context Android app context
|
|
|
|
* @return the fragment this tab represents
|
|
|
|
*/
|
|
|
|
public abstract Fragment getFragment(Context context) throws ExtractionException;
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public boolean equals(final Object obj) {
|
|
|
|
if (obj == this) {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
return obj instanceof Tab && obj.getClass().equals(this.getClass())
|
|
|
|
&& ((Tab) obj).getTabId() == this.getTabId();
|
|
|
|
}
|
|
|
|
|
2020-04-02 13:51:10 +02:00
|
|
|
/*//////////////////////////////////////////////////////////////////////////
|
|
|
|
// JSON Handling
|
|
|
|
//////////////////////////////////////////////////////////////////////////*/
|
|
|
|
|
2020-03-31 19:20:15 +02:00
|
|
|
public void writeJsonOn(final JsonSink jsonSink) {
|
|
|
|
jsonSink.object();
|
|
|
|
|
|
|
|
jsonSink.value(JSON_TAB_ID_KEY, getTabId());
|
|
|
|
writeDataToJson(jsonSink);
|
|
|
|
|
|
|
|
jsonSink.end();
|
|
|
|
}
|
|
|
|
|
|
|
|
protected void writeDataToJson(final JsonSink writerSink) {
|
|
|
|
// No-op
|
|
|
|
}
|
|
|
|
|
|
|
|
protected void readDataFromJson(final JsonObject jsonObject) {
|
|
|
|
// No-op
|
|
|
|
}
|
|
|
|
|
2018-09-05 04:54:17 +02:00
|
|
|
/*//////////////////////////////////////////////////////////////////////////
|
|
|
|
// Implementations
|
|
|
|
//////////////////////////////////////////////////////////////////////////*/
|
|
|
|
|
|
|
|
public enum Type {
|
|
|
|
BLANK(new BlankTab()),
|
2019-10-20 02:31:14 +02:00
|
|
|
DEFAULT_KIOSK(new DefaultKioskTab()),
|
2018-09-05 04:54:17 +02:00
|
|
|
SUBSCRIPTIONS(new SubscriptionsTab()),
|
|
|
|
FEED(new FeedTab()),
|
|
|
|
BOOKMARKS(new BookmarksTab()),
|
|
|
|
HISTORY(new HistoryTab()),
|
|
|
|
KIOSK(new KioskTab()),
|
2020-04-30 22:52:47 +02:00
|
|
|
CHANNEL(new ChannelTab()),
|
|
|
|
PLAYLIST(new PlaylistTab());
|
2018-09-05 04:54:17 +02:00
|
|
|
|
|
|
|
private Tab tab;
|
|
|
|
|
2020-03-31 19:20:15 +02:00
|
|
|
Type(final Tab tab) {
|
2018-09-05 04:54:17 +02:00
|
|
|
this.tab = tab;
|
|
|
|
}
|
|
|
|
|
|
|
|
public int getTabId() {
|
|
|
|
return tab.getTabId();
|
|
|
|
}
|
|
|
|
|
|
|
|
public Tab getTab() {
|
|
|
|
return tab;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public static class BlankTab extends Tab {
|
|
|
|
public static final int ID = 0;
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public int getTabId() {
|
|
|
|
return ID;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
2020-03-31 19:20:15 +02:00
|
|
|
public String getTabName(final Context context) {
|
2018-09-05 04:54:17 +02:00
|
|
|
return "NewPipe"; //context.getString(R.string.blank_page_summary);
|
|
|
|
}
|
|
|
|
|
|
|
|
@DrawableRes
|
|
|
|
@Override
|
2020-03-31 19:20:15 +02:00
|
|
|
public int getTabIconRes(final Context context) {
|
2018-09-05 04:54:17 +02:00
|
|
|
return ThemeHelper.resolveResourceIdFromAttr(context, R.attr.ic_blank_page);
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
2020-03-31 19:20:15 +02:00
|
|
|
public BlankFragment getFragment(final Context context) {
|
2018-09-05 04:54:17 +02:00
|
|
|
return new BlankFragment();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public static class SubscriptionsTab extends Tab {
|
|
|
|
public static final int ID = 1;
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public int getTabId() {
|
|
|
|
return ID;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
2020-03-31 19:20:15 +02:00
|
|
|
public String getTabName(final Context context) {
|
2018-09-05 04:54:17 +02:00
|
|
|
return context.getString(R.string.tab_subscriptions);
|
|
|
|
}
|
|
|
|
|
|
|
|
@DrawableRes
|
|
|
|
@Override
|
2020-03-31 19:20:15 +02:00
|
|
|
public int getTabIconRes(final Context context) {
|
2018-09-05 04:54:17 +02:00
|
|
|
return ThemeHelper.resolveResourceIdFromAttr(context, R.attr.ic_channel);
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
2020-03-31 19:20:15 +02:00
|
|
|
public SubscriptionFragment getFragment(final Context context) {
|
2018-09-05 04:54:17 +02:00
|
|
|
return new SubscriptionFragment();
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
public static class FeedTab extends Tab {
|
|
|
|
public static final int ID = 2;
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public int getTabId() {
|
|
|
|
return ID;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
2020-03-31 19:20:15 +02:00
|
|
|
public String getTabName(final Context context) {
|
2019-10-11 06:09:28 +02:00
|
|
|
return context.getString(R.string.fragment_feed_title);
|
2018-09-05 04:54:17 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
@DrawableRes
|
|
|
|
@Override
|
2020-03-31 19:20:15 +02:00
|
|
|
public int getTabIconRes(final Context context) {
|
2020-03-25 16:23:47 +01:00
|
|
|
return ThemeHelper.resolveResourceIdFromAttr(context, R.attr.ic_rss);
|
2018-09-05 04:54:17 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
2020-03-31 19:20:15 +02:00
|
|
|
public FeedFragment getFragment(final Context context) {
|
2018-09-05 04:54:17 +02:00
|
|
|
return new FeedFragment();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public static class BookmarksTab extends Tab {
|
|
|
|
public static final int ID = 3;
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public int getTabId() {
|
|
|
|
return ID;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
2020-03-31 19:20:15 +02:00
|
|
|
public String getTabName(final Context context) {
|
2018-09-05 04:54:17 +02:00
|
|
|
return context.getString(R.string.tab_bookmarks);
|
|
|
|
}
|
|
|
|
|
|
|
|
@DrawableRes
|
|
|
|
@Override
|
2020-03-31 19:20:15 +02:00
|
|
|
public int getTabIconRes(final Context context) {
|
2018-09-05 04:54:17 +02:00
|
|
|
return ThemeHelper.resolveResourceIdFromAttr(context, R.attr.ic_bookmark);
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
2020-03-31 19:20:15 +02:00
|
|
|
public BookmarkFragment getFragment(final Context context) {
|
2018-09-05 04:54:17 +02:00
|
|
|
return new BookmarkFragment();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public static class HistoryTab extends Tab {
|
|
|
|
public static final int ID = 4;
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public int getTabId() {
|
|
|
|
return ID;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
2020-03-31 19:20:15 +02:00
|
|
|
public String getTabName(final Context context) {
|
2018-09-05 04:54:17 +02:00
|
|
|
return context.getString(R.string.title_activity_history);
|
|
|
|
}
|
|
|
|
|
|
|
|
@DrawableRes
|
|
|
|
@Override
|
2020-03-31 19:20:15 +02:00
|
|
|
public int getTabIconRes(final Context context) {
|
2020-03-25 16:23:47 +01:00
|
|
|
return ThemeHelper.resolveResourceIdFromAttr(context, R.attr.ic_history);
|
2018-09-05 04:54:17 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
2020-03-31 19:20:15 +02:00
|
|
|
public StatisticsPlaylistFragment getFragment(final Context context) {
|
2018-09-05 04:54:17 +02:00
|
|
|
return new StatisticsPlaylistFragment();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public static class KioskTab extends Tab {
|
|
|
|
public static final int ID = 5;
|
|
|
|
private static final String JSON_KIOSK_SERVICE_ID_KEY = "service_id";
|
|
|
|
private static final String JSON_KIOSK_ID_KEY = "kiosk_id";
|
2020-03-31 19:20:15 +02:00
|
|
|
private int kioskServiceId;
|
|
|
|
private String kioskId;
|
2018-09-05 04:54:17 +02:00
|
|
|
|
|
|
|
private KioskTab() {
|
|
|
|
this(-1, "<no-id>");
|
|
|
|
}
|
|
|
|
|
2020-03-31 19:20:15 +02:00
|
|
|
public KioskTab(final int kioskServiceId, final String kioskId) {
|
2018-09-05 04:54:17 +02:00
|
|
|
this.kioskServiceId = kioskServiceId;
|
|
|
|
this.kioskId = kioskId;
|
|
|
|
}
|
|
|
|
|
2020-03-31 19:20:15 +02:00
|
|
|
public KioskTab(final JsonObject jsonObject) {
|
2018-09-05 04:54:17 +02:00
|
|
|
super(jsonObject);
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public int getTabId() {
|
|
|
|
return ID;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
2020-03-31 19:20:15 +02:00
|
|
|
public String getTabName(final Context context) {
|
2018-09-05 04:54:17 +02:00
|
|
|
return KioskTranslator.getTranslatedKioskName(kioskId, context);
|
|
|
|
}
|
|
|
|
|
|
|
|
@DrawableRes
|
|
|
|
@Override
|
2020-03-31 19:20:15 +02:00
|
|
|
public int getTabIconRes(final Context context) {
|
2020-03-31 09:36:35 +02:00
|
|
|
final int kioskIcon = KioskTranslator.getKioskIcon(kioskId, context);
|
2018-09-05 04:54:17 +02:00
|
|
|
|
|
|
|
if (kioskIcon <= 0) {
|
|
|
|
throw new IllegalStateException("Kiosk ID is not valid: \"" + kioskId + "\"");
|
|
|
|
}
|
|
|
|
|
|
|
|
return kioskIcon;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
2020-03-31 19:20:15 +02:00
|
|
|
public KioskFragment getFragment(final Context context) throws ExtractionException {
|
2018-09-05 04:54:17 +02:00
|
|
|
return KioskFragment.getInstance(kioskServiceId, kioskId);
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
2020-03-31 19:20:15 +02:00
|
|
|
protected void writeDataToJson(final JsonSink writerSink) {
|
2018-09-05 04:54:17 +02:00
|
|
|
writerSink.value(JSON_KIOSK_SERVICE_ID_KEY, kioskServiceId)
|
|
|
|
.value(JSON_KIOSK_ID_KEY, kioskId);
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
2020-03-31 19:20:15 +02:00
|
|
|
protected void readDataFromJson(final JsonObject jsonObject) {
|
2018-09-05 04:54:17 +02:00
|
|
|
kioskServiceId = jsonObject.getInt(JSON_KIOSK_SERVICE_ID_KEY, -1);
|
|
|
|
kioskId = jsonObject.getString(JSON_KIOSK_ID_KEY, "<no-id>");
|
|
|
|
}
|
|
|
|
|
2019-10-20 02:31:15 +02:00
|
|
|
@Override
|
2020-03-31 19:20:15 +02:00
|
|
|
public boolean equals(final Object obj) {
|
|
|
|
return super.equals(obj) && kioskServiceId == ((KioskTab) obj).kioskServiceId
|
2019-10-20 02:31:15 +02:00
|
|
|
&& Objects.equals(kioskId, ((KioskTab) obj).kioskId);
|
|
|
|
}
|
|
|
|
|
2018-09-05 04:54:17 +02:00
|
|
|
public int getKioskServiceId() {
|
|
|
|
return kioskServiceId;
|
|
|
|
}
|
|
|
|
|
|
|
|
public String getKioskId() {
|
|
|
|
return kioskId;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public static class ChannelTab extends Tab {
|
|
|
|
public static final int ID = 6;
|
|
|
|
private static final String JSON_CHANNEL_SERVICE_ID_KEY = "channel_service_id";
|
|
|
|
private static final String JSON_CHANNEL_URL_KEY = "channel_url";
|
|
|
|
private static final String JSON_CHANNEL_NAME_KEY = "channel_name";
|
2020-03-31 19:20:15 +02:00
|
|
|
private int channelServiceId;
|
|
|
|
private String channelUrl;
|
|
|
|
private String channelName;
|
2018-09-05 04:54:17 +02:00
|
|
|
|
|
|
|
private ChannelTab() {
|
|
|
|
this(-1, "<no-url>", "<no-name>");
|
|
|
|
}
|
|
|
|
|
2020-03-31 19:20:15 +02:00
|
|
|
public ChannelTab(final int channelServiceId, final String channelUrl,
|
|
|
|
final String channelName) {
|
2018-09-05 04:54:17 +02:00
|
|
|
this.channelServiceId = channelServiceId;
|
|
|
|
this.channelUrl = channelUrl;
|
|
|
|
this.channelName = channelName;
|
|
|
|
}
|
|
|
|
|
2020-03-31 19:20:15 +02:00
|
|
|
public ChannelTab(final JsonObject jsonObject) {
|
2018-09-05 04:54:17 +02:00
|
|
|
super(jsonObject);
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public int getTabId() {
|
|
|
|
return ID;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
2020-03-31 19:20:15 +02:00
|
|
|
public String getTabName(final Context context) {
|
2018-09-05 04:54:17 +02:00
|
|
|
return channelName;
|
|
|
|
}
|
|
|
|
|
|
|
|
@DrawableRes
|
|
|
|
@Override
|
2020-03-31 19:20:15 +02:00
|
|
|
public int getTabIconRes(final Context context) {
|
2018-09-05 04:54:17 +02:00
|
|
|
return ThemeHelper.resolveResourceIdFromAttr(context, R.attr.ic_channel);
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
2020-03-31 19:20:15 +02:00
|
|
|
public ChannelFragment getFragment(final Context context) {
|
2018-09-05 04:54:17 +02:00
|
|
|
return ChannelFragment.getInstance(channelServiceId, channelUrl, channelName);
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
2020-03-31 19:20:15 +02:00
|
|
|
protected void writeDataToJson(final JsonSink writerSink) {
|
2018-09-05 04:54:17 +02:00
|
|
|
writerSink.value(JSON_CHANNEL_SERVICE_ID_KEY, channelServiceId)
|
|
|
|
.value(JSON_CHANNEL_URL_KEY, channelUrl)
|
|
|
|
.value(JSON_CHANNEL_NAME_KEY, channelName);
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
2020-03-31 19:20:15 +02:00
|
|
|
protected void readDataFromJson(final JsonObject jsonObject) {
|
2018-09-05 04:54:17 +02:00
|
|
|
channelServiceId = jsonObject.getInt(JSON_CHANNEL_SERVICE_ID_KEY, -1);
|
|
|
|
channelUrl = jsonObject.getString(JSON_CHANNEL_URL_KEY, "<no-url>");
|
|
|
|
channelName = jsonObject.getString(JSON_CHANNEL_NAME_KEY, "<no-name>");
|
|
|
|
}
|
|
|
|
|
2019-10-20 02:31:15 +02:00
|
|
|
@Override
|
2020-03-31 19:20:15 +02:00
|
|
|
public boolean equals(final Object obj) {
|
|
|
|
return super.equals(obj) && channelServiceId == ((ChannelTab) obj).channelServiceId
|
2019-10-20 02:31:15 +02:00
|
|
|
&& Objects.equals(channelUrl, ((ChannelTab) obj).channelUrl)
|
|
|
|
&& Objects.equals(channelName, ((ChannelTab) obj).channelName);
|
|
|
|
}
|
|
|
|
|
2018-09-05 04:54:17 +02:00
|
|
|
public int getChannelServiceId() {
|
|
|
|
return channelServiceId;
|
|
|
|
}
|
|
|
|
|
|
|
|
public String getChannelUrl() {
|
|
|
|
return channelUrl;
|
|
|
|
}
|
|
|
|
|
|
|
|
public String getChannelName() {
|
|
|
|
return channelName;
|
|
|
|
}
|
|
|
|
}
|
2019-03-10 22:38:30 +01:00
|
|
|
|
|
|
|
public static class DefaultKioskTab extends Tab {
|
|
|
|
public static final int ID = 7;
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public int getTabId() {
|
|
|
|
return ID;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
2020-03-31 19:20:15 +02:00
|
|
|
public String getTabName(final Context context) {
|
2019-10-20 02:31:14 +02:00
|
|
|
return KioskTranslator.getTranslatedKioskName(getDefaultKioskId(context), context);
|
2019-03-10 22:38:30 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
@DrawableRes
|
|
|
|
@Override
|
2020-03-31 19:20:15 +02:00
|
|
|
public int getTabIconRes(final Context context) {
|
2020-03-31 09:36:35 +02:00
|
|
|
return KioskTranslator.getKioskIcon(getDefaultKioskId(context), context);
|
2019-03-10 22:38:30 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
2020-03-31 19:20:15 +02:00
|
|
|
public DefaultKioskFragment getFragment(final Context context) {
|
2019-10-20 02:31:14 +02:00
|
|
|
return new DefaultKioskFragment();
|
2019-03-10 22:38:30 +01:00
|
|
|
}
|
|
|
|
|
2020-03-31 19:20:15 +02:00
|
|
|
private String getDefaultKioskId(final Context context) {
|
2019-10-20 02:31:14 +02:00
|
|
|
final int kioskServiceId = ServiceHelper.getSelectedServiceId(context);
|
|
|
|
|
|
|
|
String kioskId = "";
|
|
|
|
try {
|
|
|
|
final StreamingService service = NewPipe.getService(kioskServiceId);
|
|
|
|
kioskId = service.getKioskList().getDefaultKioskId();
|
|
|
|
} catch (ExtractionException e) {
|
|
|
|
ErrorActivity.reportError(context, e, null, null,
|
2020-03-31 19:20:15 +02:00
|
|
|
ErrorActivity.ErrorInfo.make(UserAction.REQUESTED_KIOSK, "none",
|
|
|
|
"Loading default kiosk from selected service", 0));
|
2019-10-20 02:31:14 +02:00
|
|
|
}
|
2019-03-10 22:38:30 +01:00
|
|
|
return kioskId;
|
|
|
|
}
|
|
|
|
}
|
2020-04-30 22:52:47 +02:00
|
|
|
|
|
|
|
public static class PlaylistTab extends Tab {
|
|
|
|
public static final int ID = 8;
|
|
|
|
private static final String JSON_PLAYLIST_SERVICE_ID_KEY = "playlist_service_id";
|
|
|
|
private static final String JSON_PLAYLIST_URL_KEY = "playlist_url";
|
|
|
|
private static final String JSON_PLAYLIST_NAME_KEY = "playlist_name";
|
|
|
|
private static final String JSON_PLAYLIST_ID_KEY = "playlist_id";
|
|
|
|
private static final String JSON_PLAYLIST_TYPE_KEY = "playlist_type";
|
|
|
|
private int playlistServiceId;
|
|
|
|
private String playlistUrl;
|
|
|
|
private String playlistName;
|
|
|
|
private long playlistId;
|
|
|
|
private LocalItemType playlistType;
|
|
|
|
|
|
|
|
private PlaylistTab() {
|
2020-05-02 23:14:31 +02:00
|
|
|
this(-1, "<no-name>");
|
2020-04-30 22:52:47 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
public PlaylistTab(final long playlistId, final String playlistName) {
|
|
|
|
this.playlistName = playlistName;
|
|
|
|
this.playlistId = playlistId;
|
|
|
|
this.playlistType = LocalItemType.PLAYLIST_LOCAL_ITEM;
|
|
|
|
this.playlistServiceId = -1;
|
|
|
|
this.playlistUrl = "<no-url>";
|
|
|
|
}
|
|
|
|
|
|
|
|
public PlaylistTab(final int playlistServiceId, final String playlistUrl,
|
|
|
|
final String playlistName) {
|
|
|
|
this.playlistServiceId = playlistServiceId;
|
|
|
|
this.playlistUrl = playlistUrl;
|
|
|
|
this.playlistName = playlistName;
|
|
|
|
this.playlistType = LocalItemType.PLAYLIST_REMOTE_ITEM;
|
|
|
|
this.playlistId = -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
public PlaylistTab(final JsonObject jsonObject) {
|
|
|
|
super(jsonObject);
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public int getTabId() {
|
|
|
|
return ID;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public String getTabName(final Context context) {
|
|
|
|
return playlistName;
|
|
|
|
}
|
|
|
|
|
|
|
|
@DrawableRes
|
|
|
|
@Override
|
|
|
|
public int getTabIconRes(final Context context) {
|
2020-05-02 23:14:31 +02:00
|
|
|
return ThemeHelper.resolveResourceIdFromAttr(context, R.attr.ic_bookmark);
|
2020-04-30 22:52:47 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public Fragment getFragment(final Context context) {
|
|
|
|
if (playlistType == LocalItemType.PLAYLIST_LOCAL_ITEM) {
|
2020-05-02 23:14:31 +02:00
|
|
|
return LocalPlaylistFragment.getInstance(playlistId, playlistName);
|
2020-04-30 22:52:47 +02:00
|
|
|
|
|
|
|
} else { // playlistType == LocalItemType.PLAYLIST_REMOTE_ITEM
|
2020-05-02 23:14:31 +02:00
|
|
|
return PlaylistFragment.getInstance(playlistServiceId, playlistUrl, playlistName);
|
2020-04-30 22:52:47 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
protected void writeDataToJson(final JsonSink writerSink) {
|
|
|
|
writerSink.value(JSON_PLAYLIST_SERVICE_ID_KEY, playlistServiceId)
|
|
|
|
.value(JSON_PLAYLIST_URL_KEY, playlistUrl)
|
|
|
|
.value(JSON_PLAYLIST_NAME_KEY, playlistName)
|
|
|
|
.value(JSON_PLAYLIST_ID_KEY, playlistId)
|
|
|
|
.value(JSON_PLAYLIST_TYPE_KEY, playlistType.toString());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
protected void readDataFromJson(final JsonObject jsonObject) {
|
|
|
|
playlistServiceId = jsonObject.getInt(JSON_PLAYLIST_SERVICE_ID_KEY, -1);
|
|
|
|
playlistUrl = jsonObject.getString(JSON_PLAYLIST_URL_KEY, "<no-url>");
|
|
|
|
playlistName = jsonObject.getString(JSON_PLAYLIST_NAME_KEY, "<no-name>");
|
|
|
|
playlistId = jsonObject.getInt(JSON_PLAYLIST_ID_KEY, -1);
|
|
|
|
playlistType = LocalItemType.valueOf(
|
|
|
|
jsonObject.getString(JSON_PLAYLIST_TYPE_KEY,
|
|
|
|
LocalItemType.PLAYLIST_LOCAL_ITEM.toString())
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public boolean equals(final Object obj) {
|
2020-06-28 22:55:18 +02:00
|
|
|
if (!(super.equals(obj)
|
2020-04-30 22:52:47 +02:00
|
|
|
&& Objects.equals(playlistType, ((PlaylistTab) obj).playlistType)
|
2020-06-28 22:55:18 +02:00
|
|
|
&& Objects.equals(playlistName, ((PlaylistTab) obj).playlistName))) {
|
|
|
|
return false; // base objects are different
|
2020-04-30 22:52:47 +02:00
|
|
|
}
|
|
|
|
|
2020-06-28 22:55:18 +02:00
|
|
|
return (playlistId == ((PlaylistTab) obj).playlistId) // local
|
|
|
|
|| (playlistServiceId == ((PlaylistTab) obj).playlistServiceId // remote
|
|
|
|
&& Objects.equals(playlistUrl, ((PlaylistTab) obj).playlistUrl));
|
2020-04-30 22:52:47 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
public int getPlaylistServiceId() {
|
|
|
|
return playlistServiceId;
|
|
|
|
}
|
|
|
|
|
|
|
|
public String getPlaylistUrl() {
|
|
|
|
return playlistUrl;
|
|
|
|
}
|
|
|
|
|
|
|
|
public String getPlaylistName() {
|
|
|
|
return playlistName;
|
|
|
|
}
|
|
|
|
|
|
|
|
public long getPlaylistId() {
|
|
|
|
return playlistId;
|
|
|
|
}
|
|
|
|
|
|
|
|
public LocalItemType getPlaylistType() {
|
|
|
|
return playlistType;
|
|
|
|
}
|
|
|
|
}
|
2018-09-05 04:54:17 +02:00
|
|
|
}
|