From 5923663e08db5758de326b6413418b15d77e954d Mon Sep 17 00:00:00 2001 From: Christian Schabesberger Date: Mon, 27 Feb 2017 21:14:03 +0100 Subject: [PATCH] add routed_intent activity --- app/src/main/AndroidManifest.xml | 115 +++++++------ .../org/schabi/newpipe/RouterActivity.java | 158 ++++++++++++++++++ .../detail/VideoItemDetailActivity.java | 109 +----------- .../youtube/YoutubeChannelExtractor.java | 2 +- 4 files changed, 225 insertions(+), 159 deletions(-) create mode 100644 app/src/main/java/org/schabi/newpipe/RouterActivity.java diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index b86d1d4b6..bc050f2ce 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -16,7 +16,6 @@ android:logo="@mipmap/ic_launcher" android:theme="@style/AppTheme" tools:ignore="AllowBackup"> - @@ -34,53 +33,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + android:launchMode="singleTop" + android:theme="@style/FilePickerTheme"/> - + android:launchMode="singleTask" /> @@ -168,8 +117,64 @@ android:grantUriPermissions="true"> + android:resource="@xml/provider_paths" /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/org/schabi/newpipe/RouterActivity.java b/app/src/main/java/org/schabi/newpipe/RouterActivity.java new file mode 100644 index 000000000..b87d97683 --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/RouterActivity.java @@ -0,0 +1,158 @@ +package org.schabi.newpipe; + +import android.app.Activity; +import android.content.Intent; +import android.preference.PreferenceManager; +import android.support.v7.app.AppCompatActivity; +import android.os.Bundle; +import android.util.Log; +import android.widget.Toast; + +import org.schabi.newpipe.detail.VideoItemDetailActivity; +import org.schabi.newpipe.detail.VideoItemDetailFragment; +import org.schabi.newpipe.extractor.NewPipe; +import org.schabi.newpipe.extractor.StreamingService; +import org.schabi.newpipe.util.NavStack; + +import java.util.Collection; +import java.util.HashSet; + +/** + * Copyright (C) Christian Schabesberger 2017 + * RouterActivity .java is part of NewPipe. + * + * OpenHitboxStreams 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. + * + * OpenHitboxStreams 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 OpenHitboxStreams. If not, see . + */ + +/** + * This Acitivty is designed to route share/open intents to the specified service, and + * to the part of the service which can handle the url. + */ +public class RouterActivity extends Activity { + private static final String TAG = RouterActivity.class.toString(); + + /** + * Removes invisible separators (\p{Z}) and punctuation characters including + * brackets (\p{P}). See http://www.regular-expressions.info/unicode.html for + * more details. + */ + private final static String REGEX_REMOVE_FROM_URL = "[\\p{Z}\\p{P}]"; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + handleIntent(getIntent()); + finish(); + } + + + private static String removeHeadingGibberish(final String input) { + int start = 0; + for (int i = input.indexOf("://") - 1; i >= 0; i--) { + if (!input.substring(i, i + 1).matches("\\p{L}")) { + start = i + 1; + break; + } + } + return input.substring(start, input.length()); + } + + private static String trim(final String input) { + if (input == null || input.length() < 1) { + return input; + } else { + String output = input; + while (output.length() > 0 && output.substring(0, 1).matches(REGEX_REMOVE_FROM_URL)) { + output = output.substring(1); + } + while (output.length() > 0 + && output.substring(output.length() - 1, output.length()).matches(REGEX_REMOVE_FROM_URL)) { + output = output.substring(0, output.length() - 1); + } + return output; + } + } + + /** + * Retrieves all Strings which look remotely like URLs from a text. + * Used if NewPipe was called through share menu. + * + * @param sharedText text to scan for URLs. + * @return potential URLs + */ + private String[] getUris(final String sharedText) { + final Collection result = new HashSet<>(); + if (sharedText != null) { + final String[] array = sharedText.split("\\p{Space}"); + for (String s : array) { + s = trim(s); + if (s.length() != 0) { + if (s.matches(".+://.+")) { + result.add(removeHeadingGibberish(s)); + } else if (s.matches(".+\\..+")) { + result.add("http://" + s); + } + } + } + } + return result.toArray(new String[result.size()]); + } + + private void handleIntent(Intent intent) { + String videoUrl = ""; + StreamingService service = null; + + // first gather data and find service + if (intent.getData() != null) { + // this means the video was called though another app + videoUrl = intent.getData().toString(); + } else if(intent.getStringExtra(Intent.EXTRA_TEXT) != null) { + //this means that vidoe was called through share menu + String extraText = intent.getStringExtra(Intent.EXTRA_TEXT); + videoUrl = getUris(extraText)[0]; + } + + service = NewPipe.getServiceByUrl(videoUrl); + if(service == null) { + Toast.makeText(this, R.string.url_not_supported_toast, Toast.LENGTH_LONG) + .show(); + return; + } else { + Intent callIntent = new Intent(); + switch(service.getLinkTypeByUrl(videoUrl)) { + case CHANNEL: + callIntent.setClass(this, ChannelActivity.class); + break; + case STREAM: + callIntent.setClass(this, VideoItemDetailActivity.class); + callIntent.putExtra(VideoItemDetailFragment.AUTO_PLAY, + PreferenceManager.getDefaultSharedPreferences(this) + .getBoolean( + getString(R.string.autoplay_through_intent_key), false)); + break; + case PLAYLIST: + Log.e(TAG, "NOT YET DEFINED"); + break; + default: + Toast.makeText(this, R.string.url_not_supported_toast, Toast.LENGTH_LONG) + .show(); + return; + } + + callIntent.putExtra(NavStack.URL, videoUrl); + callIntent.putExtra(NavStack.SERVICE_ID, service.getServiceId()); + startActivity(callIntent); + } + } +} diff --git a/app/src/main/java/org/schabi/newpipe/detail/VideoItemDetailActivity.java b/app/src/main/java/org/schabi/newpipe/detail/VideoItemDetailActivity.java index bb040d9da..97935edf4 100644 --- a/app/src/main/java/org/schabi/newpipe/detail/VideoItemDetailActivity.java +++ b/app/src/main/java/org/schabi/newpipe/detail/VideoItemDetailActivity.java @@ -1,28 +1,18 @@ package org.schabi.newpipe.detail; -import android.content.Context; import android.content.Intent; import android.media.AudioManager; import android.os.Bundle; -import android.preference.PreferenceManager; -import android.support.v4.app.NavUtils; import android.support.v7.app.AppCompatActivity; import android.util.Log; import android.view.MenuItem; -import android.widget.Toast; import org.schabi.newpipe.App; import org.schabi.newpipe.R; -import org.schabi.newpipe.extractor.NewPipe; -import org.schabi.newpipe.extractor.StreamingService; import org.schabi.newpipe.report.ErrorActivity; import org.schabi.newpipe.util.NavStack; import org.schabi.newpipe.util.ThemeHelper; -import java.util.Collection; -import java.util.HashSet; - - /** * Copyright (C) Christian Schabesberger 2015 @@ -43,14 +33,6 @@ import java.util.HashSet; */ public class VideoItemDetailActivity extends AppCompatActivity { - - /** - * Removes invisible separators (\p{Z}) and punctuation characters including - * brackets (\p{P}). See http://www.regular-expressions.info/unicode.html for - * more details. - */ - private final static String REGEX_REMOVE_FROM_URL = "[\\p{Z}\\p{P}]"; - private static final String TAG = VideoItemDetailActivity.class.toString(); private VideoItemDetailFragment fragment; @@ -58,33 +40,6 @@ public class VideoItemDetailActivity extends AppCompatActivity { private String videoUrl; private int currentStreamingService = -1; - private static String removeHeadingGibberish(final String input) { - int start = 0; - for (int i = input.indexOf("://") - 1; i >= 0; i--) { - if (!input.substring(i, i + 1).matches("\\p{L}")) { - start = i + 1; - break; - } - } - return input.substring(start, input.length()); - } - - private static String trim(final String input) { - if (input == null || input.length() < 1) { - return input; - } else { - String output = input; - while (output.length() > 0 && output.substring(0, 1).matches(REGEX_REMOVE_FROM_URL)) { - output = output.substring(1); - } - while (output.length() > 0 - && output.substring(output.length() - 1, output.length()).matches(REGEX_REMOVE_FROM_URL)) { - output = output.substring(0, output.length() - 1); - } - return output; - } - } - protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ThemeHelper.setTheme(this, true); @@ -130,27 +85,13 @@ public class VideoItemDetailActivity extends AppCompatActivity { private void handleIntent(Intent intent) { Bundle arguments = new Bundle(); boolean autoplay = false; - if (intent.getData() != null) { - // this means the video was called though another app - videoUrl = intent.getData().toString(); - currentStreamingService = getServiceIdByUrl(videoUrl); - if(currentStreamingService == -1) { - Toast.makeText(this, R.string.url_not_supported_toast, Toast.LENGTH_LONG) - .show(); - } - autoplay = PreferenceManager.getDefaultSharedPreferences(this) - .getBoolean(getString(R.string.autoplay_through_intent_key), false); - } else if(intent.getStringExtra(Intent.EXTRA_TEXT) != null) { - //this means that vidoe was called through share menu - String extraText = intent.getStringExtra(Intent.EXTRA_TEXT); - videoUrl = getUris(extraText)[0]; - currentStreamingService = getServiceIdByUrl(videoUrl); - } else { - //this is if the video was called through another NewPipe activity - videoUrl = intent.getStringExtra(NavStack.URL); - currentStreamingService = intent.getIntExtra(NavStack.SERVICE_ID, -1); + + videoUrl = intent.getStringExtra(NavStack.URL); + currentStreamingService = intent.getIntExtra(NavStack.SERVICE_ID, -1); + if(intent.hasExtra(VideoItemDetailFragment.AUTO_PLAY)) { + arguments.putBoolean(VideoItemDetailFragment.AUTO_PLAY, + intent.getBooleanExtra(VideoItemDetailFragment.AUTO_PLAY, false)); } - arguments.putBoolean(VideoItemDetailFragment.AUTO_PLAY, autoplay); arguments.putString(NavStack.URL, videoUrl); arguments.putInt(NavStack.SERVICE_ID, currentStreamingService); addFragment(arguments); @@ -211,42 +152,4 @@ public class VideoItemDetailActivity extends AppCompatActivity { ErrorActivity.reportUiError(this, e); } } - - /** - * Retrieves all Strings which look remotely like URLs from a text. - * Used if NewPipe was called through share menu. - * - * @param sharedText text to scan for URLs. - * @return potential URLs - */ - private String[] getUris(final String sharedText) { - final Collection result = new HashSet<>(); - if (sharedText != null) { - final String[] array = sharedText.split("\\p{Space}"); - for (String s : array) { - s = trim(s); - if (s.length() != 0) { - if (s.matches(".+://.+")) { - result.add(removeHeadingGibberish(s)); - } else if (s.matches(".+\\..+")) { - result.add("http://" + s); - } - } - } - } - return result.toArray(new String[result.size()]); - } - - private int getServiceIdByUrl(String url) { - StreamingService[] serviceList = NewPipe.getServices(); - int service = -1; - for (int i = 0; i < serviceList.length; i++) { - if (serviceList[i].getStreamUrlIdHandlerInstance().acceptUrl(videoUrl)) { - service = i; - //videoExtractor = ServiceList.getService(i).getExtractorInstance(); - break; - } - } - return service; - } } 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 f4e872056..99b1985bd 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 @@ -153,7 +153,7 @@ public class YoutubeChannelExtractor extends ChannelExtractor { @Override public StreamInfoItemCollector getStreams() throws ParsingException { StreamInfoItemCollector collector = getStreamPreviewInfoCollector(); - Element ul = null; + Element ul; if(isAjaxPage) { ul = doc.select("body").first(); } else {