diff --git a/app/build.gradle b/app/build.gradle index 381ea7ad3..266f7fadb 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -8,8 +8,8 @@ android { applicationId "org.schabi.newpipe" minSdkVersion 15 targetSdkVersion 25 - versionCode 20 - versionName "0.8.6" + versionCode 21 + versionName "0.8.7" } buildTypes { release { @@ -32,10 +32,10 @@ android { dependencies { testCompile 'junit:junit:4.12' - compile 'com.android.support:appcompat-v7:25.0.0' - compile 'com.android.support:support-v4:25.0.0' - compile 'com.android.support:design:25.0.0' - compile 'com.android.support:recyclerview-v7:25.0.0' + compile 'com.android.support:appcompat-v7:25.1.0' + compile 'com.android.support:support-v4:25.1.0' + compile 'com.android.support:design:25.1.0' + compile 'com.android.support:recyclerview-v7:25.1.0' compile 'org.jsoup:jsoup:1.8.3' compile 'org.mozilla:rhino:1.7.7' compile 'info.guardianproject.netcipher:netcipher:1.2' diff --git a/app/src/main/java/org/schabi/newpipe/ReCaptchaActivity.java b/app/src/main/java/org/schabi/newpipe/ReCaptchaActivity.java index f503bfcff..45c4dfeb8 100644 --- a/app/src/main/java/org/schabi/newpipe/ReCaptchaActivity.java +++ b/app/src/main/java/org/schabi/newpipe/ReCaptchaActivity.java @@ -2,6 +2,7 @@ package org.schabi.newpipe; import android.app.Activity; import android.content.Intent; +import android.graphics.Bitmap; import android.os.Build; import android.os.Bundle; import android.support.v4.app.NavUtils; @@ -34,6 +35,8 @@ import android.webkit.WebViewClient; * along with NewPipe. If not, see . */ public class ReCaptchaActivity extends AppCompatActivity { + public static final int RECAPTCHA_REQUEST = 10; + public static final String TAG = ReCaptchaActivity.class.toString(); public static final String YT_URL = "https://www.youtube.com"; @@ -42,6 +45,9 @@ public class ReCaptchaActivity extends AppCompatActivity { super.onCreate(savedInstanceState); setContentView(R.layout.activity_recaptcha); + // Set return to Cancel by default + setResult(RESULT_CANCELED); + ActionBar actionBar = getSupportActionBar(); actionBar.setDisplayHomeAsUpEnabled(true); actionBar.setTitle(R.string.reCaptcha_title); @@ -80,19 +86,26 @@ public class ReCaptchaActivity extends AppCompatActivity { context = ctx; } + @Override + public void onPageStarted(WebView view, String url, Bitmap favicon) { + // TODO: Start Loader + super.onPageStarted(view, url, favicon); + } + @Override public void onPageFinished(WebView view, String url) { String cookies = CookieManager.getInstance().getCookie(url); + // TODO: Stop Loader + // find cookies : s_gl & goojf and Add cookies to Downloader if (find_access_cookies(cookies)) { // Give cookies to Downloader class Downloader.setCookies(mCookies); - // Closing activity and return to parent. - Intent intent = new Intent(context, org.schabi.newpipe.MainActivity.class); - intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); - NavUtils.navigateUpTo(context, intent); + // Closing activity and return to parent + setResult(RESULT_OK); + finish(); } } diff --git a/app/src/main/java/org/schabi/newpipe/detail/StreamInfoWorker.java b/app/src/main/java/org/schabi/newpipe/detail/StreamInfoWorker.java index bb1130fdf..dd1ae9f5a 100644 --- a/app/src/main/java/org/schabi/newpipe/detail/StreamInfoWorker.java +++ b/app/src/main/java/org/schabi/newpipe/detail/StreamInfoWorker.java @@ -5,8 +5,8 @@ import android.os.Handler; import android.util.Log; import android.view.View; -import org.schabi.newpipe.Downloader; import org.schabi.newpipe.extractor.exceptions.ParsingException; +import org.schabi.newpipe.extractor.exceptions.ReCaptchaException; import org.schabi.newpipe.extractor.stream_info.StreamExtractor; import org.schabi.newpipe.extractor.stream_info.StreamInfo; import org.schabi.newpipe.report.ErrorActivity; @@ -44,6 +44,7 @@ public class StreamInfoWorker { public interface OnStreamInfoReceivedListener { void onReceive(StreamInfo info); void onError(int messageId); + void onReCaptchaException(); void onBlockedByGemaError(); void onContentErrorWithMessage(int messageId); void onContentError(); @@ -107,6 +108,13 @@ public class StreamInfoWorker { } // These errors render the stream information unusable. + } catch (ReCaptchaException e) { + h.post(new Runnable() { + @Override + public void run() { + onStreamInfoReceivedListener.onReCaptchaException(); + } + }); } catch (IOException e) { h.post(new Runnable() { @Override @@ -115,9 +123,8 @@ public class StreamInfoWorker { } }); e.printStackTrace(); - } - // custom service related exceptions - catch (YoutubeStreamExtractor.DecryptException de) { + } catch (YoutubeStreamExtractor.DecryptException de) { + // custom service related exceptions h.post(new Runnable() { @Override public void run() { 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 1fa80175f..2c6e4b55a 100644 --- a/app/src/main/java/org/schabi/newpipe/detail/VideoItemDetailFragment.java +++ b/app/src/main/java/org/schabi/newpipe/detail/VideoItemDetailFragment.java @@ -43,6 +43,7 @@ import java.util.Vector; import org.schabi.newpipe.ActivityCommunicator; import org.schabi.newpipe.ChannelActivity; +import org.schabi.newpipe.ReCaptchaActivity; import org.schabi.newpipe.extractor.stream_info.StreamInfo; import org.schabi.newpipe.extractor.stream_info.StreamPreviewInfo; import org.schabi.newpipe.info_list.InfoItemBuilder; @@ -59,6 +60,9 @@ import org.schabi.newpipe.player.BackgroundPlayer; import org.schabi.newpipe.player.PlayVideoActivity; import org.schabi.newpipe.player.ExoPlayerActivity; +import static android.app.Activity.RESULT_OK; +import static org.schabi.newpipe.ReCaptchaActivity.RECAPTCHA_REQUEST; + /** * Copyright (C) Christian Schabesberger 2015 @@ -579,11 +583,6 @@ public class VideoItemDetailFragment extends Fragment { return true; } - /** - * Mandatory empty constructor for the fragment manager to instantiate the - * fragment (e.g. upon screen orientation changes). - */ - @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -604,6 +603,17 @@ public class VideoItemDetailFragment extends Fragment { postNewErrorToast(messageId); } + @Override + public void onReCaptchaException() { + Toast.makeText(getActivity(), R.string.recaptcha_request_toast, + Toast.LENGTH_LONG).show(); + + // Starting ReCaptcha Challenge Activity + startActivityForResult( + new Intent(getActivity(), ReCaptchaActivity.class), + RECAPTCHA_REQUEST); + } + @Override public void onBlockedByGemaError() { onErrorBlockedByGema(); @@ -793,4 +803,23 @@ public class VideoItemDetailFragment extends Fragment { VideoItemDetailFragment.STREAMING_SERVICE, streamingServiceId); activity.startActivity(detailIntent); } -} \ No newline at end of file + + @Override + public void onActivityResult(int requestCode, int resultCode, Intent data) { + switch (requestCode) { + case RECAPTCHA_REQUEST: + if (resultCode == RESULT_OK) { + String videoUrl = getArguments().getString(VIDEO_URL); + StreamInfoWorker siw = StreamInfoWorker.getInstance(); + siw.search(streamingServiceId, videoUrl, getActivity()); + } else { + Log.d(TAG, "ReCaptcha failed"); + } + break; + + default: + Log.e(TAG, "Request code from activity not supported [" + requestCode + "]"); + break; + } + } +} diff --git a/app/src/main/java/org/schabi/newpipe/search_fragment/SearchInfoItemFragment.java b/app/src/main/java/org/schabi/newpipe/search_fragment/SearchInfoItemFragment.java index e710bbbd9..57b63c209 100644 --- a/app/src/main/java/org/schabi/newpipe/search_fragment/SearchInfoItemFragment.java +++ b/app/src/main/java/org/schabi/newpipe/search_fragment/SearchInfoItemFragment.java @@ -8,6 +8,7 @@ import android.support.v4.app.Fragment; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.SearchView; +import android.util.Log; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; @@ -28,6 +29,9 @@ import org.schabi.newpipe.detail.VideoItemDetailActivity; import org.schabi.newpipe.detail.VideoItemDetailFragment; import org.schabi.newpipe.info_list.InfoListAdapter; +import static android.app.Activity.RESULT_OK; +import static org.schabi.newpipe.ReCaptchaActivity.RECAPTCHA_REQUEST; + /** * Created by Christian Schabesberger on 02.08.16. * @@ -68,7 +72,7 @@ public class SearchInfoItemFragment extends Fragment { //noinspection ConstantConditions inputManager.hideSoftInputFromWindow( a.getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS); - } catch(NullPointerException e) { + } catch (NullPointerException e) { e.printStackTrace(); ErrorActivity.reportError(a, e, null, a.findViewById(android.R.id.content), @@ -82,7 +86,7 @@ public class SearchInfoItemFragment extends Fragment { // onQueryTextSubmit to trigger twice when focus is not cleared. // See: http://stackoverflow.com/questions/17874951/searchview-onquerytextsubmit-runs-twice-while-i-pressed-once a.getCurrentFocus().clearFocus(); - } catch(Exception e) { + } catch (Exception e) { e.printStackTrace(); } View bg = a.findViewById(R.id.mainBG); @@ -92,7 +96,7 @@ public class SearchInfoItemFragment extends Fragment { @Override public boolean onQueryTextChange(String newText) { - if(!newText.isEmpty()) { + if (!newText.isEmpty()) { searchSuggestions(newText); } return true; @@ -133,13 +137,13 @@ public class SearchInfoItemFragment extends Fragment { public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - if(savedInstanceState != null) { + if (savedInstanceState != null) { searchQuery = savedInstanceState.getString(QUERY); streamingServiceId = savedInstanceState.getInt(STREAMING_SERVICE); } else { try { streamingServiceId = NewPipe.getIdOfService("Youtube"); - } catch(Exception e) { + } catch (Exception e) { e.printStackTrace(); ErrorActivity.reportError(getActivity(), e, null, getActivity().findViewById(android.R.id.content), @@ -180,9 +184,11 @@ public class SearchInfoItemFragment extends Fragment { public void onReCaptchaChallenge() { Toast.makeText(getActivity(), "ReCaptcha Challenge requested", Toast.LENGTH_LONG).show(); + // Starting ReCaptcha Challenge Activity - Intent i = new Intent(getActivity(), ReCaptchaActivity.class); - getActivity().startActivity(i); + startActivityForResult( + new Intent(getActivity(), ReCaptchaActivity.class), + RECAPTCHA_REQUEST); } }); } @@ -216,14 +222,13 @@ public class SearchInfoItemFragment extends Fragment { public void onScrolled(RecyclerView recyclerView, int dx, int dy) { int pastVisiblesItems, visibleItemCount, totalItemCount; super.onScrolled(recyclerView, dx, dy); - if(dy > 0) //check for scroll down + if (dy > 0) //check for scroll down { visibleItemCount = streamInfoListLayoutManager.getChildCount(); totalItemCount = streamInfoListLayoutManager.getItemCount(); pastVisiblesItems = streamInfoListLayoutManager.findFirstVisibleItemPosition(); - if ( (visibleItemCount + pastVisiblesItems) >= totalItemCount && !isLoading) - { + if ((visibleItemCount + pastVisiblesItems) >= totalItemCount && !isLoading) { pageNumber++; search(searchQuery, pageNumber); } @@ -264,7 +269,7 @@ public class SearchInfoItemFragment extends Fragment { searchView.setSuggestionsAdapter(suggestionListAdapter); searchView.setOnSuggestionListener(new SearchSuggestionListener(searchView, suggestionListAdapter)); searchView.setOnQueryTextListener(new SearchQueryListener()); - if(searchQuery != null && !searchQuery.isEmpty()) { + if (searchQuery != null && !searchQuery.isEmpty()) { searchView.setQuery(searchQuery, false); searchView.setIconifiedByDefault(false); } @@ -289,4 +294,23 @@ public class SearchInfoItemFragment extends Fragment { Thread suggestionThread = new Thread(suggestionSearchRunnable); suggestionThread.start(); } + + @Override + public void onActivityResult(int requestCode, int resultCode, Intent data) { + switch (requestCode) { + case RECAPTCHA_REQUEST: + if (resultCode == RESULT_OK) { + if (searchQuery.length() != 0) { + search(searchQuery); + } + } else { + Log.d(TAG, "ReCaptcha failed"); + } + break; + + default: + Log.e(TAG, "Request code from activity not supported [" + requestCode + "]"); + break; + } + } } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index cc23cbe5b..39532aefd 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -271,6 +271,7 @@ Settings reCAPTCHA reCAPTCHA Challenge + reCAPTCHA Challenge requested