diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 5aa1dc982..06d621016 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -209,6 +209,29 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
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 63f4fc722..269125e27 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
@@ -52,6 +52,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.ExtractionException;
import org.schabi.newpipe.extractor.exceptions.ParsingException;
@@ -366,7 +367,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;
@@ -624,13 +626,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;
}
@@ -668,10 +670,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() {
@@ -696,17 +704,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");
@@ -737,7 +745,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;
}
@@ -757,10 +769,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();
initTabs();
@@ -1042,7 +1054,7 @@ public class VideoDetailFragment
}
}
- pushToStack(serviceId, url, name);
+ //pushToStack(serviceId, url, name);
animateView(thumbnailPlayButton, true, 200);
videoTitleTextView.setText(name);
@@ -1093,11 +1105,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);
@@ -1154,20 +1168,28 @@ public class VideoDetailFragment
public void openDownloadDialog() {
- try {
- DownloadDialog downloadDialog = DownloadDialog.newInstance(currentInfo);
- downloadDialog.setVideoStreams(sortedVideoStreams);
- downloadDialog.setAudioStreams(currentInfo.getAudioStreams());
- downloadDialog.setSelectedVideoStream(selectedVideoStreamIndex);
- downloadDialog.setSubtitleStreams(currentInfo.getSubtitles());
+ try {
+ DownloadDialog downloadDialog = DownloadDialog.newInstance(currentInfo);
+ downloadDialog.setVideoStreams(sortedVideoStreams);
+ downloadDialog.setAudioStreams(currentInfo.getAudioStreams());
+ downloadDialog.setSelectedVideoStream(selectedVideoStreamIndex);
+ downloadDialog.setSubtitleStreams(currentInfo.getSubtitles());
- downloadDialog.show(activity.getSupportFragmentManager(), "downloadDialog");
- } catch (Exception e) {
- Toast.makeText(activity,
- R.string.could_not_setup_download_menu,
- Toast.LENGTH_LONG).show();
- e.printStackTrace();
- }
+ downloadDialog.show(activity.getSupportFragmentManager(), "downloadDialog");
+ } catch (Exception e) {
+ 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 2833abb8d..c683f1af7 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
@@ -104,8 +104,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;
@@ -335,7 +340,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("");
@@ -736,6 +741,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/playback/BasePlayerMediaSession.java b/app/src/main/java/org/schabi/newpipe/player/playback/BasePlayerMediaSession.java
index 00604b236..657fe1327 100644
--- a/app/src/main/java/org/schabi/newpipe/player/playback/BasePlayerMediaSession.java
+++ b/app/src/main/java/org/schabi/newpipe/player/playback/BasePlayerMediaSession.java
@@ -1,7 +1,9 @@
package org.schabi.newpipe.player.playback;
import android.net.Uri;
+import android.os.Bundle;
import android.support.v4.media.MediaDescriptionCompat;
+import android.support.v4.media.MediaMetadataCompat;
import org.schabi.newpipe.player.BasePlayer;
import org.schabi.newpipe.player.mediasession.MediaSessionCallback;
@@ -54,6 +56,12 @@ public class BasePlayerMediaSession implements MediaSessionCallback {
.setTitle(item.getTitle())
.setSubtitle(item.getUploader());
+ // set additional metadata for A2DP/AVRCP
+ Bundle additionalMetadata = new Bundle();
+ additionalMetadata.putString(MediaMetadataCompat.METADATA_KEY_ARTIST, item.getUploader());
+ additionalMetadata.putLong(MediaMetadataCompat.METADATA_KEY_DURATION, item.getDuration());
+ descriptionBuilder.setExtras(additionalMetadata);
+
final Uri thumbnailUri = Uri.parse(item.getThumbnailUrl());
if (thumbnailUri != null) descriptionBuilder.setIconUri(thumbnailUri);
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 2dcf4a6ec..7abebc49e 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
@@ -94,15 +94,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 3f6d82b9f..0f1c39473 100644
--- a/app/src/main/java/org/schabi/newpipe/util/ExtractorHelper.java
+++ b/app/src/main/java/org/schabi/newpipe/util/ExtractorHelper.java
@@ -32,6 +32,7 @@ import org.schabi.newpipe.extractor.Info;
import org.schabi.newpipe.extractor.InfoItem;
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.comments.CommentsInfo;
import org.schabi.newpipe.extractor.exceptions.ContentNotAvailableException;
@@ -47,6 +48,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;
@@ -96,10 +98,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 f58bfb50c..df9a1fcba 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -141,6 +141,7 @@
Comments
Tracks
Users
+ Events
Yes
Later
Disabled
@@ -408,6 +409,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