diff --git a/app/src/main/java/com/github/tvbox/osc/player/controller/VodController.java b/app/src/main/java/com/github/tvbox/osc/player/controller/VodController.java index 7c489c23..b1c24e4a 100644 --- a/app/src/main/java/com/github/tvbox/osc/player/controller/VodController.java +++ b/app/src/main/java/com/github/tvbox/osc/player/controller/VodController.java @@ -58,6 +58,18 @@ public class VodController extends BaseController { mBottomRoot.setVisibility(GONE); break; } + case 1004: { // 设置速度 + if (isInPlaybackState()) { + try { + float speed = (float) mPlayerConfig.getDouble("sp"); + mControlWrapper.setSpeed(speed); + } catch (JSONException e) { + e.printStackTrace(); + } + } else + mHandler.sendEmptyMessageDelayed(1004, 100); + break; + } } } }; @@ -159,12 +171,14 @@ public class VodController extends BaseController { @Override public void onClick(View view) { listener.playNext(); + hideBottom(); } }); mPreBtn.setOnClickListener(new OnClickListener() { @Override public void onClick(View view) { listener.playPre(); + hideBottom(); } }); mPlayerScaleBtn.setOnClickListener(new OnClickListener() { @@ -213,6 +227,7 @@ public class VodController extends BaseController { updatePlayerCfgView(); listener.updatePlayerCfg(); listener.replay(); + hideBottom(); } catch (JSONException e) { e.printStackTrace(); } @@ -238,6 +253,7 @@ public class VodController extends BaseController { updatePlayerCfgView(); listener.updatePlayerCfg(); listener.replay(); + hideBottom(); } catch (JSONException e) { e.printStackTrace(); } @@ -324,6 +340,11 @@ public class VodController extends BaseController { } } + public void resetSpeed() { + mHandler.removeMessages(1004); + mHandler.sendEmptyMessageDelayed(1004, 100); + } + public interface VodControlListener { void playNext(); @@ -334,6 +355,8 @@ public class VodController extends BaseController { void updatePlayerCfg(); void replay(); + + void autoReplay(); } public void setListener(VodControlListener listener) { @@ -432,6 +455,7 @@ public class VodController extends BaseController { case VideoView.STATE_PAUSED: break; case VideoView.STATE_ERROR: + listener.autoReplay(); break; case VideoView.STATE_PREPARED: case VideoView.STATE_BUFFERED: @@ -445,12 +469,26 @@ public class VodController extends BaseController { } } + boolean isBottomVisible() { + return mBottomRoot.getVisibility() == VISIBLE; + } + + void showBottom() { + mHandler.removeMessages(1003); + mHandler.sendEmptyMessage(1002); + } + + void hideBottom() { + mHandler.removeMessages(1002); + mHandler.sendEmptyMessage(1003); + } + @Override public boolean onKeyEvent(KeyEvent event) { if (super.onKeyEvent(event)) { return true; } - if (mBottomRoot.getVisibility() == VISIBLE) { + if (isBottomVisible()) { return super.dispatchKeyEvent(event); } boolean isInPlayback = isInPlaybackState(); @@ -469,9 +507,8 @@ public class VodController extends BaseController { } } else if (keyCode == KeyEvent.KEYCODE_DPAD_UP) { } else if (keyCode == KeyEvent.KEYCODE_DPAD_DOWN) { - if (mBottomRoot.getVisibility() == GONE) { - mHandler.removeMessages(1003); - mHandler.sendEmptyMessage(1002); + if (!isBottomVisible()) { + showBottom(); } } } else if (action == KeyEvent.ACTION_UP) { @@ -487,12 +524,10 @@ public class VodController extends BaseController { @Override public boolean onSingleTapConfirmed(MotionEvent e) { - if (mBottomRoot.getVisibility() == GONE) { - mHandler.removeMessages(1003); - mHandler.sendEmptyMessage(1002); + if (!isBottomVisible()) { + showBottom(); } else { - mHandler.removeMessages(1002); - mHandler.sendEmptyMessage(1003); + hideBottom(); } return true; } @@ -502,9 +537,8 @@ public class VodController extends BaseController { if (super.onBackPressed()) { return true; } - if (mBottomRoot.getVisibility() == VISIBLE) { - mHandler.removeMessages(1002); - mHandler.sendEmptyMessage(1003); + if (isBottomVisible()) { + hideBottom(); return true; } return false; diff --git a/app/src/main/java/com/github/tvbox/osc/ui/activity/PlayActivity.java b/app/src/main/java/com/github/tvbox/osc/ui/activity/PlayActivity.java index ac808610..bf9d30e9 100644 --- a/app/src/main/java/com/github/tvbox/osc/ui/activity/PlayActivity.java +++ b/app/src/main/java/com/github/tvbox/osc/ui/activity/PlayActivity.java @@ -77,7 +77,7 @@ import xyz.doikki.videoplayer.player.VideoView; */ public class PlayActivity extends BaseActivity { private VideoView mVideoView; - private VodController controller; + private VodController mController; private SourceViewModel sourceViewModel; @Override @@ -95,10 +95,10 @@ public class PlayActivity extends BaseActivity { private void initView() { setLoadSir(findViewById(R.id.rootLayout)); mVideoView = findViewById(R.id.mVideoView); - controller = new VodController(this); - controller.setCanChangePosition(true); - controller.setEnableInNormal(true); - controller.setGestureEnabled(true); + mController = new VodController(this); + mController.setCanChangePosition(true); + mController.setEnableInNormal(true); + mController.setGestureEnabled(true); mVideoView.setProgressManager(new ProgressManager() { @Override public void saveProgress(String url, long progress) { @@ -119,7 +119,7 @@ public class PlayActivity extends BaseActivity { return (long) CacheManager.getCache(MD5.string2MD5(url)); } }); - controller.setListener(new VodController.VodControlListener() { + mController.setListener(new VodController.VodControlListener() { @Override public void playNext() { PlayActivity.this.playNext(); @@ -145,8 +145,13 @@ public class PlayActivity extends BaseActivity { public void replay() { play(); } + + @Override + public void autoReplay() { + + } }); - mVideoView.setVideoController(controller); + mVideoView.setVideoController(mController); } void getPlayInfoError() { @@ -182,6 +187,7 @@ public class PlayActivity extends BaseActivity { mVideoView.setUrl(url); } mVideoView.start(); + mController.resetSpeed(); } } }); @@ -221,7 +227,7 @@ public class PlayActivity extends BaseActivity { boolean userJxList = (playUrl.isEmpty() && ApiConfig.get().getVipParseFlags().contains(flag)) || jx; initParse(flag, userJxList, playUrl, url); } else { - controller.showParse(false); + mController.showParse(false); playUrl(playUrl + url, headers); } } catch (Throwable th) { @@ -276,12 +282,12 @@ public class PlayActivity extends BaseActivity { } catch (Throwable th) { } - controller.setPlayerConfig(mVodPlayerCfg); + mController.setPlayerConfig(mVodPlayerCfg); } @Override public void onBackPressed() { - if (controller.onBackPressed()) { + if (mController.onBackPressed()) { return; } super.onBackPressed(); @@ -290,7 +296,7 @@ public class PlayActivity extends BaseActivity { @Override public boolean dispatchKeyEvent(KeyEvent event) { if (event != null) { - if (controller.onKeyEvent(event)) { + if (mController.onKeyEvent(event)) { return true; } } @@ -376,7 +382,7 @@ public class PlayActivity extends BaseActivity { parseFlag = flag; webUrl = url; ParseBean parseBean = null; - controller.showParse(useParse); + mController.showParse(useParse); if (useParse) { parseBean = ApiConfig.get().getDefaultParse(); } else { diff --git a/app/src/main/java/com/github/tvbox/osc/util/DefaultConfig.java b/app/src/main/java/com/github/tvbox/osc/util/DefaultConfig.java index c8b2288b..c93ae4f8 100644 --- a/app/src/main/java/com/github/tvbox/osc/util/DefaultConfig.java +++ b/app/src/main/java/com/github/tvbox/osc/util/DefaultConfig.java @@ -26,6 +26,8 @@ public class DefaultConfig { List data = new ArrayList<>(); if (sourceKey != null) { for (MovieSort.SortData sortData : list) { + if (sortData.filters == null) + sortData.filters = new ArrayList<>(); data.add(sortData); } } diff --git a/app/src/main/java/com/github/tvbox/osc/util/OkGoHelper.java b/app/src/main/java/com/github/tvbox/osc/util/OkGoHelper.java index a385e6ba..63e81e65 100644 --- a/app/src/main/java/com/github/tvbox/osc/util/OkGoHelper.java +++ b/app/src/main/java/com/github/tvbox/osc/util/OkGoHelper.java @@ -1,14 +1,5 @@ package com.github.tvbox.osc.util; -import android.net.Uri; -import android.os.Build; -import android.webkit.CookieManager; -import android.webkit.WebResourceResponse; -import android.webkit.WebView; -import android.webkit.WebViewClient; - -import androidx.annotation.NonNull; - import com.github.tvbox.osc.base.App; import com.github.tvbox.osc.util.SSL.SSLSocketFactoryCompat; import com.lzy.okgo.OkGo; @@ -16,102 +7,19 @@ import com.lzy.okgo.https.HttpsUtils; import com.lzy.okgo.interceptor.HttpLoggingInterceptor; import com.orhanobut.hawk.Hawk; -import java.io.BufferedReader; -import java.io.ByteArrayInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; import java.security.cert.CertificateException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; import java.util.concurrent.TimeUnit; import java.util.logging.Level; import javax.net.ssl.SSLSocketFactory; import javax.net.ssl.X509TrustManager; -import okhttp3.CacheControl; -import okhttp3.Cookie; -import okhttp3.CookieJar; -import okhttp3.HttpUrl; import okhttp3.OkHttpClient; -import okhttp3.Request; -import okhttp3.Response; import xyz.doikki.videoplayer.exo.ExoMediaSourceHelper; public class OkGoHelper { public static final long DEFAULT_MILLISECONDS = 10000; //默认的超时时间 - private static OkHttpClient speedTestClient = null; - - public static OkHttpClient getSpeedTestClient(long timeOut) { - if (speedTestClient == null) { - OkHttpClient.Builder builder = new OkHttpClient.Builder(); - HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor("OkGo"); - - if (Hawk.get(HawkConfig.DEBUG_OPEN, false)) { - loggingInterceptor.setPrintLevel(HttpLoggingInterceptor.Level.BODY); - loggingInterceptor.setColorLevel(Level.INFO); - } else { - loggingInterceptor.setPrintLevel(HttpLoggingInterceptor.Level.NONE); - loggingInterceptor.setColorLevel(Level.OFF); - } - - builder.retryOnConnectionFailure(false); - - builder.addInterceptor(loggingInterceptor); - - builder.readTimeout(timeOut, TimeUnit.MILLISECONDS); - builder.writeTimeout(timeOut, TimeUnit.MILLISECONDS); - builder.connectTimeout(timeOut, TimeUnit.MILLISECONDS); - - try { - setOkHttpSsl(builder); - } catch (Throwable th) { - th.printStackTrace(); - } - - speedTestClient = builder.build(); - } - return speedTestClient; - } - - private static OkHttpClient fastParseClient = null; - - public static OkHttpClient getFastParseClient(long timeOut) { - if (fastParseClient == null) { - OkHttpClient.Builder builder = new OkHttpClient.Builder(); - HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor("OkGo"); - - if (Hawk.get(HawkConfig.DEBUG_OPEN, false)) { - loggingInterceptor.setPrintLevel(HttpLoggingInterceptor.Level.BODY); - loggingInterceptor.setColorLevel(Level.INFO); - } else { - loggingInterceptor.setPrintLevel(HttpLoggingInterceptor.Level.NONE); - loggingInterceptor.setColorLevel(Level.OFF); - } - - //builder.retryOnConnectionFailure(false); - - builder.addInterceptor(loggingInterceptor); - - builder.readTimeout(timeOut, TimeUnit.MILLISECONDS); - builder.writeTimeout(timeOut, TimeUnit.MILLISECONDS); - builder.connectTimeout(timeOut, TimeUnit.MILLISECONDS); - - try { - setOkHttpSsl(builder); - } catch (Throwable th) { - th.printStackTrace(); - } - - fastParseClient = builder.build(); - } - return fastParseClient; - } - static void initExoOkHttpClient() { OkHttpClient.Builder builder = new OkHttpClient.Builder(); HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor("OkExoPlayer"); @@ -197,153 +105,4 @@ public class OkGoHelper { throw new RuntimeException(e); } } - - public static class OkHttpWebViewClient extends WebViewClient { - - private static OkHttpClient okHttpClientWebView = null; - - private static void initOkHttp() { - OkHttpClient.Builder builderWebView = new OkHttpClient.Builder(); - HttpLoggingInterceptor loggingInterceptorWebView = new HttpLoggingInterceptor("OkHttpWebView"); - - if (Hawk.get(HawkConfig.DEBUG_OPEN, false)) { - loggingInterceptorWebView.setPrintLevel(HttpLoggingInterceptor.Level.BODY); - loggingInterceptorWebView.setColorLevel(Level.INFO); - } else { - loggingInterceptorWebView.setPrintLevel(HttpLoggingInterceptor.Level.NONE); - loggingInterceptorWebView.setColorLevel(Level.OFF); - } - - builderWebView.addInterceptor(loggingInterceptorWebView); - - builderWebView.readTimeout(DEFAULT_MILLISECONDS, TimeUnit.MILLISECONDS); - builderWebView.writeTimeout(DEFAULT_MILLISECONDS, TimeUnit.MILLISECONDS); - builderWebView.connectTimeout(DEFAULT_MILLISECONDS, TimeUnit.MILLISECONDS); - - builderWebView.cookieJar(new CookieJar() { - @Override - public void saveFromResponse(HttpUrl url, List cookies) { - String urlString = url.toString(); - for (Cookie cookie : cookies) { - CookieManager.getInstance().setCookie(urlString, cookie.toString()); - } - } - - @Override - public List loadForRequest(HttpUrl url) { - String urlString = url.toString(); - String cookiesString = CookieManager.getInstance().getCookie(urlString); - - if (cookiesString != null && !cookiesString.isEmpty()) { - String[] cookieHeaders = cookiesString.split(";"); - List cookies = new ArrayList<>(cookieHeaders.length); - - for (String header : cookieHeaders) { - cookies.add(Cookie.parse(url, header)); - } - - return cookies; - } - return Collections.emptyList(); - } - }); - - try { - setOkHttpSsl(builderWebView); - } catch (Throwable th) { - th.printStackTrace(); - } - okHttpClientWebView = builderWebView.build(); - } - - static { - // 初始化 webview 的 okhttpclient 4.0 以下 - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { - initOkHttp(); - } - } - - private static final List SUPPORTED_SCHEMES = Arrays.asList("http", "https"); - private static final String CONTENT_TYPE_SVG = "image/svg+xml"; - - @SuppressWarnings("deprecation") - @Override - public WebResourceResponse shouldInterceptRequest(WebView view, String url) { - if (okHttpClientWebView != null) { - if (!SUPPORTED_SCHEMES.contains(Uri.parse(url).getScheme())) { - return null; - } - try { - Response rsp = request(url); - onLoadResource(view, url); - return new WebResourceResponse( - contentType(rsp), - contentCharset(rsp), - getInputStream(rsp)); - } catch (Throwable e) { - e.printStackTrace(); - } - return super.shouldInterceptRequest(view, url); - } else { - return super.shouldInterceptRequest(view, url); - } - } - - @NonNull - private Response request(String url) throws IOException { - final Request okReq = new Request.Builder().url(url) - .cacheControl(new CacheControl.Builder().noCache().build()) - .build(); - final long startMillis = System.currentTimeMillis(); - final Response okResp = okHttpClientWebView.newCall(okReq).execute(); - final long dtMillis = System.currentTimeMillis() - startMillis; - if (Hawk.get(HawkConfig.DEBUG_OPEN, false)) { - LOG.i("Got response: " + okResp + " after " + dtMillis + "ms"); - } - return okResp; - } - - private String contentType(@NonNull Response rsp) { - try { - return rsp.body().contentType().type() + "/" + rsp.body().contentType().subtype(); - } catch (Throwable th) { - return ""; - } - } - - private String contentCharset(Response rsp) { - try { - return rsp.body().contentType().charset().toString(); - } catch (Throwable th) { - return ""; - } - } - - @NonNull - private InputStream getInputStream(@NonNull Response rsp) throws IOException { - InputStream inputStream = rsp.body().byteStream(); - - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT - && CONTENT_TYPE_SVG.equals(contentType(rsp))) { - return transformSvgFile(inputStream); - } - - return inputStream; - } - - @NonNull - static InputStream transformSvgFile(@NonNull InputStream inputStream) throws IOException { - BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); - StringBuilder sb = new StringBuilder(); - String line; - while ((line = reader.readLine()) != null) { - if (line.contains("