diff --git a/app/build.gradle b/app/build.gradle
index 782634a0b..75f966a9b 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -57,7 +57,7 @@ dependencies {
exclude module: 'support-annotations'
})
- implementation 'com.github.TeamNewPipe:NewPipeExtractor:f7c7b9df1a'
+ implementation 'com.github.TeamNewPipe:NewPipeExtractor:79b0a19d1af'
testImplementation 'junit:junit:4.12'
testImplementation 'org.mockito:mockito-core:2.23.0'
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 06d621016..4cd8e83f9 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -35,12 +35,6 @@
-
-
@@ -183,6 +177,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java
index edca200d7..c346e1329 100644
--- a/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java
+++ b/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java
@@ -55,6 +55,7 @@ import org.schabi.newpipe.ReCaptchaActivity;
import org.schabi.newpipe.download.DownloadDialog;
import org.schabi.newpipe.extractor.InfoItem;
import org.schabi.newpipe.extractor.NewPipe;
+import org.schabi.newpipe.extractor.ServiceList;
import org.schabi.newpipe.extractor.exceptions.ContentNotAvailableException;
import org.schabi.newpipe.extractor.exceptions.ParsingException;
import org.schabi.newpipe.extractor.services.youtube.extractors.YoutubeStreamExtractor;
@@ -362,7 +363,8 @@ public class VideoDetailFragment
}
break;
case R.id.detail_controls_download:
- if (PermissionHelper.checkStoragePermissions(activity, PermissionHelper.DOWNLOAD_DIALOG_REQUEST_CODE)) {
+ if (PermissionHelper.checkStoragePermissions(activity,
+ PermissionHelper.DOWNLOAD_DIALOG_REQUEST_CODE)) {
this.openDownloadDialog();
}
break;
@@ -446,7 +448,6 @@ public class VideoDetailFragment
return;
}
- //Log.d(TAG, "toggleExpandRelatedVideos() called with: info = [" + info + "], from = [" + INITIAL_RELATED_VIDEOS + "]");
for (int i = INITIAL_RELATED_VIDEOS; i < info.getRelatedStreams().size(); i++) {
InfoItem item = info.getRelatedStreams().get(i);
//Log.d(TAG, "i = " + i);
@@ -519,7 +520,9 @@ public class VideoDetailFragment
infoItemBuilder.setOnStreamSelectedListener(new OnClickGesture() {
@Override
public void selected(StreamInfoItem selectedItem) {
- selectAndLoadVideo(selectedItem.getServiceId(), selectedItem.getUrl(), selectedItem.getName());
+ selectAndLoadVideo(selectedItem.getServiceId(),
+ selectedItem.getUrl(),
+ selectedItem.getName());
}
@Override
@@ -699,13 +702,13 @@ public class VideoDetailFragment
switch (id) {
case R.id.menu_item_share: {
if (currentInfo != null) {
- shareUrl(currentInfo.getName(), currentInfo.getUrl());
+ shareUrl(currentInfo.getName(), currentInfo.getOriginalUrl());
}
return true;
}
case R.id.menu_item_openInBrowser: {
if (currentInfo != null) {
- openUrlInBrowser(currentInfo.getUrl());
+ openUrlInBrowser(currentInfo.getOriginalUrl());
}
return true;
}
@@ -742,10 +745,16 @@ public class VideoDetailFragment
boolean isExternalPlayerEnabled = PreferenceManager.getDefaultSharedPreferences(activity)
.getBoolean(activity.getString(R.string.use_external_video_player_key), false);
- sortedVideoStreams = ListHelper.getSortedStreamVideosList(activity, info.getVideoStreams(), info.getVideoOnlyStreams(), false);
+ sortedVideoStreams = ListHelper.getSortedStreamVideosList(
+ activity,
+ info.getVideoStreams(),
+ info.getVideoOnlyStreams(),
+ false);
selectedVideoStreamIndex = ListHelper.getDefaultResolutionIndex(activity, sortedVideoStreams);
- final StreamItemAdapter streamsAdapter = new StreamItemAdapter<>(activity, new StreamSizeWrapper<>(sortedVideoStreams, activity), isExternalPlayerEnabled);
+ final StreamItemAdapter streamsAdapter =
+ new StreamItemAdapter<>(activity,
+ new StreamSizeWrapper<>(sortedVideoStreams, activity), isExternalPlayerEnabled);
spinnerToolbar.setAdapter(streamsAdapter);
spinnerToolbar.setSelection(selectedVideoStreamIndex);
spinnerToolbar.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@@ -770,17 +779,17 @@ public class VideoDetailFragment
*/
protected final LinkedList stack = new LinkedList<>();
- public void clearHistory() {
- stack.clear();
- }
-
public void pushToStack(int serviceId, String videoUrl, String name) {
if (DEBUG) {
- Log.d(TAG, "pushToStack() called with: serviceId = [" + serviceId + "], videoUrl = [" + videoUrl + "], name = [" + name + "]");
+ Log.d(TAG, "pushToStack() called with: serviceId = ["
+ + serviceId + "], videoUrl = [" + videoUrl + "], name = [" + name + "]");
}
- if (stack.size() > 0 && stack.peek().getServiceId() == serviceId && stack.peek().getUrl().equals(videoUrl)) {
- Log.d(TAG, "pushToStack() called with: serviceId == peek.serviceId = [" + serviceId + "], videoUrl == peek.getUrl = [" + videoUrl + "]");
+ if (stack.size() > 0
+ && stack.peek().getServiceId() == serviceId
+ && stack.peek().getUrl().equals(videoUrl)) {
+ Log.d(TAG, "pushToStack() called with: serviceId == peek.serviceId = ["
+ + serviceId + "], videoUrl == peek.getUrl = [" + videoUrl + "]");
return;
} else {
Log.d(TAG, "pushToStack() wasn't equal");
@@ -811,7 +820,11 @@ public class VideoDetailFragment
// Get stack item from the new top
StackItem peek = stack.peek();
- selectAndLoadVideo(peek.getServiceId(), peek.getUrl(), !TextUtils.isEmpty(peek.getTitle()) ? peek.getTitle() : "");
+ selectAndLoadVideo(peek.getServiceId(),
+ peek.getUrl(),
+ !TextUtils.isEmpty(peek.getTitle())
+ ? peek.getTitle()
+ : "");
return true;
}
@@ -831,9 +844,10 @@ public class VideoDetailFragment
}
public void prepareAndHandleInfo(final StreamInfo info, boolean scrollToTop) {
- if (DEBUG) Log.d(TAG, "prepareAndHandleInfo() called with: info = [" + info + "], scrollToTop = [" + scrollToTop + "]");
+ if (DEBUG) Log.d(TAG, "prepareAndHandleInfo() called with: info = ["
+ + info + "], scrollToTop = [" + scrollToTop + "]");
- setInitialData(info.getServiceId(), info.getOriginalUrl(), info.getName());
+ setInitialData(info.getServiceId(), info.getUrl(), info.getName());
pushToStack(serviceId, url, name);
showLoading();
@@ -1026,7 +1040,8 @@ public class VideoDetailFragment
private void showContentWithAnimation(long duration,
long delay,
- @FloatRange(from = 0.0f, to = 1.0f) float translationPercent) {
+ @FloatRange(from = 0.0f, to = 1.0f)
+ float translationPercent) {
int translationY = (int) (getResources().getDisplayMetrics().heightPixels *
(translationPercent > 0.0f ? translationPercent : .06f));
@@ -1134,7 +1149,7 @@ public class VideoDetailFragment
super.handleResult(info);
setInitialData(info.getServiceId(), info.getOriginalUrl(), info.getName());
- pushToStack(serviceId, url, name);
+ //pushToStack(serviceId, url, name);
animateView(thumbnailPlayButton, true, 200);
videoTitleTextView.setText(name);
@@ -1185,11 +1200,13 @@ public class VideoDetailFragment
if (info.getDuration() > 0) {
detailDurationView.setText(Localization.getDurationString(info.getDuration()));
- detailDurationView.setBackgroundColor(ContextCompat.getColor(activity, R.color.duration_background_color));
+ detailDurationView.setBackgroundColor(
+ ContextCompat.getColor(activity, R.color.duration_background_color));
animateView(detailDurationView, true, 100);
} else if (info.getStreamType() == StreamType.LIVE_STREAM) {
detailDurationView.setText(R.string.duration_live);
- detailDurationView.setBackgroundColor(ContextCompat.getColor(activity, R.color.live_duration_background_color));
+ detailDurationView.setBackgroundColor(
+ ContextCompat.getColor(activity, R.color.live_duration_background_color));
animateView(detailDurationView, true, 100);
} else {
detailDurationView.setVisibility(View.GONE);
@@ -1269,10 +1286,18 @@ public class VideoDetailFragment
downloadDialog.show(activity.getSupportFragmentManager(), "downloadDialog");
} catch (Exception e) {
- Toast.makeText(activity,
- R.string.could_not_setup_download_menu,
- Toast.LENGTH_LONG).show();
- e.printStackTrace();
+ ErrorActivity.ErrorInfo info = ErrorActivity.ErrorInfo.make(UserAction.UI_ERROR,
+ ServiceList.all()
+ .get(currentInfo
+ .getServiceId())
+ .getServiceInfo()
+ .getName(), "",
+ R.string.could_not_setup_download_menu);
+
+ ErrorActivity.reportError(getActivity(),
+ e,
+ getActivity().getClass(),
+ getActivity().findViewById(android.R.id.content), info);
}
}
diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/channel/ChannelFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/list/channel/ChannelFragment.java
index 6a3b3eb50..b9489ffa7 100644
--- a/app/src/main/java/org/schabi/newpipe/fragments/list/channel/ChannelFragment.java
+++ b/app/src/main/java/org/schabi/newpipe/fragments/list/channel/ChannelFragment.java
@@ -233,10 +233,10 @@ public class ChannelFragment extends BaseListInfoFragment {
openRssFeed();
break;
case R.id.menu_item_openInBrowser:
- openUrlInBrowser(url);
+ openUrlInBrowser(currentInfo.getOriginalUrl());
break;
case R.id.menu_item_share:
- shareUrl(name, url);
+ shareUrl(name, currentInfo.getOriginalUrl());
break;
default:
return super.onOptionsItemSelected(item);
diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/search/SearchFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/list/search/SearchFragment.java
index 0e8aad01d..87ebf14d2 100644
--- a/app/src/main/java/org/schabi/newpipe/fragments/list/search/SearchFragment.java
+++ b/app/src/main/java/org/schabi/newpipe/fragments/list/search/SearchFragment.java
@@ -105,8 +105,13 @@ public class SearchFragment
// this three represet the current search query
@State
protected String searchString;
+
+ /**
+ * No content filter should add like contentfilter = all
+ * be aware of this when implementing an extractor.
+ */
@State
- protected String[] contentFilter;
+ protected String[] contentFilter = new String[0];
@State
protected String sortFilter;
@@ -336,7 +341,7 @@ public class SearchFragment
|| (searchEditText != null && !TextUtils.isEmpty(searchEditText.getText()))) {
search(!TextUtils.isEmpty(searchString)
? searchString
- : searchEditText.getText().toString(), new String[0], "");
+ : searchEditText.getText().toString(), this.contentFilter, "");
} else {
if (searchEditText != null) {
searchEditText.setText("");
@@ -741,6 +746,7 @@ public class SearchFragment
@Override
protected void loadMoreItems() {
+ if(nextPageUrl == null || nextPageUrl.isEmpty()) return;
isLoading.set(true);
showListFooter(true);
if (searchDisposable != null) searchDisposable.dispose();
diff --git a/app/src/main/java/org/schabi/newpipe/player/PopupVideoPlayer.java b/app/src/main/java/org/schabi/newpipe/player/PopupVideoPlayer.java
index f5c731ed9..8ea3d509c 100644
--- a/app/src/main/java/org/schabi/newpipe/player/PopupVideoPlayer.java
+++ b/app/src/main/java/org/schabi/newpipe/player/PopupVideoPlayer.java
@@ -626,6 +626,7 @@ public final class PopupVideoPlayer extends Service {
@Override
public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
super.onLoadingComplete(imageUri, view, loadedImage);
+ if (playerImpl == null) return;
// rebuild notification here since remote view does not release bitmaps,
// causing memory leaks
resetNotification();
diff --git a/app/src/main/java/org/schabi/newpipe/player/helper/AudioReactor.java b/app/src/main/java/org/schabi/newpipe/player/helper/AudioReactor.java
index 46d20c7e1..f148aed27 100644
--- a/app/src/main/java/org/schabi/newpipe/player/helper/AudioReactor.java
+++ b/app/src/main/java/org/schabi/newpipe/player/helper/AudioReactor.java
@@ -131,7 +131,7 @@ public class AudioReactor implements AudioManager.OnAudioFocusChangeListener,
private void onAudioFocusLossCanDuck() {
Log.d(TAG, "onAudioFocusLossCanDuck() called");
// Set the volume to 1/10 on ducking
- animateAudio(player.getVolume(), DUCK_AUDIO_TO);
+ player.setVolume(DUCK_AUDIO_TO);
}
private void animateAudio(final float from, final float to) {
diff --git a/app/src/main/java/org/schabi/newpipe/player/resolver/VideoPlaybackResolver.java b/app/src/main/java/org/schabi/newpipe/player/resolver/VideoPlaybackResolver.java
index ad2b79523..c62dc1088 100644
--- a/app/src/main/java/org/schabi/newpipe/player/resolver/VideoPlaybackResolver.java
+++ b/app/src/main/java/org/schabi/newpipe/player/resolver/VideoPlaybackResolver.java
@@ -93,15 +93,17 @@ public class VideoPlaybackResolver implements PlaybackResolver {
// Below are auxiliary media sources
// Create subtitle sources
- for (final SubtitlesStream subtitle : info.getSubtitles()) {
- final String mimeType = PlayerHelper.subtitleMimeTypesOf(subtitle.getFormat());
- if (mimeType == null) continue;
+ if(info.getSubtitles() != null) {
+ for (final SubtitlesStream subtitle : info.getSubtitles()) {
+ final String mimeType = PlayerHelper.subtitleMimeTypesOf(subtitle.getFormat());
+ if (mimeType == null) continue;
- final Format textFormat = Format.createTextSampleFormat(null, mimeType,
- SELECTION_FLAG_AUTOSELECT, PlayerHelper.captionLanguageOf(context, subtitle));
- final MediaSource textSource = dataSource.getSampleMediaSourceFactory()
- .createMediaSource(Uri.parse(subtitle.getURL()), textFormat, TIME_UNSET);
- mediaSources.add(textSource);
+ final Format textFormat = Format.createTextSampleFormat(null, mimeType,
+ SELECTION_FLAG_AUTOSELECT, PlayerHelper.captionLanguageOf(context, subtitle));
+ final MediaSource textSource = dataSource.getSampleMediaSourceFactory()
+ .createMediaSource(Uri.parse(subtitle.getURL()), textFormat, TIME_UNSET);
+ mediaSources.add(textSource);
+ }
}
if (mediaSources.size() == 1) {
diff --git a/app/src/main/java/org/schabi/newpipe/util/ExtractorHelper.java b/app/src/main/java/org/schabi/newpipe/util/ExtractorHelper.java
index e04c1e8d0..041f4933f 100644
--- a/app/src/main/java/org/schabi/newpipe/util/ExtractorHelper.java
+++ b/app/src/main/java/org/schabi/newpipe/util/ExtractorHelper.java
@@ -31,6 +31,7 @@ import org.schabi.newpipe.ReCaptchaActivity;
import org.schabi.newpipe.extractor.Info;
import org.schabi.newpipe.extractor.ListExtractor.InfoItemsPage;
import org.schabi.newpipe.extractor.NewPipe;
+import org.schabi.newpipe.extractor.SuggestionExtractor;
import org.schabi.newpipe.extractor.channel.ChannelInfo;
import org.schabi.newpipe.extractor.channel.ChannelInfoItem;
import org.schabi.newpipe.extractor.exceptions.ContentNotAvailableException;
@@ -46,6 +47,7 @@ import org.schabi.newpipe.report.UserAction;
import java.io.IOException;
import java.io.InterruptedIOException;
+import java.util.Collections;
import java.util.List;
import io.reactivex.Maybe;
@@ -95,10 +97,13 @@ public final class ExtractorHelper {
public static Single> suggestionsFor(final int serviceId,
final String query) {
checkServiceId(serviceId);
- return Single.fromCallable(() ->
- NewPipe.getService(serviceId)
- .getSuggestionExtractor()
- .suggestionList(query));
+ return Single.fromCallable(() -> {
+ SuggestionExtractor extractor = NewPipe.getService(serviceId)
+ .getSuggestionExtractor();
+ return extractor != null
+ ? extractor.suggestionList(query)
+ : Collections.emptyList();
+ });
}
public static Single getStreamInfo(final int serviceId,
diff --git a/app/src/main/java/org/schabi/newpipe/util/KioskTranslator.java b/app/src/main/java/org/schabi/newpipe/util/KioskTranslator.java
index 392892cef..a04e1145f 100644
--- a/app/src/main/java/org/schabi/newpipe/util/KioskTranslator.java
+++ b/app/src/main/java/org/schabi/newpipe/util/KioskTranslator.java
@@ -31,6 +31,8 @@ public class KioskTranslator {
return c.getString(R.string.top_50);
case "New & hot":
return c.getString(R.string.new_and_hot);
+ case "conferences":
+ return c.getString(R.string.conferences);
default:
return kioskId;
}
@@ -44,6 +46,8 @@ public class KioskTranslator {
return ThemeHelper.resolveResourceIdFromAttr(c, R.attr.ic_hot);
case "New & hot":
return ThemeHelper.resolveResourceIdFromAttr(c, R.attr.ic_hot);
+ case "conferences":
+ return ThemeHelper.resolveResourceIdFromAttr(c, R.attr.ic_hot);
default:
return 0;
}
diff --git a/app/src/main/java/org/schabi/newpipe/util/ServiceHelper.java b/app/src/main/java/org/schabi/newpipe/util/ServiceHelper.java
index 7c781eb14..c6ce3fec7 100644
--- a/app/src/main/java/org/schabi/newpipe/util/ServiceHelper.java
+++ b/app/src/main/java/org/schabi/newpipe/util/ServiceHelper.java
@@ -24,9 +24,11 @@ public class ServiceHelper {
case 0:
return R.drawable.place_holder_youtube;
case 1:
- return R.drawable.place_holder_circle;
+ return R.drawable.place_holder_cloud;
+ case 2:
+ return R.drawable.place_holder_gadse;
default:
- return R.drawable.service;
+ return R.drawable.place_holder_circle;
}
}
@@ -38,6 +40,8 @@ public class ServiceHelper {
case "playlists": return c.getString(R.string.playlists);
case "tracks": return c.getString(R.string.tracks);
case "users": return c.getString(R.string.users);
+ case "conferences" : return c.getString(R.string.conferences);
+ case "events" : return c.getString(R.string.events);
default: return filter;
}
}
diff --git a/app/src/main/java/org/schabi/newpipe/util/StreamItemAdapter.java b/app/src/main/java/org/schabi/newpipe/util/StreamItemAdapter.java
index eb106f91d..49a7125ed 100644
--- a/app/src/main/java/org/schabi/newpipe/util/StreamItemAdapter.java
+++ b/app/src/main/java/org/schabi/newpipe/util/StreamItemAdapter.java
@@ -28,7 +28,8 @@ import io.reactivex.schedulers.Schedulers;
import us.shandian.giga.util.Utility;
/**
- * A list adapter for a list of {@link Stream streams}, currently supporting {@link VideoStream} and {@link AudioStream}.
+ * A list adapter for a list of {@link Stream streams},
+ * currently supporting {@link VideoStream}, {@link AudioStream} and {@link SubtitlesStream}
*/
public class StreamItemAdapter extends BaseAdapter {
private final Context context;
@@ -110,7 +111,10 @@ public class StreamItemAdapter extends BaseA
}
}
} else if (stream instanceof AudioStream) {
- qualityString = ((AudioStream) stream).getAverageBitrate() + "kbps";
+ AudioStream audioStream = ((AudioStream) stream);
+ qualityString = audioStream.getAverageBitrate() > 0
+ ? audioStream.getAverageBitrate() + "kbps"
+ : audioStream.getFormat().getName();
} else if (stream instanceof SubtitlesStream) {
qualityString = ((SubtitlesStream) stream).getDisplayLanguageName();
if (((SubtitlesStream) stream).isAutoGenerated()) {
@@ -154,8 +158,10 @@ public class StreamItemAdapter extends BaseA
private final long[] streamSizes;
private final String unknownSize;
- public StreamSizeWrapper(List streamsList, Context context) {
- this.streamsList = streamsList;
+ public StreamSizeWrapper(List sL, Context context) {
+ this.streamsList = sL != null
+ ? sL
+ : Collections.emptyList();
this.streamSizes = new long[streamsList.size()];
this.unknownSize = context == null ? "--.-" : context.getString(R.string.unknown_content);
diff --git a/app/src/main/java/org/schabi/newpipe/util/ThemeHelper.java b/app/src/main/java/org/schabi/newpipe/util/ThemeHelper.java
index 1d1b66bf9..0c7861e16 100644
--- a/app/src/main/java/org/schabi/newpipe/util/ThemeHelper.java
+++ b/app/src/main/java/org/schabi/newpipe/util/ThemeHelper.java
@@ -137,7 +137,9 @@ public class ThemeHelper {
else if (selectedTheme.equals(darkTheme)) themeName = "DarkTheme";
themeName += "." + service.getServiceInfo().getName();
- int resourceId = context.getResources().getIdentifier(themeName, "style", context.getPackageName());
+ int resourceId = context
+ .getResources()
+ .getIdentifier(themeName, "style", context.getPackageName());
if (resourceId > 0) {
return resourceId;
diff --git a/app/src/main/res/drawable-nodpi/place_holder_cloud.png b/app/src/main/res/drawable-nodpi/place_holder_cloud.png
new file mode 100644
index 000000000..f78e846e1
Binary files /dev/null and b/app/src/main/res/drawable-nodpi/place_holder_cloud.png differ
diff --git a/app/src/main/res/drawable-nodpi/place_holder_gadse.png b/app/src/main/res/drawable-nodpi/place_holder_gadse.png
new file mode 100644
index 000000000..f11dd57e5
Binary files /dev/null and b/app/src/main/res/drawable-nodpi/place_holder_gadse.png differ
diff --git a/app/src/main/res/drawable-v23/splash_background.xml b/app/src/main/res/drawable-v23/splash_background.xml
new file mode 100644
index 000000000..a67fbc4a6
--- /dev/null
+++ b/app/src/main/res/drawable-v23/splash_background.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/splash_background.xml b/app/src/main/res/drawable/splash_background.xml
new file mode 100644
index 000000000..5b805cffa
--- /dev/null
+++ b/app/src/main/res/drawable/splash_background.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/splash_forground.xml b/app/src/main/res/drawable/splash_forground.xml
new file mode 100644
index 000000000..cfb650758
--- /dev/null
+++ b/app/src/main/res/drawable/splash_forground.xml
@@ -0,0 +1,10 @@
+
+
+
diff --git a/app/src/main/res/values-v21/styles_services.xml b/app/src/main/res/values-v21/styles_services.xml
index e3d6c24e2..6c118bc09 100644
--- a/app/src/main/res/values-v21/styles_services.xml
+++ b/app/src/main/res/values-v21/styles_services.xml
@@ -31,4 +31,22 @@
- @color/dark_soundcloud_accent_color
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values/colors_services.xml b/app/src/main/res/values/colors_services.xml
index 761b721d0..ea90cb083 100644
--- a/app/src/main/res/values/colors_services.xml
+++ b/app/src/main/res/values/colors_services.xml
@@ -22,4 +22,15 @@
#FFFFFF
#ff9100
+
+ #9e9e9e
+ #616161
+ #000000
+ #afafaf
+
+ #9e9e9e
+ #616161
+ #FFFFFF
+ #afafaf
+
\ No newline at end of file
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 3756119a6..462b331d2 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -137,6 +137,7 @@
Videos
Tracks
Users
+ Events
Yes
Later
Disabled
@@ -396,6 +397,7 @@
Trending
Top 50
New & hot
+ Conferences
%1$s/%2$s
diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml
index 8753b9295..a7686dedc 100644
--- a/app/src/main/res/values/styles.xml
+++ b/app/src/main/res/values/styles.xml
@@ -5,7 +5,7 @@
- @android:color/transparent
- @android:color/transparent
- - @color/dark_background_color
+ - @drawable/splash_background
diff --git a/app/src/main/res/values/styles_services.xml b/app/src/main/res/values/styles_services.xml
index 7ca9dacde..257b1905d 100644
--- a/app/src/main/res/values/styles_services.xml
+++ b/app/src/main/res/values/styles_services.xml
@@ -9,6 +9,7 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/xml/appearance_settings.xml b/app/src/main/res/xml/appearance_settings.xml
index 437736ab0..b5f222130 100644
--- a/app/src/main/res/xml/appearance_settings.xml
+++ b/app/src/main/res/xml/appearance_settings.xml
@@ -1,9 +1,11 @@
diff --git a/app/src/main/res/xml/debug_settings.xml b/app/src/main/res/xml/debug_settings.xml
index c0bb1505d..7059ee8ce 100644
--- a/app/src/main/res/xml/debug_settings.xml
+++ b/app/src/main/res/xml/debug_settings.xml
@@ -1,16 +1,19 @@
diff --git a/app/src/main/res/xml/main_settings.xml b/app/src/main/res/xml/main_settings.xml
index 74450f77b..cd9dc3278 100644
--- a/app/src/main/res/xml/main_settings.xml
+++ b/app/src/main/res/xml/main_settings.xml
@@ -1,41 +1,49 @@
+
diff --git a/assets/pure_logo.svg b/assets/pure_logo.svg
new file mode 100644
index 000000000..4455b19c6
--- /dev/null
+++ b/assets/pure_logo.svg
@@ -0,0 +1,67 @@
+
+
+
+
\ No newline at end of file