Merge pull request #101 from CatVodTVOfficial/dev

完善播放器控制UI
pull/1/head
小黄瓜 3 years ago committed by GitHub
commit e22a41aefd
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 58
      app/src/main/java/com/github/tvbox/osc/player/controller/VodController.java
  2. 30
      app/src/main/java/com/github/tvbox/osc/ui/activity/PlayActivity.java
  3. 2
      app/src/main/java/com/github/tvbox/osc/util/DefaultConfig.java
  4. 241
      app/src/main/java/com/github/tvbox/osc/util/OkGoHelper.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;

@ -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 {

@ -26,6 +26,8 @@ public class DefaultConfig {
List<MovieSort.SortData> data = new ArrayList<>();
if (sourceKey != null) {
for (MovieSort.SortData sortData : list) {
if (sortData.filters == null)
sortData.filters = new ArrayList<>();
data.add(sortData);
}
}

@ -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<Cookie> cookies) {
String urlString = url.toString();
for (Cookie cookie : cookies) {
CookieManager.getInstance().setCookie(urlString, cookie.toString());
}
}
@Override
public List<Cookie> loadForRequest(HttpUrl url) {
String urlString = url.toString();
String cookiesString = CookieManager.getInstance().getCookie(urlString);
if (cookiesString != null && !cookiesString.isEmpty()) {
String[] cookieHeaders = cookiesString.split(";");
List<Cookie> 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<String> 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("<svg")) {
line = line.replace("ex\"", "em\"").replace("ex;", "em;");
}
sb.append(line);
}
inputStream.close();
return new ByteArrayInputStream(sb.toString().getBytes());
}
}
}

Loading…
Cancel
Save