From ef15902ec4f5a1a7e1261990587772ba78776ab4 Mon Sep 17 00:00:00 2001 From: Christian Schabesberger Date: Sat, 11 Feb 2017 21:33:01 +0100 Subject: [PATCH 1/9] add InfoItem --- .../detail/VideoItemDetailFragment.java | 4 +-- .../newpipe/extractor/AbstractStreamInfo.java | 4 +-- .../schabi/newpipe/extractor/InfoItem.java | 35 +++++++++++++++++++ .../extractor/channel/ChannelExtractor.java | 10 +++--- .../extractor/channel/ChannelInfo.java | 9 ++--- .../extractor/channel/ChannelInfoItem.java | 8 +++++ .../extractor/search/SearchEngine.java | 8 ++--- .../extractor/search/SearchResult.java | 4 +-- ...ava => StreamInfoSearchItemCollector.java} | 8 ++--- .../youtube/YoutubeChannelExtractor.java | 10 +++--- .../services/youtube/YoutubeSearchEngine.java | 12 +++---- .../youtube/YoutubeStreamExtractor.java | 16 ++++----- ...va => YoutubeStreamInfoItemExtractor.java} | 8 ++--- .../stream_info/StreamExtractor.java | 10 +++--- .../extractor/stream_info/StreamInfo.java | 16 ++++----- ...amPreviewInfo.java => StreamInfoItem.java} | 4 +-- ...ctor.java => StreamInfoItemCollector.java} | 15 ++++---- ...ctor.java => StreamInfoItemExtractor.java} | 4 +-- .../newpipe/info_list/InfoItemBuilder.java | 6 ++-- .../newpipe/info_list/InfoListAdapter.java | 6 ++-- 20 files changed, 120 insertions(+), 77 deletions(-) create mode 100644 app/src/main/java/org/schabi/newpipe/extractor/InfoItem.java create mode 100644 app/src/main/java/org/schabi/newpipe/extractor/channel/ChannelInfoItem.java rename app/src/main/java/org/schabi/newpipe/extractor/search/{StreamPreviewInfoSearchCollector.java => StreamInfoSearchItemCollector.java} (81%) rename app/src/main/java/org/schabi/newpipe/extractor/services/youtube/{YoutubeStreamPreviewInfoExtractor.java => YoutubeStreamInfoItemExtractor.java} (95%) rename app/src/main/java/org/schabi/newpipe/extractor/stream_info/{StreamPreviewInfo.java => StreamInfoItem.java} (90%) rename app/src/main/java/org/schabi/newpipe/extractor/stream_info/{StreamPreviewInfoCollector.java => StreamInfoItemCollector.java} (85%) rename app/src/main/java/org/schabi/newpipe/extractor/stream_info/{StreamPreviewInfoExtractor.java => StreamInfoItemExtractor.java} (93%) diff --git a/app/src/main/java/org/schabi/newpipe/detail/VideoItemDetailFragment.java b/app/src/main/java/org/schabi/newpipe/detail/VideoItemDetailFragment.java index eb75dfa6d..8f2496740 100644 --- a/app/src/main/java/org/schabi/newpipe/detail/VideoItemDetailFragment.java +++ b/app/src/main/java/org/schabi/newpipe/detail/VideoItemDetailFragment.java @@ -50,7 +50,7 @@ import org.schabi.newpipe.extractor.MediaFormat; import org.schabi.newpipe.extractor.NewPipe; import org.schabi.newpipe.extractor.stream_info.AudioStream; import org.schabi.newpipe.extractor.stream_info.StreamInfo; -import org.schabi.newpipe.extractor.stream_info.StreamPreviewInfo; +import org.schabi.newpipe.extractor.stream_info.StreamInfoItem; import org.schabi.newpipe.extractor.stream_info.VideoStream; import org.schabi.newpipe.info_list.InfoItemBuilder; import org.schabi.newpipe.player.BackgroundPlayer; @@ -536,7 +536,7 @@ public class VideoItemDetailFragment extends Fragment { private void initSimilarVideos(final StreamInfo info) { LinearLayout similarLayout = (LinearLayout) activity.findViewById(R.id.similar_streams_view); - for (final StreamPreviewInfo item : info.related_streams) { + for (final StreamInfoItem item : info.related_streams) { similarLayout.addView(infoItemBuilder.buildView(similarLayout, item)); } infoItemBuilder.setOnItemSelectedListener(new InfoItemBuilder.OnItemSelectedListener() { diff --git a/app/src/main/java/org/schabi/newpipe/extractor/AbstractStreamInfo.java b/app/src/main/java/org/schabi/newpipe/extractor/AbstractStreamInfo.java index 308f5127d..bfa86b3f7 100644 --- a/app/src/main/java/org/schabi/newpipe/extractor/AbstractStreamInfo.java +++ b/app/src/main/java/org/schabi/newpipe/extractor/AbstractStreamInfo.java @@ -18,9 +18,9 @@ package org.schabi.newpipe.extractor; * along with NewPipe. If not, see . */ -/**Common properties between StreamInfo and StreamPreviewInfo.*/ +/**Common properties between StreamInfo and StreamInfoItem.*/ public abstract class AbstractStreamInfo { - public static enum StreamType { + public enum StreamType { NONE, // placeholder to check if stream type was checked or not VIDEO_STREAM, AUDIO_STREAM, diff --git a/app/src/main/java/org/schabi/newpipe/extractor/InfoItem.java b/app/src/main/java/org/schabi/newpipe/extractor/InfoItem.java new file mode 100644 index 000000000..1b95a3868 --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/extractor/InfoItem.java @@ -0,0 +1,35 @@ +package org.schabi.newpipe.extractor; + +import android.icu.text.IDNA; + +import static org.schabi.newpipe.extractor.InfoItem.InfoType.STREAM; + +/** + * Created by the-scrabi on 11.02.17. + * + * Copyright (C) Christian Schabesberger 2017 + * InfoItem.java is part of NewPipe. + * + * NewPipe is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * NewPipe is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with NewPipe. If not, see . + */ + +public interface InfoItem { + public enum InfoType { + STREAM, + PLAYLIST, + CHANNEL + } + void setInfoType(InfoType iT); + InfoType getInfoType(); +} diff --git a/app/src/main/java/org/schabi/newpipe/extractor/channel/ChannelExtractor.java b/app/src/main/java/org/schabi/newpipe/extractor/channel/ChannelExtractor.java index 35d3604d9..18bf67550 100644 --- a/app/src/main/java/org/schabi/newpipe/extractor/channel/ChannelExtractor.java +++ b/app/src/main/java/org/schabi/newpipe/extractor/channel/ChannelExtractor.java @@ -3,7 +3,7 @@ package org.schabi.newpipe.extractor.channel; import org.schabi.newpipe.extractor.UrlIdHandler; import org.schabi.newpipe.extractor.exceptions.ExtractionException; import org.schabi.newpipe.extractor.exceptions.ParsingException; -import org.schabi.newpipe.extractor.stream_info.StreamPreviewInfoCollector; +import org.schabi.newpipe.extractor.stream_info.StreamInfoItemCollector; import java.io.IOException; @@ -31,7 +31,7 @@ public abstract class ChannelExtractor { private int serviceId; private String url; private UrlIdHandler urlIdHandler; - private StreamPreviewInfoCollector previewInfoCollector; + private StreamInfoItemCollector previewInfoCollector; private int page = -1; public ChannelExtractor(UrlIdHandler urlIdHandler, String url, int page, int serviceId) @@ -40,12 +40,12 @@ public abstract class ChannelExtractor { this.page = page; this.serviceId = serviceId; this.urlIdHandler = urlIdHandler; - previewInfoCollector = new StreamPreviewInfoCollector(urlIdHandler, serviceId); + previewInfoCollector = new StreamInfoItemCollector(urlIdHandler, serviceId); } public String getUrl() { return url; } public UrlIdHandler getUrlIdHandler() { return urlIdHandler; } - public StreamPreviewInfoCollector getStreamPreviewInfoCollector() { + public StreamInfoItemCollector getStreamPreviewInfoCollector() { return previewInfoCollector; } @@ -53,7 +53,7 @@ public abstract class ChannelExtractor { public abstract String getAvatarUrl() throws ParsingException; public abstract String getBannerUrl() throws ParsingException; public abstract String getFeedUrl() throws ParsingException; - public abstract StreamPreviewInfoCollector getStreams() throws ParsingException; + public abstract StreamInfoItemCollector getStreams() throws ParsingException; public abstract boolean hasNextPage() throws ParsingException; public int getServiceId() { return serviceId; diff --git a/app/src/main/java/org/schabi/newpipe/extractor/channel/ChannelInfo.java b/app/src/main/java/org/schabi/newpipe/extractor/channel/ChannelInfo.java index 7dc4b00e0..2cf0733d9 100644 --- a/app/src/main/java/org/schabi/newpipe/extractor/channel/ChannelInfo.java +++ b/app/src/main/java/org/schabi/newpipe/extractor/channel/ChannelInfo.java @@ -1,8 +1,9 @@ package org.schabi.newpipe.extractor.channel; +import org.schabi.newpipe.extractor.InfoItem; import org.schabi.newpipe.extractor.exceptions.ParsingException; -import org.schabi.newpipe.extractor.stream_info.StreamPreviewInfo; -import org.schabi.newpipe.extractor.stream_info.StreamPreviewInfoCollector; +import org.schabi.newpipe.extractor.stream_info.StreamInfoItem; +import org.schabi.newpipe.extractor.stream_info.StreamInfoItemCollector; import java.util.List; import java.util.Vector; @@ -59,7 +60,7 @@ public class ChannelInfo { info.errors.add(e); } try { - StreamPreviewInfoCollector c = extractor.getStreams(); + StreamInfoItemCollector c = extractor.getStreams(); info.related_streams = c.getItemList(); info.errors.addAll(c.getErrors()); } catch(Exception e) { @@ -74,7 +75,7 @@ public class ChannelInfo { public String avatar_url = ""; public String banner_url = ""; public String feed_url = ""; - public List related_streams = null; + public List related_streams = null; public boolean hasNextPage = false; public List errors = new Vector<>(); diff --git a/app/src/main/java/org/schabi/newpipe/extractor/channel/ChannelInfoItem.java b/app/src/main/java/org/schabi/newpipe/extractor/channel/ChannelInfoItem.java new file mode 100644 index 000000000..21f4b5eaa --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/extractor/channel/ChannelInfoItem.java @@ -0,0 +1,8 @@ +package org.schabi.newpipe.extractor.channel; + +/** + * Created by the-scrabi on 11.02.17. + */ + +public class ChannelInfoItem { +} diff --git a/app/src/main/java/org/schabi/newpipe/extractor/search/SearchEngine.java b/app/src/main/java/org/schabi/newpipe/extractor/search/SearchEngine.java index b0dfbfc8a..669ad266b 100644 --- a/app/src/main/java/org/schabi/newpipe/extractor/search/SearchEngine.java +++ b/app/src/main/java/org/schabi/newpipe/extractor/search/SearchEngine.java @@ -32,18 +32,18 @@ public abstract class SearchEngine { } } - private StreamPreviewInfoSearchCollector collector; + private StreamInfoSearchItemCollector collector; public SearchEngine(UrlIdHandler urlIdHandler, int serviceId) { - collector = new StreamPreviewInfoSearchCollector(urlIdHandler, serviceId); + collector = new StreamInfoSearchItemCollector(urlIdHandler, serviceId); } - protected StreamPreviewInfoSearchCollector getStreamPreviewInfoSearchCollector() { + protected StreamInfoSearchItemCollector getStreamPreviewInfoSearchCollector() { return collector; } //Result search(String query, int page); - public abstract StreamPreviewInfoSearchCollector search( + public abstract StreamInfoSearchItemCollector search( String query, int page, String contentCountry) throws ExtractionException, IOException; } diff --git a/app/src/main/java/org/schabi/newpipe/extractor/search/SearchResult.java b/app/src/main/java/org/schabi/newpipe/extractor/search/SearchResult.java index 97ceb46fb..7fa56a3e9 100644 --- a/app/src/main/java/org/schabi/newpipe/extractor/search/SearchResult.java +++ b/app/src/main/java/org/schabi/newpipe/extractor/search/SearchResult.java @@ -1,7 +1,7 @@ package org.schabi.newpipe.extractor.search; import org.schabi.newpipe.extractor.exceptions.ExtractionException; -import org.schabi.newpipe.extractor.stream_info.StreamPreviewInfo; +import org.schabi.newpipe.extractor.stream_info.StreamInfoItem; import java.io.IOException; import java.util.List; @@ -45,6 +45,6 @@ public class SearchResult { } public String suggestion = ""; - public List resultList = new Vector<>(); + public List resultList = new Vector<>(); public List errors = new Vector<>(); } diff --git a/app/src/main/java/org/schabi/newpipe/extractor/search/StreamPreviewInfoSearchCollector.java b/app/src/main/java/org/schabi/newpipe/extractor/search/StreamInfoSearchItemCollector.java similarity index 81% rename from app/src/main/java/org/schabi/newpipe/extractor/search/StreamPreviewInfoSearchCollector.java rename to app/src/main/java/org/schabi/newpipe/extractor/search/StreamInfoSearchItemCollector.java index 40874f717..17be8e17e 100644 --- a/app/src/main/java/org/schabi/newpipe/extractor/search/StreamPreviewInfoSearchCollector.java +++ b/app/src/main/java/org/schabi/newpipe/extractor/search/StreamInfoSearchItemCollector.java @@ -1,13 +1,13 @@ package org.schabi.newpipe.extractor.search; import org.schabi.newpipe.extractor.UrlIdHandler; -import org.schabi.newpipe.extractor.stream_info.StreamPreviewInfoCollector; +import org.schabi.newpipe.extractor.stream_info.StreamInfoItemCollector; /** * Created by Christian Schabesberger on 11.05.16. * * Copyright (C) Christian Schabesberger 2016 - * StreamPreviewInfoSearchCollector.java is part of NewPipe. + * StreamInfoSearchItemCollector.java is part of NewPipe. * * NewPipe is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -23,11 +23,11 @@ import org.schabi.newpipe.extractor.stream_info.StreamPreviewInfoCollector; * along with NewPipe. If not, see . */ -public class StreamPreviewInfoSearchCollector extends StreamPreviewInfoCollector { +public class StreamInfoSearchItemCollector extends StreamInfoItemCollector { private String suggestion = ""; - public StreamPreviewInfoSearchCollector(UrlIdHandler handler, int serviceId) { + public StreamInfoSearchItemCollector(UrlIdHandler handler, int serviceId) { super(handler, serviceId); } diff --git a/app/src/main/java/org/schabi/newpipe/extractor/services/youtube/YoutubeChannelExtractor.java b/app/src/main/java/org/schabi/newpipe/extractor/services/youtube/YoutubeChannelExtractor.java index 62e63ab1b..65803a6f7 100644 --- a/app/src/main/java/org/schabi/newpipe/extractor/services/youtube/YoutubeChannelExtractor.java +++ b/app/src/main/java/org/schabi/newpipe/extractor/services/youtube/YoutubeChannelExtractor.java @@ -15,8 +15,8 @@ import org.schabi.newpipe.extractor.UrlIdHandler; import org.schabi.newpipe.extractor.channel.ChannelExtractor; import org.schabi.newpipe.extractor.exceptions.ExtractionException; import org.schabi.newpipe.extractor.exceptions.ParsingException; -import org.schabi.newpipe.extractor.stream_info.StreamPreviewInfoCollector; -import org.schabi.newpipe.extractor.stream_info.StreamPreviewInfoExtractor; +import org.schabi.newpipe.extractor.stream_info.StreamInfoItemCollector; +import org.schabi.newpipe.extractor.stream_info.StreamInfoItemExtractor; import java.io.IOException; @@ -150,8 +150,8 @@ public class YoutubeChannelExtractor extends ChannelExtractor { } @Override - public StreamPreviewInfoCollector getStreams() throws ParsingException { - StreamPreviewInfoCollector collector = getStreamPreviewInfoCollector(); + public StreamInfoItemCollector getStreams() throws ParsingException { + StreamInfoItemCollector collector = getStreamPreviewInfoCollector(); Element ul = null; if(isAjaxPage) { ul = doc.select("body").first(); @@ -161,7 +161,7 @@ public class YoutubeChannelExtractor extends ChannelExtractor { for(final Element li : ul.children()) { if (li.select("div[class=\"feed-item-dismissable\"]").first() != null) { - collector.commit(new StreamPreviewInfoExtractor() { + collector.commit(new StreamInfoItemExtractor() { @Override public AbstractStreamInfo.StreamType getStreamType() throws ParsingException { return AbstractStreamInfo.StreamType.VIDEO_STREAM; diff --git a/app/src/main/java/org/schabi/newpipe/extractor/services/youtube/YoutubeSearchEngine.java b/app/src/main/java/org/schabi/newpipe/extractor/services/youtube/YoutubeSearchEngine.java index 55e05bb76..e4314f716 100644 --- a/app/src/main/java/org/schabi/newpipe/extractor/services/youtube/YoutubeSearchEngine.java +++ b/app/src/main/java/org/schabi/newpipe/extractor/services/youtube/YoutubeSearchEngine.java @@ -8,8 +8,8 @@ import org.schabi.newpipe.extractor.NewPipe; import org.schabi.newpipe.extractor.UrlIdHandler; import org.schabi.newpipe.extractor.exceptions.ExtractionException; import org.schabi.newpipe.extractor.search.SearchEngine; -import org.schabi.newpipe.extractor.search.StreamPreviewInfoSearchCollector; -import org.schabi.newpipe.extractor.stream_info.StreamPreviewInfoExtractor; +import org.schabi.newpipe.extractor.search.StreamInfoSearchItemCollector; +import org.schabi.newpipe.extractor.stream_info.StreamInfoItemExtractor; import java.net.URLEncoder; import java.io.IOException; @@ -45,9 +45,9 @@ public class YoutubeSearchEngine extends SearchEngine { } @Override - public StreamPreviewInfoSearchCollector search(String query, int page, String languageCode) + public StreamInfoSearchItemCollector search(String query, int page, String languageCode) throws IOException, ExtractionException { - StreamPreviewInfoSearchCollector collector = getStreamPreviewInfoSearchCollector(); + StreamInfoSearchItemCollector collector = getStreamPreviewInfoSearchCollector(); Downloader downloader = NewPipe.getDownloader(); @@ -107,7 +107,7 @@ public class YoutubeSearchEngine extends SearchEngine { return collector; } - private StreamPreviewInfoExtractor extractPreviewInfo(final Element item) { - return new YoutubeStreamPreviewInfoExtractor(item); + private StreamInfoItemExtractor extractPreviewInfo(final Element item) { + return new YoutubeStreamInfoItemExtractor(item); } } diff --git a/app/src/main/java/org/schabi/newpipe/extractor/services/youtube/YoutubeStreamExtractor.java b/app/src/main/java/org/schabi/newpipe/extractor/services/youtube/YoutubeStreamExtractor.java index 6dd0daa7c..30846fedc 100644 --- a/app/src/main/java/org/schabi/newpipe/extractor/services/youtube/YoutubeStreamExtractor.java +++ b/app/src/main/java/org/schabi/newpipe/extractor/services/youtube/YoutubeStreamExtractor.java @@ -20,8 +20,8 @@ import org.schabi.newpipe.extractor.UrlIdHandler; import org.schabi.newpipe.extractor.MediaFormat; import org.schabi.newpipe.extractor.stream_info.StreamExtractor; import org.schabi.newpipe.extractor.stream_info.StreamInfo; -import org.schabi.newpipe.extractor.stream_info.StreamPreviewInfoCollector; -import org.schabi.newpipe.extractor.stream_info.StreamPreviewInfoExtractor; +import org.schabi.newpipe.extractor.stream_info.StreamInfoItemCollector; +import org.schabi.newpipe.extractor.stream_info.StreamInfoItemExtractor; import org.schabi.newpipe.extractor.stream_info.VideoStream; import java.io.IOException; @@ -657,7 +657,7 @@ public class YoutubeStreamExtractor extends StreamExtractor { } @Override - public StreamPreviewInfoExtractor getNextVideo() throws ParsingException { + public StreamInfoItemExtractor getNextVideo() throws ParsingException { try { return extractVideoPreviewInfo(doc.select("div[class=\"watch-sidebar-section\"]").first() .select("li").first()); @@ -667,9 +667,9 @@ public class YoutubeStreamExtractor extends StreamExtractor { } @Override - public StreamPreviewInfoCollector getRelatedVideos() throws ParsingException { + public StreamInfoItemCollector getRelatedVideos() throws ParsingException { try { - StreamPreviewInfoCollector collector = getStreamPreviewInfoCollector(); + StreamInfoItemCollector collector = getStreamPreviewInfoCollector(); Element ul = doc.select("ul[id=\"watch-related\"]").first(); if(ul != null) { for (Element li : ul.children()) { @@ -707,10 +707,10 @@ public class YoutubeStreamExtractor extends StreamExtractor { } /**Provides information about links to other videos on the video page, such as related videos. - * This is encapsulated in a StreamPreviewInfo object, + * This is encapsulated in a StreamInfoItem object, * which is a subset of the fields in a full StreamInfo.*/ - private StreamPreviewInfoExtractor extractVideoPreviewInfo(final Element li) { - return new StreamPreviewInfoExtractor() { + private StreamInfoItemExtractor extractVideoPreviewInfo(final Element li) { + return new StreamInfoItemExtractor() { @Override public AbstractStreamInfo.StreamType getStreamType() throws ParsingException { return null; diff --git a/app/src/main/java/org/schabi/newpipe/extractor/services/youtube/YoutubeStreamPreviewInfoExtractor.java b/app/src/main/java/org/schabi/newpipe/extractor/services/youtube/YoutubeStreamInfoItemExtractor.java similarity index 95% rename from app/src/main/java/org/schabi/newpipe/extractor/services/youtube/YoutubeStreamPreviewInfoExtractor.java rename to app/src/main/java/org/schabi/newpipe/extractor/services/youtube/YoutubeStreamInfoItemExtractor.java index e7420deda..fbac1a6a0 100644 --- a/app/src/main/java/org/schabi/newpipe/extractor/services/youtube/YoutubeStreamPreviewInfoExtractor.java +++ b/app/src/main/java/org/schabi/newpipe/extractor/services/youtube/YoutubeStreamInfoItemExtractor.java @@ -4,11 +4,11 @@ import org.jsoup.nodes.Element; import org.schabi.newpipe.extractor.AbstractStreamInfo; import org.schabi.newpipe.extractor.Parser; import org.schabi.newpipe.extractor.exceptions.ParsingException; -import org.schabi.newpipe.extractor.stream_info.StreamPreviewInfoExtractor; +import org.schabi.newpipe.extractor.stream_info.StreamInfoItemExtractor; /** * Copyright (C) Christian Schabesberger 2016 - * YoutubeStreamPreviewInfoExtractor.java is part of NewPipe. + * YoutubeStreamInfoItemExtractor.java is part of NewPipe. * * NewPipe is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -24,11 +24,11 @@ import org.schabi.newpipe.extractor.stream_info.StreamPreviewInfoExtractor; * along with NewPipe. If not, see . */ -public class YoutubeStreamPreviewInfoExtractor implements StreamPreviewInfoExtractor { +public class YoutubeStreamInfoItemExtractor implements StreamInfoItemExtractor { private final Element item; - public YoutubeStreamPreviewInfoExtractor(Element item) { + public YoutubeStreamInfoItemExtractor(Element item) { this.item = item; } diff --git a/app/src/main/java/org/schabi/newpipe/extractor/stream_info/StreamExtractor.java b/app/src/main/java/org/schabi/newpipe/extractor/stream_info/StreamExtractor.java index 0f4eb7502..1b7c1b5ab 100644 --- a/app/src/main/java/org/schabi/newpipe/extractor/stream_info/StreamExtractor.java +++ b/app/src/main/java/org/schabi/newpipe/extractor/stream_info/StreamExtractor.java @@ -35,7 +35,7 @@ public abstract class StreamExtractor { private int serviceId; private String url; private UrlIdHandler urlIdHandler; - private StreamPreviewInfoCollector previewInfoCollector; + private StreamInfoItemCollector previewInfoCollector; public class ExtractorInitException extends ExtractionException { public ExtractorInitException(String message) { @@ -61,10 +61,10 @@ public abstract class StreamExtractor { public StreamExtractor(UrlIdHandler urlIdHandler, String url, int serviceId) { this.serviceId = serviceId; this.urlIdHandler = urlIdHandler; - previewInfoCollector = new StreamPreviewInfoCollector(urlIdHandler, serviceId); + previewInfoCollector = new StreamInfoItemCollector(urlIdHandler, serviceId); } - protected StreamPreviewInfoCollector getStreamPreviewInfoCollector() { + protected StreamInfoItemCollector getStreamPreviewInfoCollector() { return previewInfoCollector; } @@ -94,8 +94,8 @@ public abstract class StreamExtractor { public abstract String getAverageRating() throws ParsingException; public abstract int getLikeCount() throws ParsingException; public abstract int getDislikeCount() throws ParsingException; - public abstract StreamPreviewInfoExtractor getNextVideo() throws ParsingException; - public abstract StreamPreviewInfoCollector getRelatedVideos() throws ParsingException; + public abstract StreamInfoItemExtractor getNextVideo() throws ParsingException; + public abstract StreamInfoItemCollector getRelatedVideos() throws ParsingException; public abstract String getPageUrl(); public abstract StreamInfo.StreamType getStreamType() throws ParsingException; public int getServiceId() { diff --git a/app/src/main/java/org/schabi/newpipe/extractor/stream_info/StreamInfo.java b/app/src/main/java/org/schabi/newpipe/extractor/stream_info/StreamInfo.java index 5a1c0b740..2d1abc522 100644 --- a/app/src/main/java/org/schabi/newpipe/extractor/stream_info/StreamInfo.java +++ b/app/src/main/java/org/schabi/newpipe/extractor/stream_info/StreamInfo.java @@ -55,14 +55,14 @@ public class StreamInfo extends AbstractStreamInfo { this.view_count = avi.view_count; //todo: better than this - if(avi instanceof StreamPreviewInfo) { + if(avi instanceof StreamInfoItem) { //shitty String to convert code /* - String dur = ((StreamPreviewInfo)avi).duration; + String dur = ((StreamInfoItem)avi).duration; int minutes = Integer.parseInt(dur.substring(0, dur.indexOf(":"))); int seconds = Integer.parseInt(dur.substring(dur.indexOf(":")+1, dur.length())); */ - this.duration = ((StreamPreviewInfo)avi).duration; + this.duration = ((StreamInfoItem)avi).duration; } } @@ -241,9 +241,9 @@ public class StreamInfo extends AbstractStreamInfo { // get next video if(streamInfo.next_video != null) { - StreamPreviewInfoCollector c = new StreamPreviewInfoCollector( + StreamInfoItemCollector c = new StreamInfoItemCollector( extractor.getUrlIdHandler(), extractor.getServiceId()); - StreamPreviewInfoExtractor nextVideo = extractor.getNextVideo(); + StreamInfoItemExtractor nextVideo = extractor.getNextVideo(); c.commit(nextVideo); if(c.getItemList().size() != 0) { streamInfo.next_video = c.getItemList().get(0); @@ -256,7 +256,7 @@ public class StreamInfo extends AbstractStreamInfo { } try { // get related videos - StreamPreviewInfoCollector c = extractor.getRelatedVideos(); + StreamInfoItemCollector c = extractor.getRelatedVideos(); streamInfo.related_streams = c.getItemList(); streamInfo.errors.addAll(c.getErrors()); } catch(Exception e) { @@ -284,8 +284,8 @@ public class StreamInfo extends AbstractStreamInfo { public int like_count = -1; public int dislike_count = -1; public String average_rating = ""; - public StreamPreviewInfo next_video = null; - public List related_streams = null; + public StreamInfoItem next_video = null; + public List related_streams = null; //in seconds. some metadata is not passed using a StreamInfo object! public int start_position = 0; diff --git a/app/src/main/java/org/schabi/newpipe/extractor/stream_info/StreamPreviewInfo.java b/app/src/main/java/org/schabi/newpipe/extractor/stream_info/StreamInfoItem.java similarity index 90% rename from app/src/main/java/org/schabi/newpipe/extractor/stream_info/StreamPreviewInfo.java rename to app/src/main/java/org/schabi/newpipe/extractor/stream_info/StreamInfoItem.java index 77de2db95..f9c4e2860 100644 --- a/app/src/main/java/org/schabi/newpipe/extractor/stream_info/StreamPreviewInfo.java +++ b/app/src/main/java/org/schabi/newpipe/extractor/stream_info/StreamInfoItem.java @@ -4,7 +4,7 @@ package org.schabi.newpipe.extractor.stream_info; * Created by Christian Schabesberger on 26.08.15. * * Copyright (C) Christian Schabesberger 2016 - * StreamPreviewInfo.java is part of NewPipe. + * StreamInfoItem.java is part of NewPipe. * * NewPipe is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -23,6 +23,6 @@ package org.schabi.newpipe.extractor.stream_info; import org.schabi.newpipe.extractor.AbstractStreamInfo; /**Info object for previews of unopened videos, eg search results, related videos*/ -public class StreamPreviewInfo extends AbstractStreamInfo { +public class StreamInfoItem extends AbstractStreamInfo { public int duration; } \ No newline at end of file diff --git a/app/src/main/java/org/schabi/newpipe/extractor/stream_info/StreamPreviewInfoCollector.java b/app/src/main/java/org/schabi/newpipe/extractor/stream_info/StreamInfoItemCollector.java similarity index 85% rename from app/src/main/java/org/schabi/newpipe/extractor/stream_info/StreamPreviewInfoCollector.java rename to app/src/main/java/org/schabi/newpipe/extractor/stream_info/StreamInfoItemCollector.java index 20120fa2d..cefef9fa7 100644 --- a/app/src/main/java/org/schabi/newpipe/extractor/stream_info/StreamPreviewInfoCollector.java +++ b/app/src/main/java/org/schabi/newpipe/extractor/stream_info/StreamInfoItemCollector.java @@ -4,7 +4,6 @@ import org.schabi.newpipe.extractor.NewPipe; import org.schabi.newpipe.extractor.UrlIdHandler; import org.schabi.newpipe.extractor.exceptions.FoundAdException; import org.schabi.newpipe.extractor.exceptions.ParsingException; -import org.schabi.newpipe.extractor.services.youtube.YoutubeStreamUrlIdHandler; import java.util.List; import java.util.Vector; @@ -13,7 +12,7 @@ import java.util.Vector; * Created by Christian Schabesberger on 28.02.16. * * Copyright (C) Christian Schabesberger 2016 - * StreamPreviewInfoCollector.java is part of NewPipe. + * StreamInfoItemCollector.java is part of NewPipe. * * NewPipe is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -29,18 +28,18 @@ import java.util.Vector; * along with NewPipe. If not, see . */ -public class StreamPreviewInfoCollector { - private List itemList = new Vector<>(); +public class StreamInfoItemCollector { + private List itemList = new Vector<>(); private List errors = new Vector<>(); private UrlIdHandler urlIdHandler; private int serviceId = -1; - public StreamPreviewInfoCollector(UrlIdHandler handler, int serviceId) { + public StreamInfoItemCollector(UrlIdHandler handler, int serviceId) { urlIdHandler = handler; this.serviceId = serviceId; } - public List getItemList() { + public List getItemList() { return itemList; } @@ -52,9 +51,9 @@ public class StreamPreviewInfoCollector { errors.add(e); } - public void commit(StreamPreviewInfoExtractor extractor) throws ParsingException { + public void commit(StreamInfoItemExtractor extractor) throws ParsingException { try { - StreamPreviewInfo resultItem = new StreamPreviewInfo(); + StreamInfoItem resultItem = new StreamInfoItem(); // importand information resultItem.service_id = serviceId; resultItem.webpage_url = extractor.getWebPageUrl(); diff --git a/app/src/main/java/org/schabi/newpipe/extractor/stream_info/StreamPreviewInfoExtractor.java b/app/src/main/java/org/schabi/newpipe/extractor/stream_info/StreamInfoItemExtractor.java similarity index 93% rename from app/src/main/java/org/schabi/newpipe/extractor/stream_info/StreamPreviewInfoExtractor.java rename to app/src/main/java/org/schabi/newpipe/extractor/stream_info/StreamInfoItemExtractor.java index 3e35fc8da..4a4080a88 100644 --- a/app/src/main/java/org/schabi/newpipe/extractor/stream_info/StreamPreviewInfoExtractor.java +++ b/app/src/main/java/org/schabi/newpipe/extractor/stream_info/StreamInfoItemExtractor.java @@ -7,7 +7,7 @@ import org.schabi.newpipe.extractor.exceptions.ParsingException; * Created by Christian Schabesberger on 28.02.16. * * Copyright (C) Christian Schabesberger 2016 - * StreamPreviewInfoExtractor.java is part of NewPipe. + * StreamInfoItemExtractor.java is part of NewPipe. * * NewPipe is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -23,7 +23,7 @@ import org.schabi.newpipe.extractor.exceptions.ParsingException; * along with NewPipe. If not, see . */ -public interface StreamPreviewInfoExtractor { +public interface StreamInfoItemExtractor { AbstractStreamInfo.StreamType getStreamType() throws ParsingException; String getWebPageUrl() throws ParsingException; String getTitle() throws ParsingException; diff --git a/app/src/main/java/org/schabi/newpipe/info_list/InfoItemBuilder.java b/app/src/main/java/org/schabi/newpipe/info_list/InfoItemBuilder.java index 30836053e..a0a7e2c87 100644 --- a/app/src/main/java/org/schabi/newpipe/info_list/InfoItemBuilder.java +++ b/app/src/main/java/org/schabi/newpipe/info_list/InfoItemBuilder.java @@ -11,7 +11,7 @@ import com.nostra13.universalimageloader.core.ImageLoader; import org.schabi.newpipe.ImageErrorLoadingListener; import org.schabi.newpipe.R; import org.schabi.newpipe.extractor.AbstractStreamInfo; -import org.schabi.newpipe.extractor.stream_info.StreamPreviewInfo; +import org.schabi.newpipe.extractor.stream_info.StreamInfoItem; /** * Created by Christian Schabesberger on 26.09.16. @@ -55,7 +55,7 @@ public class InfoItemBuilder { this.onItemSelectedListener = onItemSelectedListener; } - public void buildByHolder(InfoItemHolder holder, final StreamPreviewInfo info) { + public void buildByHolder(InfoItemHolder holder, final StreamInfoItem info) { // fill holder with information holder.itemVideoTitleView.setText(info.title); if(info.uploader != null && !info.uploader.isEmpty()) { @@ -97,7 +97,7 @@ public class InfoItemBuilder { }); } - public View buildView(ViewGroup parent, final StreamPreviewInfo info) { + public View buildView(ViewGroup parent, final StreamInfoItem info) { View streamPreviewView = LayoutInflater.from(parent.getContext()) .inflate(R.layout.video_item, parent, false); InfoItemHolder holder = new InfoItemHolder(streamPreviewView); diff --git a/app/src/main/java/org/schabi/newpipe/info_list/InfoListAdapter.java b/app/src/main/java/org/schabi/newpipe/info_list/InfoListAdapter.java index cc5a0f4bb..843010865 100644 --- a/app/src/main/java/org/schabi/newpipe/info_list/InfoListAdapter.java +++ b/app/src/main/java/org/schabi/newpipe/info_list/InfoListAdapter.java @@ -7,7 +7,7 @@ import android.view.View; import android.view.ViewGroup; import org.schabi.newpipe.R; -import org.schabi.newpipe.extractor.stream_info.StreamPreviewInfo; +import org.schabi.newpipe.extractor.stream_info.StreamInfoItem; import java.util.List; import java.util.Vector; @@ -35,7 +35,7 @@ import java.util.Vector; public class InfoListAdapter extends RecyclerView.Adapter { private final InfoItemBuilder infoItemBuilder; - private final List streamList; + private final List streamList; public InfoListAdapter(Activity a, View rootView) { infoItemBuilder = new InfoItemBuilder(a, rootView); @@ -47,7 +47,7 @@ public class InfoListAdapter extends RecyclerView.Adapter { infoItemBuilder.setOnItemSelectedListener(onItemSelectedListener); } - public void addStreamItemList(List videos) { + public void addStreamItemList(List videos) { if(videos!= null) { streamList.addAll(videos); notifyDataSetChanged(); From 5c8bcf15ba8d14f7be2620ab7a85e1d61789ca7b Mon Sep 17 00:00:00 2001 From: Christian Schabesberger Date: Sun, 12 Feb 2017 13:33:03 +0100 Subject: [PATCH 2/9] make colector hirarchicall remove broken commit() --- .../detail/VideoItemDetailFragment.java | 3 +- .../schabi/newpipe/extractor/InfoItem.java | 10 ++- .../newpipe/extractor/InfoItemCollector.java | 66 +++++++++++++++++++ .../extractor/channel/ChannelInfo.java | 2 +- .../extractor/channel/ChannelInfoItem.java | 34 +++++++++- ...ctor.java => InfoItemSearchCollector.java} | 13 ++-- .../extractor/search/SearchEngine.java | 16 +++-- .../extractor/search/SearchResult.java | 3 +- .../services/youtube/YoutubeSearchEngine.java | 15 +++-- .../extractor/stream_info/StreamInfo.java | 5 +- .../extractor/stream_info/StreamInfoItem.java | 15 ++++- .../stream_info/StreamInfoItemCollector.java | 32 +++------ .../newpipe/info_list/InfoItemBuilder.java | 10 ++- .../newpipe/info_list/InfoListAdapter.java | 5 +- 14 files changed, 170 insertions(+), 59 deletions(-) create mode 100644 app/src/main/java/org/schabi/newpipe/extractor/InfoItemCollector.java rename app/src/main/java/org/schabi/newpipe/extractor/search/{StreamInfoSearchItemCollector.java => InfoItemSearchCollector.java} (74%) diff --git a/app/src/main/java/org/schabi/newpipe/detail/VideoItemDetailFragment.java b/app/src/main/java/org/schabi/newpipe/detail/VideoItemDetailFragment.java index 8f2496740..c3ef28bb4 100644 --- a/app/src/main/java/org/schabi/newpipe/detail/VideoItemDetailFragment.java +++ b/app/src/main/java/org/schabi/newpipe/detail/VideoItemDetailFragment.java @@ -46,6 +46,7 @@ import org.schabi.newpipe.Localization; import org.schabi.newpipe.R; import org.schabi.newpipe.ReCaptchaActivity; import org.schabi.newpipe.download.DownloadDialog; +import org.schabi.newpipe.extractor.InfoItem; import org.schabi.newpipe.extractor.MediaFormat; import org.schabi.newpipe.extractor.NewPipe; import org.schabi.newpipe.extractor.stream_info.AudioStream; @@ -536,7 +537,7 @@ public class VideoItemDetailFragment extends Fragment { private void initSimilarVideos(final StreamInfo info) { LinearLayout similarLayout = (LinearLayout) activity.findViewById(R.id.similar_streams_view); - for (final StreamInfoItem item : info.related_streams) { + for (final InfoItem item : info.related_streams) { similarLayout.addView(infoItemBuilder.buildView(similarLayout, item)); } infoItemBuilder.setOnItemSelectedListener(new InfoItemBuilder.OnItemSelectedListener() { diff --git a/app/src/main/java/org/schabi/newpipe/extractor/InfoItem.java b/app/src/main/java/org/schabi/newpipe/extractor/InfoItem.java index 1b95a3868..a3395e8e4 100644 --- a/app/src/main/java/org/schabi/newpipe/extractor/InfoItem.java +++ b/app/src/main/java/org/schabi/newpipe/extractor/InfoItem.java @@ -1,9 +1,5 @@ package org.schabi.newpipe.extractor; -import android.icu.text.IDNA; - -import static org.schabi.newpipe.extractor.InfoItem.InfoType.STREAM; - /** * Created by the-scrabi on 11.02.17. * @@ -30,6 +26,8 @@ public interface InfoItem { PLAYLIST, CHANNEL } - void setInfoType(InfoType iT); - InfoType getInfoType(); + + InfoType infoType(); + String getTitle(); + String getLink(); } diff --git a/app/src/main/java/org/schabi/newpipe/extractor/InfoItemCollector.java b/app/src/main/java/org/schabi/newpipe/extractor/InfoItemCollector.java new file mode 100644 index 000000000..1bc27171c --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/extractor/InfoItemCollector.java @@ -0,0 +1,66 @@ +package org.schabi.newpipe.extractor; + +import org.schabi.newpipe.extractor.exceptions.ExtractionException; + +import java.util.List; +import java.util.Vector; + +/** + * Created by Christian Schabesberger on 12.02.17. + * + * Copyright (C) Christian Schabesberger 2017 + * InfoItemCollector.java is part of NewPipe. + * + * NewPipe is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * NewPipe is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with NewPipe. If not, see . + */ + +public class InfoItemCollector { + private List itemList = new Vector<>(); + private List errors = new Vector<>(); + private UrlIdHandler urlIdHandler; + private int serviceId = -1; + + public InfoItemCollector(UrlIdHandler handler, int serviceId) { + urlIdHandler = handler; + this.serviceId = serviceId; + } + + public List getItemList() { + return itemList; + } + public List getErrors() { + return errors; + } + public void addFromCollector(InfoItemCollector otherC) throws ExtractionException { + if(serviceId != otherC.serviceId) { + throw new ExtractionException("Service Id does not equal: " + + NewPipe.getNameOfService(serviceId) + + " and " + NewPipe.getNameOfService(otherC.serviceId)); + } + errors.addAll(otherC.errors); + itemList.addAll(otherC.itemList); + } + protected void addError(Exception e) { + errors.add(e); + } + protected void addItem(InfoItem item) { + itemList.add(item); + } + protected int getServiceId() { + return serviceId; + } + protected UrlIdHandler getUrlIdHandler() { + return urlIdHandler; + } +} diff --git a/app/src/main/java/org/schabi/newpipe/extractor/channel/ChannelInfo.java b/app/src/main/java/org/schabi/newpipe/extractor/channel/ChannelInfo.java index 2cf0733d9..68862ec32 100644 --- a/app/src/main/java/org/schabi/newpipe/extractor/channel/ChannelInfo.java +++ b/app/src/main/java/org/schabi/newpipe/extractor/channel/ChannelInfo.java @@ -75,7 +75,7 @@ public class ChannelInfo { public String avatar_url = ""; public String banner_url = ""; public String feed_url = ""; - public List related_streams = null; + public List related_streams = null; public boolean hasNextPage = false; public List errors = new Vector<>(); diff --git a/app/src/main/java/org/schabi/newpipe/extractor/channel/ChannelInfoItem.java b/app/src/main/java/org/schabi/newpipe/extractor/channel/ChannelInfoItem.java index 21f4b5eaa..e598c659f 100644 --- a/app/src/main/java/org/schabi/newpipe/extractor/channel/ChannelInfoItem.java +++ b/app/src/main/java/org/schabi/newpipe/extractor/channel/ChannelInfoItem.java @@ -1,8 +1,38 @@ package org.schabi.newpipe.extractor.channel; +import org.schabi.newpipe.extractor.InfoItem; + /** - * Created by the-scrabi on 11.02.17. + * Created by Christian Schabesberger on 11.02.17. + * + * Copyright (C) Christian Schabesberger 2017 + * ChannelInfoItem.java is part of NewPipe. + * + * NewPipe is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * NewPipe is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with NewPipe. If not, see . */ -public class ChannelInfoItem { +public class ChannelInfoItem implements InfoItem { + + public InfoType infoType() { + return InfoType.CHANNEL; + } + + public String getTitle() { + return ""; + } + + public String getLink() { + return ""; + } } diff --git a/app/src/main/java/org/schabi/newpipe/extractor/search/StreamInfoSearchItemCollector.java b/app/src/main/java/org/schabi/newpipe/extractor/search/InfoItemSearchCollector.java similarity index 74% rename from app/src/main/java/org/schabi/newpipe/extractor/search/StreamInfoSearchItemCollector.java rename to app/src/main/java/org/schabi/newpipe/extractor/search/InfoItemSearchCollector.java index 17be8e17e..3040452ed 100644 --- a/app/src/main/java/org/schabi/newpipe/extractor/search/StreamInfoSearchItemCollector.java +++ b/app/src/main/java/org/schabi/newpipe/extractor/search/InfoItemSearchCollector.java @@ -1,13 +1,13 @@ package org.schabi.newpipe.extractor.search; +import org.schabi.newpipe.extractor.InfoItemCollector; import org.schabi.newpipe.extractor.UrlIdHandler; -import org.schabi.newpipe.extractor.stream_info.StreamInfoItemCollector; /** - * Created by Christian Schabesberger on 11.05.16. + * Created by Christian Schabesberger on 12.02.17. * - * Copyright (C) Christian Schabesberger 2016 - * StreamInfoSearchItemCollector.java is part of NewPipe. + * Copyright (C) Christian Schabesberger 2017 + * InfoItemSearchCollector.java is part of NewPipe. * * NewPipe is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -23,11 +23,10 @@ import org.schabi.newpipe.extractor.stream_info.StreamInfoItemCollector; * along with NewPipe. If not, see . */ -public class StreamInfoSearchItemCollector extends StreamInfoItemCollector { - +public class InfoItemSearchCollector extends InfoItemCollector { private String suggestion = ""; - public StreamInfoSearchItemCollector(UrlIdHandler handler, int serviceId) { + InfoItemSearchCollector(UrlIdHandler handler, int serviceId) { super(handler, serviceId); } diff --git a/app/src/main/java/org/schabi/newpipe/extractor/search/SearchEngine.java b/app/src/main/java/org/schabi/newpipe/extractor/search/SearchEngine.java index 669ad266b..03474d80c 100644 --- a/app/src/main/java/org/schabi/newpipe/extractor/search/SearchEngine.java +++ b/app/src/main/java/org/schabi/newpipe/extractor/search/SearchEngine.java @@ -2,6 +2,7 @@ package org.schabi.newpipe.extractor.search; import org.schabi.newpipe.extractor.UrlIdHandler; import org.schabi.newpipe.extractor.exceptions.ExtractionException; +import org.schabi.newpipe.extractor.stream_info.StreamInfoItemCollector; import java.io.IOException; @@ -32,18 +33,23 @@ public abstract class SearchEngine { } } - private StreamInfoSearchItemCollector collector; + private StreamInfoItemCollector streamCollector; + private InfoItemSearchCollector collector; public SearchEngine(UrlIdHandler urlIdHandler, int serviceId) { - collector = new StreamInfoSearchItemCollector(urlIdHandler, serviceId); + streamCollector = new StreamInfoItemCollector(urlIdHandler, serviceId); + collector = new InfoItemSearchCollector(urlIdHandler, serviceId); } - protected StreamInfoSearchItemCollector getStreamPreviewInfoSearchCollector() { + protected StreamInfoItemCollector getStreamPreviewInfoCollector() { + return streamCollector; + } + + protected InfoItemSearchCollector getInfoItemSearchCollector() { return collector; } - //Result search(String query, int page); - public abstract StreamInfoSearchItemCollector search( + public abstract InfoItemSearchCollector search( String query, int page, String contentCountry) throws ExtractionException, IOException; } diff --git a/app/src/main/java/org/schabi/newpipe/extractor/search/SearchResult.java b/app/src/main/java/org/schabi/newpipe/extractor/search/SearchResult.java index 7fa56a3e9..a3ef1fbcd 100644 --- a/app/src/main/java/org/schabi/newpipe/extractor/search/SearchResult.java +++ b/app/src/main/java/org/schabi/newpipe/extractor/search/SearchResult.java @@ -1,5 +1,6 @@ package org.schabi.newpipe.extractor.search; +import org.schabi.newpipe.extractor.InfoItem; import org.schabi.newpipe.extractor.exceptions.ExtractionException; import org.schabi.newpipe.extractor.stream_info.StreamInfoItem; @@ -45,6 +46,6 @@ public class SearchResult { } public String suggestion = ""; - public List resultList = new Vector<>(); + public List resultList = new Vector<>(); public List errors = new Vector<>(); } diff --git a/app/src/main/java/org/schabi/newpipe/extractor/services/youtube/YoutubeSearchEngine.java b/app/src/main/java/org/schabi/newpipe/extractor/services/youtube/YoutubeSearchEngine.java index e4314f716..db5dbd32f 100644 --- a/app/src/main/java/org/schabi/newpipe/extractor/services/youtube/YoutubeSearchEngine.java +++ b/app/src/main/java/org/schabi/newpipe/extractor/services/youtube/YoutubeSearchEngine.java @@ -7,8 +7,9 @@ import org.schabi.newpipe.extractor.Downloader; import org.schabi.newpipe.extractor.NewPipe; import org.schabi.newpipe.extractor.UrlIdHandler; import org.schabi.newpipe.extractor.exceptions.ExtractionException; +import org.schabi.newpipe.extractor.search.InfoItemSearchCollector; import org.schabi.newpipe.extractor.search.SearchEngine; -import org.schabi.newpipe.extractor.search.StreamInfoSearchItemCollector; +import org.schabi.newpipe.extractor.stream_info.StreamInfoItemCollector; import org.schabi.newpipe.extractor.stream_info.StreamInfoItemExtractor; import java.net.URLEncoder; @@ -45,9 +46,11 @@ public class YoutubeSearchEngine extends SearchEngine { } @Override - public StreamInfoSearchItemCollector search(String query, int page, String languageCode) + public InfoItemSearchCollector search(String query, int page, String languageCode) throws IOException, ExtractionException { - StreamInfoSearchItemCollector collector = getStreamPreviewInfoSearchCollector(); + StreamInfoItemCollector streamCollector = getStreamPreviewInfoCollector(); + InfoItemSearchCollector collector = getInfoItemSearchCollector(); + Downloader downloader = NewPipe.getDownloader(); @@ -97,13 +100,13 @@ public class YoutubeSearchEngine extends SearchEngine { // video item type } else if ((el = item.select("div[class*=\"yt-lockup-video\"").first()) != null) { - collector.commit(extractPreviewInfo(el)); + streamCollector.commit(extractPreviewInfo(el)); } else { //noinspection ConstantConditions - collector.addError(new Exception("unexpected element found:\"" + el + "\"")); + throw new ExtractionException("unexpected element found:\"" + el + "\""); } } - + collector.addFromCollector(streamCollector); return collector; } diff --git a/app/src/main/java/org/schabi/newpipe/extractor/stream_info/StreamInfo.java b/app/src/main/java/org/schabi/newpipe/extractor/stream_info/StreamInfo.java index 2d1abc522..cf3df49d8 100644 --- a/app/src/main/java/org/schabi/newpipe/extractor/stream_info/StreamInfo.java +++ b/app/src/main/java/org/schabi/newpipe/extractor/stream_info/StreamInfo.java @@ -2,6 +2,7 @@ package org.schabi.newpipe.extractor.stream_info; import org.schabi.newpipe.extractor.AbstractStreamInfo; import org.schabi.newpipe.extractor.DashMpdParser; +import org.schabi.newpipe.extractor.InfoItem; import org.schabi.newpipe.extractor.UrlIdHandler; import org.schabi.newpipe.extractor.exceptions.ExtractionException; @@ -246,7 +247,7 @@ public class StreamInfo extends AbstractStreamInfo { StreamInfoItemExtractor nextVideo = extractor.getNextVideo(); c.commit(nextVideo); if(c.getItemList().size() != 0) { - streamInfo.next_video = c.getItemList().get(0); + streamInfo.next_video = (StreamInfoItem) c.getItemList().get(0); } streamInfo.errors.addAll(c.getErrors()); } @@ -285,7 +286,7 @@ public class StreamInfo extends AbstractStreamInfo { public int dislike_count = -1; public String average_rating = ""; public StreamInfoItem next_video = null; - public List related_streams = null; + public List related_streams = null; //in seconds. some metadata is not passed using a StreamInfo object! public int start_position = 0; diff --git a/app/src/main/java/org/schabi/newpipe/extractor/stream_info/StreamInfoItem.java b/app/src/main/java/org/schabi/newpipe/extractor/stream_info/StreamInfoItem.java index f9c4e2860..8a6db5bc0 100644 --- a/app/src/main/java/org/schabi/newpipe/extractor/stream_info/StreamInfoItem.java +++ b/app/src/main/java/org/schabi/newpipe/extractor/stream_info/StreamInfoItem.java @@ -21,8 +21,21 @@ package org.schabi.newpipe.extractor.stream_info; */ import org.schabi.newpipe.extractor.AbstractStreamInfo; +import org.schabi.newpipe.extractor.InfoItem; /**Info object for previews of unopened videos, eg search results, related videos*/ -public class StreamInfoItem extends AbstractStreamInfo { +public class StreamInfoItem extends AbstractStreamInfo implements InfoItem { public int duration; + + public InfoType infoType() { + return InfoType.STREAM; + } + + public String getTitle() { + return title; + } + + public String getLink() { + return webpage_url; + } } \ No newline at end of file diff --git a/app/src/main/java/org/schabi/newpipe/extractor/stream_info/StreamInfoItemCollector.java b/app/src/main/java/org/schabi/newpipe/extractor/stream_info/StreamInfoItemCollector.java index cefef9fa7..67db27e8a 100644 --- a/app/src/main/java/org/schabi/newpipe/extractor/stream_info/StreamInfoItemCollector.java +++ b/app/src/main/java/org/schabi/newpipe/extractor/stream_info/StreamInfoItemCollector.java @@ -1,5 +1,6 @@ package org.schabi.newpipe.extractor.stream_info; +import org.schabi.newpipe.extractor.InfoItemCollector; import org.schabi.newpipe.extractor.NewPipe; import org.schabi.newpipe.extractor.UrlIdHandler; import org.schabi.newpipe.extractor.exceptions.FoundAdException; @@ -28,39 +29,24 @@ import java.util.Vector; * along with NewPipe. If not, see . */ -public class StreamInfoItemCollector { - private List itemList = new Vector<>(); - private List errors = new Vector<>(); - private UrlIdHandler urlIdHandler; - private int serviceId = -1; +public class StreamInfoItemCollector extends InfoItemCollector { public StreamInfoItemCollector(UrlIdHandler handler, int serviceId) { - urlIdHandler = handler; - this.serviceId = serviceId; - } - - public List getItemList() { - return itemList; - } - - public List getErrors() { - return errors; - } - - public void addError(Exception e) { - errors.add(e); + super(handler, serviceId); } public void commit(StreamInfoItemExtractor extractor) throws ParsingException { try { StreamInfoItem resultItem = new StreamInfoItem(); // importand information - resultItem.service_id = serviceId; + resultItem.service_id = getServiceId(); resultItem.webpage_url = extractor.getWebPageUrl(); - if (urlIdHandler == null) { + if (getUrlIdHandler() == null) { throw new ParsingException("Error: UrlIdHandler not set"); } else if(!resultItem.webpage_url.isEmpty()) { - resultItem.id = NewPipe.getService(serviceId).getUrlIdHandlerInstance().getId(resultItem.webpage_url); + resultItem.id = NewPipe.getService(getServiceId()) + .getUrlIdHandlerInstance() + .getId(resultItem.webpage_url); } resultItem.title = extractor.getTitle(); resultItem.stream_type = extractor.getStreamType(); @@ -91,7 +77,7 @@ public class StreamInfoItemCollector { } catch (Exception e) { addError(e); } - itemList.add(resultItem); + addItem(resultItem); } catch(FoundAdException ae) { System.out.println("AD_WARNING: " + ae.getMessage()); } catch (Exception e) { diff --git a/app/src/main/java/org/schabi/newpipe/info_list/InfoItemBuilder.java b/app/src/main/java/org/schabi/newpipe/info_list/InfoItemBuilder.java index a0a7e2c87..dd33d4caa 100644 --- a/app/src/main/java/org/schabi/newpipe/info_list/InfoItemBuilder.java +++ b/app/src/main/java/org/schabi/newpipe/info_list/InfoItemBuilder.java @@ -1,6 +1,7 @@ package org.schabi.newpipe.info_list; import android.app.Activity; +import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -11,6 +12,7 @@ import com.nostra13.universalimageloader.core.ImageLoader; import org.schabi.newpipe.ImageErrorLoadingListener; import org.schabi.newpipe.R; import org.schabi.newpipe.extractor.AbstractStreamInfo; +import org.schabi.newpipe.extractor.InfoItem; import org.schabi.newpipe.extractor.stream_info.StreamInfoItem; /** @@ -55,7 +57,11 @@ public class InfoItemBuilder { this.onItemSelectedListener = onItemSelectedListener; } - public void buildByHolder(InfoItemHolder holder, final StreamInfoItem info) { + public void buildByHolder(InfoItemHolder holder, final InfoItem i) { + final StreamInfoItem info = (StreamInfoItem) i; + if(info.infoType() != InfoItem.InfoType.STREAM) { + Log.e("InfoItemBuilder", "Info type not yet supported"); + } // fill holder with information holder.itemVideoTitleView.setText(info.title); if(info.uploader != null && !info.uploader.isEmpty()) { @@ -97,7 +103,7 @@ public class InfoItemBuilder { }); } - public View buildView(ViewGroup parent, final StreamInfoItem info) { + public View buildView(ViewGroup parent, final InfoItem info) { View streamPreviewView = LayoutInflater.from(parent.getContext()) .inflate(R.layout.video_item, parent, false); InfoItemHolder holder = new InfoItemHolder(streamPreviewView); diff --git a/app/src/main/java/org/schabi/newpipe/info_list/InfoListAdapter.java b/app/src/main/java/org/schabi/newpipe/info_list/InfoListAdapter.java index 843010865..0daf211e5 100644 --- a/app/src/main/java/org/schabi/newpipe/info_list/InfoListAdapter.java +++ b/app/src/main/java/org/schabi/newpipe/info_list/InfoListAdapter.java @@ -7,6 +7,7 @@ import android.view.View; import android.view.ViewGroup; import org.schabi.newpipe.R; +import org.schabi.newpipe.extractor.InfoItem; import org.schabi.newpipe.extractor.stream_info.StreamInfoItem; import java.util.List; @@ -35,7 +36,7 @@ import java.util.Vector; public class InfoListAdapter extends RecyclerView.Adapter { private final InfoItemBuilder infoItemBuilder; - private final List streamList; + private final List streamList; public InfoListAdapter(Activity a, View rootView) { infoItemBuilder = new InfoItemBuilder(a, rootView); @@ -47,7 +48,7 @@ public class InfoListAdapter extends RecyclerView.Adapter { infoItemBuilder.setOnItemSelectedListener(onItemSelectedListener); } - public void addStreamItemList(List videos) { + public void addStreamItemList(List videos) { if(videos!= null) { streamList.addAll(videos); notifyDataSetChanged(); From 7186f58374d557c6a89dce91fdc8f15c6d0f334f Mon Sep 17 00:00:00 2001 From: Christian Schabesberger Date: Sun, 12 Feb 2017 14:21:59 +0100 Subject: [PATCH 3/9] remove StreamInfoItemSearchCollector --- .../youtube/YoutubeSearchResultTest.java | 4 +--- .../newpipe/extractor/InfoItemCollector.java | 2 +- .../newpipe/extractor/StreamingService.java | 1 - .../{search => }/SuggestionExtractor.java | 2 +- .../extractor/search/InfoItemSearchCollector.java | 15 ++++++++++++++- .../newpipe/extractor/search/SearchEngine.java | 7 ------- .../services/youtube/YoutubeSearchEngine.java | 9 ++------- .../services/youtube/YoutubeService.java | 2 +- .../youtube/YoutubeSuggestionExtractor.java | 3 +-- .../search_fragment/SuggestionSearchRunnable.java | 2 +- 10 files changed, 22 insertions(+), 25 deletions(-) rename app/src/main/java/org/schabi/newpipe/extractor/{search => }/SuggestionExtractor.java (96%) diff --git a/app/src/androidTest/java/org/schabi/newpipe/extractor/youtube/YoutubeSearchResultTest.java b/app/src/androidTest/java/org/schabi/newpipe/extractor/youtube/YoutubeSearchResultTest.java index 8f4a18b37..106e16779 100644 --- a/app/src/androidTest/java/org/schabi/newpipe/extractor/youtube/YoutubeSearchResultTest.java +++ b/app/src/androidTest/java/org/schabi/newpipe/extractor/youtube/YoutubeSearchResultTest.java @@ -4,11 +4,9 @@ import android.test.AndroidTestCase; import org.schabi.newpipe.Downloader; import org.schabi.newpipe.extractor.NewPipe; -import org.schabi.newpipe.extractor.exceptions.ExtractionException; -import org.schabi.newpipe.extractor.search.SuggestionExtractor; +import org.schabi.newpipe.extractor.SuggestionExtractor; import org.schabi.newpipe.extractor.services.youtube.YoutubeSuggestionExtractor; -import java.io.IOException; import java.util.List; /** diff --git a/app/src/main/java/org/schabi/newpipe/extractor/InfoItemCollector.java b/app/src/main/java/org/schabi/newpipe/extractor/InfoItemCollector.java index 1bc27171c..1667e55dd 100644 --- a/app/src/main/java/org/schabi/newpipe/extractor/InfoItemCollector.java +++ b/app/src/main/java/org/schabi/newpipe/extractor/InfoItemCollector.java @@ -42,7 +42,7 @@ public class InfoItemCollector { public List getErrors() { return errors; } - public void addFromCollector(InfoItemCollector otherC) throws ExtractionException { + protected void addFromCollector(InfoItemCollector otherC) throws ExtractionException { if(serviceId != otherC.serviceId) { throw new ExtractionException("Service Id does not equal: " + NewPipe.getNameOfService(serviceId) diff --git a/app/src/main/java/org/schabi/newpipe/extractor/StreamingService.java b/app/src/main/java/org/schabi/newpipe/extractor/StreamingService.java index 8ed6f9234..7252cea49 100644 --- a/app/src/main/java/org/schabi/newpipe/extractor/StreamingService.java +++ b/app/src/main/java/org/schabi/newpipe/extractor/StreamingService.java @@ -3,7 +3,6 @@ package org.schabi.newpipe.extractor; import org.schabi.newpipe.extractor.channel.ChannelExtractor; import org.schabi.newpipe.extractor.exceptions.ExtractionException; import org.schabi.newpipe.extractor.search.SearchEngine; -import org.schabi.newpipe.extractor.search.SuggestionExtractor; import org.schabi.newpipe.extractor.stream_info.StreamExtractor; import java.io.IOException; diff --git a/app/src/main/java/org/schabi/newpipe/extractor/search/SuggestionExtractor.java b/app/src/main/java/org/schabi/newpipe/extractor/SuggestionExtractor.java similarity index 96% rename from app/src/main/java/org/schabi/newpipe/extractor/search/SuggestionExtractor.java rename to app/src/main/java/org/schabi/newpipe/extractor/SuggestionExtractor.java index f77b1912d..f198bc5e0 100644 --- a/app/src/main/java/org/schabi/newpipe/extractor/search/SuggestionExtractor.java +++ b/app/src/main/java/org/schabi/newpipe/extractor/SuggestionExtractor.java @@ -1,4 +1,4 @@ -package org.schabi.newpipe.extractor.search; +package org.schabi.newpipe.extractor; import org.schabi.newpipe.extractor.exceptions.ExtractionException; diff --git a/app/src/main/java/org/schabi/newpipe/extractor/search/InfoItemSearchCollector.java b/app/src/main/java/org/schabi/newpipe/extractor/search/InfoItemSearchCollector.java index 3040452ed..533331719 100644 --- a/app/src/main/java/org/schabi/newpipe/extractor/search/InfoItemSearchCollector.java +++ b/app/src/main/java/org/schabi/newpipe/extractor/search/InfoItemSearchCollector.java @@ -2,6 +2,10 @@ package org.schabi.newpipe.extractor.search; import org.schabi.newpipe.extractor.InfoItemCollector; import org.schabi.newpipe.extractor.UrlIdHandler; +import org.schabi.newpipe.extractor.exceptions.ExtractionException; +import org.schabi.newpipe.extractor.exceptions.ParsingException; +import org.schabi.newpipe.extractor.stream_info.StreamInfoItemCollector; +import org.schabi.newpipe.extractor.stream_info.StreamInfoItemExtractor; /** * Created by Christian Schabesberger on 12.02.17. @@ -25,20 +29,29 @@ import org.schabi.newpipe.extractor.UrlIdHandler; public class InfoItemSearchCollector extends InfoItemCollector { private String suggestion = ""; + private StreamInfoItemCollector streamCollector; InfoItemSearchCollector(UrlIdHandler handler, int serviceId) { super(handler, serviceId); + streamCollector = new StreamInfoItemCollector(handler, serviceId); } public void setSuggestion(String suggestion) { this.suggestion = suggestion; } - public SearchResult getSearchResult() { + public SearchResult getSearchResult() throws ExtractionException { SearchResult result = new SearchResult(); + + addFromCollector(streamCollector); + result.suggestion = suggestion; result.errors = getErrors(); result.resultList = getItemList(); return result; } + + public void commit(StreamInfoItemExtractor extractor) throws ParsingException { + streamCollector.commit(extractor); + } } diff --git a/app/src/main/java/org/schabi/newpipe/extractor/search/SearchEngine.java b/app/src/main/java/org/schabi/newpipe/extractor/search/SearchEngine.java index 03474d80c..ce7e6e061 100644 --- a/app/src/main/java/org/schabi/newpipe/extractor/search/SearchEngine.java +++ b/app/src/main/java/org/schabi/newpipe/extractor/search/SearchEngine.java @@ -32,19 +32,12 @@ public abstract class SearchEngine { super(message); } } - - private StreamInfoItemCollector streamCollector; private InfoItemSearchCollector collector; public SearchEngine(UrlIdHandler urlIdHandler, int serviceId) { - streamCollector = new StreamInfoItemCollector(urlIdHandler, serviceId); collector = new InfoItemSearchCollector(urlIdHandler, serviceId); } - protected StreamInfoItemCollector getStreamPreviewInfoCollector() { - return streamCollector; - } - protected InfoItemSearchCollector getInfoItemSearchCollector() { return collector; } diff --git a/app/src/main/java/org/schabi/newpipe/extractor/services/youtube/YoutubeSearchEngine.java b/app/src/main/java/org/schabi/newpipe/extractor/services/youtube/YoutubeSearchEngine.java index db5dbd32f..2b738204c 100644 --- a/app/src/main/java/org/schabi/newpipe/extractor/services/youtube/YoutubeSearchEngine.java +++ b/app/src/main/java/org/schabi/newpipe/extractor/services/youtube/YoutubeSearchEngine.java @@ -48,7 +48,6 @@ public class YoutubeSearchEngine extends SearchEngine { @Override public InfoItemSearchCollector search(String query, int page, String languageCode) throws IOException, ExtractionException { - StreamInfoItemCollector streamCollector = getStreamPreviewInfoCollector(); InfoItemSearchCollector collector = getInfoItemSearchCollector(); @@ -100,17 +99,13 @@ public class YoutubeSearchEngine extends SearchEngine { // video item type } else if ((el = item.select("div[class*=\"yt-lockup-video\"").first()) != null) { - streamCollector.commit(extractPreviewInfo(el)); + collector.commit(new YoutubeStreamInfoItemExtractor(el)); } else { //noinspection ConstantConditions throw new ExtractionException("unexpected element found:\"" + el + "\""); } } - collector.addFromCollector(streamCollector); + return collector; } - - private StreamInfoItemExtractor extractPreviewInfo(final Element item) { - return new YoutubeStreamInfoItemExtractor(item); - } } diff --git a/app/src/main/java/org/schabi/newpipe/extractor/services/youtube/YoutubeService.java b/app/src/main/java/org/schabi/newpipe/extractor/services/youtube/YoutubeService.java index 030878b03..595513ace 100644 --- a/app/src/main/java/org/schabi/newpipe/extractor/services/youtube/YoutubeService.java +++ b/app/src/main/java/org/schabi/newpipe/extractor/services/youtube/YoutubeService.java @@ -5,7 +5,7 @@ import org.schabi.newpipe.extractor.UrlIdHandler; import org.schabi.newpipe.extractor.channel.ChannelExtractor; import org.schabi.newpipe.extractor.exceptions.ExtractionException; import org.schabi.newpipe.extractor.search.SearchEngine; -import org.schabi.newpipe.extractor.search.SuggestionExtractor; +import org.schabi.newpipe.extractor.SuggestionExtractor; import org.schabi.newpipe.extractor.stream_info.StreamExtractor; import java.io.IOException; diff --git a/app/src/main/java/org/schabi/newpipe/extractor/services/youtube/YoutubeSuggestionExtractor.java b/app/src/main/java/org/schabi/newpipe/extractor/services/youtube/YoutubeSuggestionExtractor.java index 8cd1651b8..0535961e8 100644 --- a/app/src/main/java/org/schabi/newpipe/extractor/services/youtube/YoutubeSuggestionExtractor.java +++ b/app/src/main/java/org/schabi/newpipe/extractor/services/youtube/YoutubeSuggestionExtractor.java @@ -4,7 +4,7 @@ import org.schabi.newpipe.extractor.Downloader; import org.schabi.newpipe.extractor.NewPipe; import org.schabi.newpipe.extractor.exceptions.ExtractionException; import org.schabi.newpipe.extractor.exceptions.ParsingException; -import org.schabi.newpipe.extractor.search.SuggestionExtractor; +import org.schabi.newpipe.extractor.SuggestionExtractor; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.xml.sax.InputSource; @@ -15,7 +15,6 @@ import java.io.IOException; import java.net.URLEncoder; import java.util.ArrayList; import java.util.List; -import java.util.Vector; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; diff --git a/app/src/main/java/org/schabi/newpipe/search_fragment/SuggestionSearchRunnable.java b/app/src/main/java/org/schabi/newpipe/search_fragment/SuggestionSearchRunnable.java index 0110052ec..8b8f75e7e 100644 --- a/app/src/main/java/org/schabi/newpipe/search_fragment/SuggestionSearchRunnable.java +++ b/app/src/main/java/org/schabi/newpipe/search_fragment/SuggestionSearchRunnable.java @@ -8,7 +8,7 @@ import android.widget.Toast; import org.schabi.newpipe.extractor.NewPipe; import org.schabi.newpipe.extractor.exceptions.ExtractionException; -import org.schabi.newpipe.extractor.search.SuggestionExtractor; +import org.schabi.newpipe.extractor.SuggestionExtractor; import org.schabi.newpipe.report.ErrorActivity; import org.schabi.newpipe.R; From f29bd0a6e726b96f712003c50c07980b7585032b Mon Sep 17 00:00:00 2001 From: Christian Schabesberger Date: Sun, 12 Feb 2017 16:45:01 +0100 Subject: [PATCH 4/9] fix actionbar icon theming --- .../org/schabi/newpipe/ThemableActivity.java | 11 +- .../detail/VideoItemDetailFragment.java | 3 +- .../schabi/newpipe/report/ErrorActivity.java | 5 + .../drawable-hdpi/ic_headset_black_24dp.png | Bin 0 -> 349 bytes .../ic_screen_rotation_white_24dp.png | Bin 0 -> 858 bytes .../res/drawable-hdpi/ic_share_black_24dp.png | Bin 0 -> 398 bytes .../ic_screen_rotation_white_24dp.png | Bin 0 -> 639 bytes .../res/drawable-mdpi/ic_share_black_24dp.png | Bin 0 -> 262 bytes .../main/res/drawable-nodpi/ic_cast_black.png | Bin 869 -> 0 bytes .../drawable-nodpi/ic_file_download_black.png | Bin 209 -> 0 bytes .../res/drawable-nodpi/ic_headset_black.png | Bin 786 -> 0 bytes .../ic_screen_rotation_white.png | Bin 1256 -> 0 bytes .../ic_menu_more.png | Bin .../ic_screen_rotation_white_24dp.png | Bin 0 -> 1191 bytes .../drawable-xhdpi/ic_share_black_24dp.png | Bin 0 -> 483 bytes .../ic_screen_rotation_white_24dp.png | Bin 0 -> 1873 bytes .../drawable-xxhdpi/ic_share_black_24dp.png | Bin 0 -> 675 bytes .../ic_screen_rotation_white_24dp.png | Bin 0 -> 2611 bytes .../ic_share_black_24dp.png} | Bin .../res/layout/fragment_searchinfoitem.xml | 2 +- .../res/layout/fragment_videoitem_detail.xml | 5 +- app/src/main/res/layout/video_item.xml | 108 ------------------ app/src/main/res/menu/video_player.xml | 2 +- app/src/main/res/menu/videoitem_detail.xml | 4 +- app/src/main/res/values-v21/styles.xml | 2 +- app/src/main/res/values/styles.xml | 2 +- assets/dummi_thumbnail.svg | 16 +-- assets/dummi_thumbnail_backup.svg | 83 ++++++++++++++ 28 files changed, 118 insertions(+), 125 deletions(-) create mode 100644 app/src/main/res/drawable-hdpi/ic_headset_black_24dp.png create mode 100644 app/src/main/res/drawable-hdpi/ic_screen_rotation_white_24dp.png create mode 100644 app/src/main/res/drawable-hdpi/ic_share_black_24dp.png create mode 100644 app/src/main/res/drawable-mdpi/ic_screen_rotation_white_24dp.png create mode 100644 app/src/main/res/drawable-mdpi/ic_share_black_24dp.png delete mode 100644 app/src/main/res/drawable-nodpi/ic_cast_black.png delete mode 100644 app/src/main/res/drawable-nodpi/ic_file_download_black.png delete mode 100644 app/src/main/res/drawable-nodpi/ic_headset_black.png delete mode 100644 app/src/main/res/drawable-nodpi/ic_screen_rotation_white.png rename app/src/main/res/{drawable-ldrtl-xhdpi => drawable-xhdpi}/ic_menu_more.png (100%) create mode 100644 app/src/main/res/drawable-xhdpi/ic_screen_rotation_white_24dp.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_share_black_24dp.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_screen_rotation_white_24dp.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_share_black_24dp.png create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_screen_rotation_white_24dp.png rename app/src/main/res/{drawable-nodpi/ic_share_black.png => drawable-xxxhdpi/ic_share_black_24dp.png} (100%) delete mode 100644 app/src/main/res/layout/video_item.xml create mode 100644 assets/dummi_thumbnail_backup.svg diff --git a/app/src/main/java/org/schabi/newpipe/ThemableActivity.java b/app/src/main/java/org/schabi/newpipe/ThemableActivity.java index 81789ec1c..8b0d126be 100644 --- a/app/src/main/java/org/schabi/newpipe/ThemableActivity.java +++ b/app/src/main/java/org/schabi/newpipe/ThemableActivity.java @@ -1,6 +1,5 @@ package org.schabi.newpipe; -import android.os.Build; import android.os.Bundle; import android.preference.PreferenceManager; import android.support.v7.app.AppCompatActivity; @@ -16,4 +15,14 @@ public class ThemableActivity extends AppCompatActivity { setTheme(R.style.DarkTheme); } } + + @Override + protected void onResume() { + super.onResume(); + if (PreferenceManager.getDefaultSharedPreferences(this) + .getString("theme", getResources().getString(R.string.light_theme_title)). + equals(getResources().getString(R.string.dark_theme_title))) { + setTheme(R.style.DarkTheme); + } + } } \ No newline at end of file diff --git a/app/src/main/java/org/schabi/newpipe/detail/VideoItemDetailFragment.java b/app/src/main/java/org/schabi/newpipe/detail/VideoItemDetailFragment.java index c3ef28bb4..d8c6c19cd 100644 --- a/app/src/main/java/org/schabi/newpipe/detail/VideoItemDetailFragment.java +++ b/app/src/main/java/org/schabi/newpipe/detail/VideoItemDetailFragment.java @@ -540,7 +540,8 @@ public class VideoItemDetailFragment extends Fragment { for (final InfoItem item : info.related_streams) { similarLayout.addView(infoItemBuilder.buildView(similarLayout, item)); } - infoItemBuilder.setOnItemSelectedListener(new InfoItemBuilder.OnItemSelectedListener() { + infoItemBuilder.setOnStreamInfoItemSelectedListener( + new InfoItemBuilder.OnInfoItemSelectedListener() { @Override public void selected(String url) { openStreamUrl(url); diff --git a/app/src/main/java/org/schabi/newpipe/report/ErrorActivity.java b/app/src/main/java/org/schabi/newpipe/report/ErrorActivity.java index 039ed8eaa..932d91584 100644 --- a/app/src/main/java/org/schabi/newpipe/report/ErrorActivity.java +++ b/app/src/main/java/org/schabi/newpipe/report/ErrorActivity.java @@ -297,6 +297,11 @@ public class ErrorActivity extends ThemableActivity { } errorView.setText(formErrorText(errorList)); + + //print stack trace once again for debugging: + for(String e : errorList) { + Log.e(TAG, e); + } } @Override diff --git a/app/src/main/res/drawable-hdpi/ic_headset_black_24dp.png b/app/src/main/res/drawable-hdpi/ic_headset_black_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..38eb219ef8aa003cbc917c2901d73f3742864496 GIT binary patch literal 349 zcmV-j0iyniP)9xqKhbqYg4a7Y6r1bpj4a$C&?w)P)eYfU2qLf;vGmc6!8M;2i}O(OeVF$ z%R2;44n55v1o}H$-ltDFAN-FUI`{+x_#CrM1?zN4$e0&a#)wnaa7UX@=9cwA3rBrs z`lA^WVj?19UisCpIXxWQX?)5MkD?|weCza<1^OBs)1ZvUvnH;=uC1GTU;~>?9(98U z)|=8J9&3%g>P2#Iwj1o~*)&+BNh;YBN+mKJ;v$mlQ~4{-R$3!7y=nYD92OkVF+aq;!5-NDJrheHBlR!QAms~3=4d3Iv*F$x%POyb7!Vgy_?CL^E>DF zooDWSo^!Ws8REhMp5ZGj;W}Q!&SCnt8NPs*u{Ficq2r&|uK{ylGtE!p_b~VrBPqAg z03q~mW5=-OvsjC!Pvi48b|=kzg1CzhQ_Ve0Y}EWzYIF@VcoN?~t3k|R8GGXU@wh+W zCmbHs{B$zEn&LBf+y&yfT8~kD658)EIf!|+q*og9(+Oe;qbas-W2{B{ zZs^6yuHZ6SuQad1e8L-;28eOZUVvB<6D;9h0R{4XF@G6Y8O5fw) z?hps#$H0B;>!;}dg}`DgM?PN1W7)(q9@<2Rd)S+kcO!AER+Lv_vmutTtxDX8;Cw^T zczQY>+312sSQr1H`~LCN5at z>gVdo#c2LcOM@}xpcxnf7rUB=;3fPSt8k>H(Wr9dQjXxMKFlvA^RsQjH>2?by$6d7 zG2NoQ9J&t9^djA*j7#t_w)cQo3hm=22wX|#r(4Za(WEjs!mavBNCPK!D+6f-F_Usv zBfi$Rc`81vjL?*k`gp|mD0{+O(q@P!%3N_RnV%ZSJT;!Melo5pFB#R2*^xG_fVdsG zr>SOkL*}XR4!nim{QK%)A!$dH*EP!P*vX;HYasja9)4+nIG1!=aRkqAnt2UmCtg*i k+7ZFkHm}@zHRp0w0bW3B~m|KP-%}=Y-wz_ zDsv+1vMM)4)(sUp?ux8SiZxz|tk1fN9Pr475L!RBytVTR>~P(h5H{SmS7YR>FP5B8 z;GETT{!7OcX!H%zSx1c0$Op4J{#e&gq=xRKr}5owI~5rUd5=vh)QGG%POH!tS$$Oo zBI}AOCq>qZGpdY)yr-rV>sk`2C+4jSVcoo4iZ!mf<~W%0EX{s2rvvrQdYi_U(|on< z2HJFKAKGuyqIXs-I;_|}57K93O)FAkJr#PEMb@eb6*_K-teL;{7nxP%l*pP^Wt;ce sC7MvFXDm{m9HrhN_q^V0!9o9q-!{wmnqcRJ!2kdN07*qoM6N<$f+kh3$p8QV literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-mdpi/ic_screen_rotation_white_24dp.png b/app/src/main/res/drawable-mdpi/ic_screen_rotation_white_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..b6acecf34abd8af5522ed49b4ee7125626946da0 GIT binary patch literal 639 zcmV-_0)YLAP)0YHSX;;O6=Xyaq=92Hq6p3OE3Ub0qJ8OW+(>NP)Km zSOsQ)vq&-vtn2p(u&4Z`ZtyCwspOSlydg;&7|D6=t|s*xSS*8Y#qc0rm*i`Kqzdc; zKYXQea9i-@k_ziUN0M6|1Pp0C-W0*h-=WK&mgKNN@(lQOT_x~b@W zWr<#L_TMD9&Fe*QUsJg!z~nzjYJPAB_!uR6$tf_EC>dA7w9L%znAyIWHGqDfRH;-B z&FsFJU6|QUqU3>@-7~YcH)iVDr#Z99)aM;wx`){>>3iA+s$t-*KJTFdN!RWImUH0> z4&yec-CIGs-i`~q3s@0+EAM%qw20eknz!E9V%weI_yd=Fl&Tqx@ zU4J%T|887QWvJ8?(v!Z|6;kD3AYj^i4*F^|tb3C3I)1h6LNc`Bz(8Nem>Ns1e8+Vqcw#ZP2I2i_O(=!b4$Wz9T^!pHYaS+ zndHTmJ$G*HYN%0I^&sW#2$=MogKHr-Ik*(k&cUXT!nUi=wG{ry2jCQLp-zXh2LJ#7 M07*qoM6N<$f6InX+~W{s1%9Trh+u>OK1`8S`&b#6qkfw8no3WrS2j z+de3XBuM`iwJ~*3iW)?Un4jav+_rk&d&gPKIOo85-sSmmm}l-i^S%cZi^XEGSS%LH z0=Cmg4`Ce5Doi&awi19Ok$| zP%i-=X{@1u{ZtU5otY&izLBqUCr)QCx9E+kFixrdqr`6RGZ{sq+Jspso6C%NDm=t* z!Z5drTEZR*&k2|@jc(wrr-I*d{3bBbg zqwW*eB42U@+=qc6gG%P9lE@H;JwJH@5lT_1QZggr8}3jN@<}G{4_`(7C0EJh5m7S5 zO5&dUu}z3TCoygO2$hZ{UbM4vhlB{!$0jhxIwf^oN&Kg_JY~HtAp#K!iE-nLO6rLC zZ;HhfDeGMc5omx|1zsqrLS_92i^&naBK`uc1Y;NI7ws(i2h32`C*mv+p@AU8E)W*I vAo_Z$I7RUin5L8Zh3~$_VzF2(7K`N{_zPlQnKI~100000NkvXXu0mjfgPMLk diff --git a/app/src/main/res/drawable-nodpi/ic_file_download_black.png b/app/src/main/res/drawable-nodpi/ic_file_download_black.png deleted file mode 100644 index 8c83bffa7e4443c2f9bc5c037152366bbd2b2a8c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 209 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeG3?%1&o4*=JaR&H=xB_ViXik240LWr43GxeO z_}|d-YF7`CTjJ^B7*fIb_UuMphX4_Wz@K-epY(rm$rSOv5x&UEQI+e--EU&)I|8Rx zn`YUVUt2QqqO7p8jPYX2Y1uALFv!Bh(&V7xf`I2(I$9v`=tPEz0uwjrB`PNJK1xr$ eb^X}yRc5jUbNLGR3)cYcXYh3Ob6Mw<&;$VajYK&B diff --git a/app/src/main/res/drawable-nodpi/ic_headset_black.png b/app/src/main/res/drawable-nodpi/ic_headset_black.png deleted file mode 100644 index 974457ee1dc25f4c8e68fb4908cd1d5eb4639e0c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 786 zcmV+t1MU2YP)*g2?U|Ie)Zs)xOsK$73 zW@#q~9V{8TXNVIN>Smzv`cLUlcrtJ8 z{E_4vHH`-`a-vNSwj33cH~0_NI+1Vmo!C-GQB2>DYeS;N0ye$!fBVmf7Sq^tLrlMk zYiZG90GkHI^vAfC5iPo~>42F28rN1tixf7=OLQ66Y6;rV%StArWbI{ z5oMd4uK{e+02)98XaHAbr@sc!02)98XaEhM0W^RH&;S}h184vZU?IR}qypq|Z7EU# zvbgpnQUTJqb}3Q;MsY1gF){%PG~>bj$OM?hlV;W<5nzo*JUSkM03~|y;T)xk1}HI% zPsjLCu>foI5`ZS|QLrAMz$}dfCdmcTWXXpfAWxPwqco$GQc5YMlu~8=1ygWd*VB(W Qz5oCK07*qoM6N<$g5iWP) z6p5em5X{d;NZld^2s_K2X@G9NiZGQ^g!OQ95+InLCak$+!W2#uwwH!9 zKsR4SXyF`TThajKd=+6KCBkN>0m}I*!c&CxFeVL9&Q}q36826Spq;NFjOGYo_rw7G zd_7?rCA{ybivjxidcv!OEsX*C`Fg@A{=z%VRWU$6Ur$&;*s>U)pRXqrIDmH`1<=pe z5LyYF8Uyt6^@IZ5c-tKyou7fQ7Q4t>g*U+HO28!jd?{fhr|?#k0~$D_pD!kC!~3)x z(59a+C(OVbU}Ox~p`R}&)YFSMCkE`n+o+!`BD{z9QViIIcbo~sl<)}NH!)xXOz(1Uk}5nemwfba?4!$y2-azJ<#xu`uPs1{0&~g)CB$f7*Njvyb>*Hf_{DsFs2iBgvOc^)+XjB0DkWi zwiCNdLJt$w^V5JE=_BlE1wlJM4KN-cti&P(K|4PUFy18W94!ihc77UgE#DG$ntQW9 z!knO-p9UDs^b&T8X;mbwNzcy$Fz%wCumM^X1m*lRz?esouo9h#C*Ext2#NU$fU%4r z;y%2n6CgBODPg}jG2}50WuI0^Hl(29{t3Xc!M$J^D__<^OXQ&GJTYH zf)46^eg?wk#C$QpXl6f^{mc@c1IR*1&DR5r5o{%0W5!yL}w~uD5wg97^M>&?AKojffVmI5EO987Tz^{Q0e#uObo{{zHxSx+G z>Ir&4>Y8|hFBrOV1VeFSX=N)vFjRYjp}bK{VI?oJgT4I9N%}cYkzOWO5AYvvcZv9C SVTN7+0000;*9}C?!)Sb)_t?1|A+zTt~?sLxG zx#!&5H9YI}{r2m;3X+onb46r8MAnGNGZA?zA`eAmQba~YWT;RmJkG0sCI&13?htR| zKo_vM)}WsN+kq7hUz!Mje}SJ|`FVrS1%6c^Q$V{Tt`(R_5drWV=mF+b3;t#dNLK|S z0R99%&KrJMHGBg+FcAAzPUaHe3b`$3ov5fzXO_qK?Bk4$e$0~F8WWZ z>-9i4@Y2-YpEdj~(_pXiHvu<{h%$hph_;v>>m0LLxrieCXdJwXYXk-iz@flit)>^i z*OkD}bHH~d#5V!g4ZwlGo-M$T%AW$(Wd*;-Bd-y-W<(qg?A;1Xs{DIELn!>1fiFAf zQ$*P1bTClF2f*Jd|8xlaZ@$YWp-uyE)rdF}SffMbz69P)OVCGM34V7de2NI~jSbY9 z!914~Y;QJih&l3RAmWM<;k_q-PgUN3z;a*sU6sP8h&URMukS&<)>+5&JLzj+XIAh= z#APF*$1``k%DHcyTMYb;tl?F!Ilv_&;+RKX1JM&}$v)K1PUV;Y>hltyL|il?dOh;` zReZa4tS*jx$@+jqtiMJgP9(%{(ksOkaKaS30L;!=#4O-v z)7N>&1(vFqCvgQ`B65ArixKfdB?XVyNJM|0A}-cQ#E+E}v>UrxBKo{U08drWlK;7g zGp@k9D&X^kg0X z0K14@s!BEvw7LRU0IyWw#(*Y=^AG{FdBLj$eHx9HO;d8SLq^2aN<;v=4g76jep=Ey zzzdc1ZD7-GBVrI}o&mgF^LKy+zR71);$Oh~fz1yZ5d%PDKz_R!`7vN#2tXsz=ev?U z0u}{|*k?ox`OF068+L-EHJ?yuJ<*3$4bT!;BRWn88eR znHo1;GeP-jb1QVf;sEv=fJtC&Ol%vDQ^HZ>hMoyvZ!Yi#KsR_%9NBsmbF%1j9(BZ= zPDH<@bnTH$;T6D_ME`NM-6Q%jcgkFM-fSq}*bfZ+Fwvj=d<<9x{Ena91r|DLd><1( zk}JFdm`(KT^E?JboAU@HI_LEX_e)ja4a9QbtcMWi9kiIg4cJgsa0keu;<6YE6_KSC zvM2&96OqqEWTS|@Cn76FWU+`ei^v}$vbj(wJjI@ literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/ic_share_black_24dp.png b/app/src/main/res/drawable-xhdpi/ic_share_black_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..81c80b700732c7f8d95022ed343a47a529bb6310 GIT binary patch literal 483 zcmV<90UZ8`P)U7)bX8PvpMCyj1<@L zk_wJ!3Plg>lVDHjd_C9D?zol5B&k{u#QWlcjS^iJqOG}YYxl0>XNS9cyuR_zENF`V zL^YY57oxS@wViYo^MZIwM)XOxQ>%0x?{xgp-Z&vypCOZ$d^P#|I@U}HMUNbiU60c~ z6f0KT&@a1w*R2#wK02dEcKbaPil)^-UBkSVhPrf)d;Q1fdtc~iLRGR}!xn{j#$~b1 zn6?mYP$o6+gh*quX$g^LyS-pWHVq-tsBG#&qyZUC2&L}Hs%pG6z9PFpV`j}5HQ+C_ Z?icFHxy#pVb)^6R002ovPDHLkV1k48;SK-* literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/ic_screen_rotation_white_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_screen_rotation_white_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..cc0fa87f734d97a79834304f0ce6fe2b9c4ff88e GIT binary patch literal 1873 zcmV-X2d?;uP)yHO;!4MIKWnc!zfuIsZLp0uv2i%B& zEF$}+C`%v+F%pfk%65<_#)}uXaPWY7Ga5}ixGM_Gz#vP;i7XYAQE#xI%7VP1XTd*4)dS9ibalBo~?FBxN28)GoWoHfRrHpZMc#xxjX8sp#J8e_gM zl}fE$m1ma$C;{7X<8R;-U@1`D)p-|+*raVKOln6f@HsFC=+V{r=LXO#MNA3Un!%)Y zv;b>>K1I|L3_x#SCvZA07)YCC;i-$?XIxB(hMb+pHpc>e(6!H^Lupci2?XMP;BJcmge5@Xg2G4}yK zDjKc8lFq8%ir5_KuxbOIPQ)%%3fKn>aOk`e$8NC1^dP!YYO`rosJc@Dr~#Uk|JYn* z%rYhUG$-x{Qsy-dIH~9?^{F*8upd?n9b=a$|K)waz(Dzp0FEm8O$wo56CX^p-pFiD z8OH*}r2PR+szpBh&jVvZXh@<%fJ1_4D=;e~*Wv@d(fghshojb-L6@Z_9t znMpzJ+JWJ~DM91i5d7^THgo3Z%b7+{fN zQbWL*v{K-20dCGiT8n-upB^IdGOf9aNrytrB%mAcmB7Ewmryh3a%gkPH0Q?VOC}8o zz&{eWnBe{gsL4uH4;)d=})XMtPN4DNDs%5s^Fe7OBi&ch9OS>Rpi8Z-v`j9-o8XD z>T)#L1`M*8GsQQN5I{e1H<9D&2D~9~-mL}iR?L~~n?Ohqz2ecXZnd7A_X~U-FZn

>U7s3pO*M+zJ*h;9#3RbT+K6qCG8+`!ujo;H#a(tN>`;9HwX3~?vDhmjUNzK5B6ytX$#+`Hx zu&t;o)ubo#nB*fk4E>(0Qcap@G3oZs5UiLR*R-&h^vC}u#i%rso(e7)0KkN1J<*#f1Pgygofp7(#iSOiNx*lB0bisPEbJ{uD8wcuAJn&-bf-2b+0=AA zgP`p_S*4n!9d6A?PbPtNLU7*{F*GbQ>0>GQ5g{;BcPKEF=n;ct(#&9$1%zT! zD{yNvun!%d0lnoRIK*O7rf!d-fV}l#loa?|BB&YY<{@ZniJ2Xwsz5-#vAvA+PK=Jt zkpTC43fEdpnv=V-001TM>6TToZQ;$=rHD#3B4zXoF>p?N{2~{JvoapCl>3C{Ae}g z_JDygUv87oyFG$*#cHCXiJBTEQU4R&)f!bq+cG6QpOVAY3X`eJ!>549k$VH1fsuhU zyiMv-bIOv?b_kvzJc8dbnA zipHu$Y|u8mARyWyC?y5(1Hv;TV0|J^-D?`hYgadb<#CL*bt*^)el8F_!#<-F&<4Cu zeC*@c%5BlGnY627&1nZP3j0?TE)Z?@w_%e*!*=3Mq7fKWRQ;&{T#tS0bsB7OX!Hes zc5pNiXtQ0X02oX9&rnF%?BK5=`VfkQeOwD4SpvEPD}cW|O>)hoooO!`j&7(lcyem7UXLS@7D zN;0X?M1bpzF{6wz_ZVa9w4 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/ic_share_black_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_share_black_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..784933ad55a011a9b829767844969f36ecd98b80 GIT binary patch literal 675 zcmV;U0$lxxP)UZPF>#3%k9#08-1VeKX7y3y)WkyiA4SZF@~9C4WBJmnPCX0 z4zY{`TA~+6`Y9urmFRP`J7pxKlKw8mSVjmhhq7VB(jcm45lbGb)(}etRQZUd3aYBj zwxF+wr95hqT&Ij!%AjPVwmX&vP;ii!NL{_7;o5nKkJMF>12j~Oi~K+Wz2{fRa*okZ zNBMvR`p!9G?B}idu^PKOT|8ym_`}>|Cp80j6!58#C&K^@)XEJ?NTBEJ!->-rkU%S( zz=aK6bWB+xg`IvdW7 zD%@pS~Mow4tCcWJy2G*_n05h-vIn4hi&{y~G$}-F#he1O2C?)6Rf~wFc~mVRmgbu6lTD*4jaWL5s!q#2`%N3lZX@Aw6Lm>) zNJwvp<3K0bkmYpXNPKq9E%JfK7b z!2zvGDH@|d;#ii!3CD8EgBc!Us#2*KlS(Rsi4UntDnnI91!EL0;J_fre1XewzC83f z1a8ji)xCH3-us;JKb|_h*1y)@ySsOH@9vsuLjYrqF+VZJ3~cY!}Z2lbq;9_8#rwDxo`8_ZP zIHK%0+8V$m0Z&3J>;!%ZTnY3mJD#=#a8br5p)VF=pNaux$5beQ1A*&-?*Xp^uLARc zPY2k@+8njQN5GxHfhpsz1c2ed+d?AN16KvuiuEKk@h{-gl<}7eU<~lFl7u>NOMuM_ zfvpim0NY0#lQI{D0~igg^-Mq=xIMu31qnphNI*rXG=Niqb%6<}1G58sq!0n%2L$v@ zl>=}Z;mL2J4%`~x>wNq~cmbFWEb`>B7#N;1Pe}lrj_p__>;@hN);RuC2W|`Sc^=T? zu=gBLYy7t#a3iqNLxlCfh3T>t8NeAH$-k-b-;vm%pi6|1K4Fp|!ZX7E4{ZpuOA%ow z0hOUNppSNT12^_5GaPqKtOIujaF_sW){@_+%$dNy6%hdL&61Zw0E`7TILPk;W(j3S zpg#$B1aO%MYylPolsO1^SrH(pG8BeJ4bqZ-gJR{O!SAZP~5AS9%Inali zV$E-1YZ$OX34TriF-^iEpVxRQTepv{wkRTU6nw8CREFd{V%7r`%h zB;VQWIBXBa{UiX~7ds|_hiiba3^+VBk5^VZO`8$9wCWs|7fWg30MTD;>@;wUq zDezuWZ5q>-^m>6QDFVq0-~`}3MT8{H5%5#N-&^=jQ2=M-uKATseiOj4K(`{o`~-d{ zIsBdOV_*XA9R6|sq@0B}68yhss%8n(8#!qZyefw-3fdx6O@38#jq2oFW}`BlMB zH?C#~yER0@_I68t6TorUxq27kyf9gRM`1S{w8Ckwf`4-)|MFM_%Ydf{k3{tMJHdzC z`6KVy^jgEMI`A8!J{rl_eS-a8xe7_--k^-7wgkYAjx-S-i{NLBV0#177dhAuB_zDr zVIpWl)a=s-X3usEqXeU3r}VSfG$vNQZpx*$`og z67Q2a>^~vce9Bd*2E3$@TGT-z9F5&}?t+{!w{2U=ZYq^UxbQ?@Pda3 zpDUDDA~ZzMz8ibK3}Vu-s)=_xNQ6N?B2eT$&<3&nBJ7KAmLbC9`$gCX->RwzM-@sc z5gH;aRO0=186s%Y7E6J_g_25y=prD0yBjpw_J1bA;T|G<$4dm{)vvJ`h&`r|TGnAA zyy+o=`xGwV6`^pZPl?|Flpr^Fjphq(W*59diB-etm-c zVK^{bDD+xRV%mE`cL#}}^$B(045{!aq0m}#4yVwEsNKM^d3;m_=zYS=Qo;Vn-}R1; zKuqhHmv)#4ZwPTNaTR<`D0FuuVvl-=FgS*t&Z%hD};%;_& zfb)Hg)v!nPw!*840(j6vgcDNu&I@1)?wa2NoEK{JR>4>u_s@5tPyD#_mhoEyuT>xC)l!Fb4Dlr-^S(INm>dn7;J zND(*~`3#;O61T^=PaOe!X52|BIqbznOMbpK-{JUXhtofh_<9fY(a{QEXkrf2v4>7c z*o@ChRz~OjvBzymNWL!;xXVL?VTpWSQ(E%(BGH9>PDGsoj;8StVP$L)fEh~iHv!{g z`gD=G!$G8%6z$*ta+s%xuo^fek}s{ZdZcu1-_iow)b)*c5slZ zIRb9LUGq0oD)~)d?^$#O5Aa>!pa7c-uRB?Mys{xplMz7W^s=Qz)iUOvGqvX z2&)L}m4UAN!J1fsy(Fz)qg)MpSC@p)C*d|lgf-Y%UM>0hfqGQ~_858X>+&WRVaMFs z=dNIP6!|mY);CF5hwB)zsslI-_ zu^qT9fWwz?H#K{sJ)0dDut&fAJhBK|3Aj8HeRKr2qKrwIi&BBT=UqE*Aq3liivs*l zMIIn5q8+cK4Fzxj_8LI#>ZuSByr(;`ebZdvN5JdY7sQ#s0V(6I9I*GS%);1}pGaV~5JE-5>nwg$F&m<9YSqZn;-fOzErd_y=3_zxq4hNx9T zv4=_o0QjUaX1Fn?%NR4n7;~aAX0S2l5M#^$W6Y + android:visibility="visible">