chore(android): rework view type (#3940)
This commit is contained in:
19
android/src/main/java/com/brentvatne/common/api/ViewType.kt
Normal file
19
android/src/main/java/com/brentvatne/common/api/ViewType.kt
Normal file
@@ -0,0 +1,19 @@
|
||||
package com.brentvatne.common.api
|
||||
|
||||
internal object ViewType {
|
||||
/**
|
||||
* View used will be a TextureView.
|
||||
*/
|
||||
const val VIEW_TYPE_TEXTURE = 0
|
||||
|
||||
/**
|
||||
* View used will be a SurfaceView.
|
||||
*/
|
||||
const val VIEW_TYPE_SURFACE = 1
|
||||
|
||||
/**
|
||||
* View used will be a SurfaceView with secure flag set.
|
||||
*/
|
||||
const val VIEW_TYPE_SURFACE_SECURE = 2
|
||||
annotation class ViewType
|
||||
}
|
@@ -26,12 +26,14 @@ import android.widget.FrameLayout;
|
||||
|
||||
import com.brentvatne.common.api.ResizeMode;
|
||||
import com.brentvatne.common.api.SubtitleStyle;
|
||||
import com.brentvatne.common.api.ViewType;
|
||||
import com.brentvatne.common.toolbox.DebugLog;
|
||||
import com.google.common.collect.ImmutableList;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public final class ExoPlayerView extends FrameLayout implements AdViewProvider {
|
||||
|
||||
private final static String TAG = "ExoPlayerView";
|
||||
private View surfaceView;
|
||||
private final View shutterView;
|
||||
private final SubtitleView subtitleLayout;
|
||||
@@ -42,8 +44,7 @@ public final class ExoPlayerView extends FrameLayout implements AdViewProvider {
|
||||
private final ViewGroup.LayoutParams layoutParams;
|
||||
private final FrameLayout adOverlayFrameLayout;
|
||||
|
||||
private boolean useTextureView = true;
|
||||
private boolean useSecureView = false;
|
||||
private @ViewType.ViewType int viewType = ViewType.VIEW_TYPE_SURFACE;
|
||||
private boolean hideShutterView = false;
|
||||
|
||||
public ExoPlayerView(Context context) {
|
||||
@@ -81,7 +82,7 @@ public final class ExoPlayerView extends FrameLayout implements AdViewProvider {
|
||||
subtitleLayout.setUserDefaultStyle();
|
||||
subtitleLayout.setUserDefaultTextSize();
|
||||
|
||||
updateSurfaceView();
|
||||
updateSurfaceView(viewType);
|
||||
|
||||
adOverlayFrameLayout = new FrameLayout(context);
|
||||
|
||||
@@ -134,28 +135,36 @@ public final class ExoPlayerView extends FrameLayout implements AdViewProvider {
|
||||
shutterView.setBackgroundColor(color);
|
||||
}
|
||||
|
||||
private void updateSurfaceView() {
|
||||
View view;
|
||||
if (!useTextureView || useSecureView) {
|
||||
view = new SurfaceView(context);
|
||||
if (useSecureView) {
|
||||
((SurfaceView)view).setSecure(true);
|
||||
public void updateSurfaceView(@ViewType.ViewType int viewType) {
|
||||
this.viewType = viewType;
|
||||
boolean viewNeedRefresh = false;
|
||||
if (viewType == ViewType.VIEW_TYPE_SURFACE || viewType == ViewType.VIEW_TYPE_SURFACE_SECURE) {
|
||||
if (!(surfaceView instanceof SurfaceView)) {
|
||||
surfaceView = new SurfaceView(context);
|
||||
viewNeedRefresh = true;
|
||||
}
|
||||
((SurfaceView)surfaceView).setSecure(viewType == ViewType.VIEW_TYPE_SURFACE_SECURE);
|
||||
} else if (viewType == ViewType.VIEW_TYPE_TEXTURE) {
|
||||
if (!(surfaceView instanceof TextureView)) {
|
||||
surfaceView = new TextureView(context);
|
||||
viewNeedRefresh = true;
|
||||
}
|
||||
} else {
|
||||
view = new TextureView(context);
|
||||
// Support opacity properly:
|
||||
((TextureView) view).setOpaque(false);
|
||||
((TextureView) surfaceView).setOpaque(false);
|
||||
} else {
|
||||
DebugLog.wtf(TAG, "wtf is this texture " + viewType);
|
||||
}
|
||||
view.setLayoutParams(layoutParams);
|
||||
if (viewNeedRefresh) {
|
||||
surfaceView.setLayoutParams(layoutParams);
|
||||
|
||||
surfaceView = view;
|
||||
if (layout.getChildAt(0) != null) {
|
||||
layout.removeViewAt(0);
|
||||
}
|
||||
layout.addView(surfaceView, 0, layoutParams);
|
||||
if (layout.getChildAt(0) != null) {
|
||||
layout.removeViewAt(0);
|
||||
}
|
||||
layout.addView(surfaceView, 0, layoutParams);
|
||||
|
||||
if (this.player != null) {
|
||||
setVideoView();
|
||||
if (this.player != null) {
|
||||
setVideoView();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -211,20 +220,6 @@ public final class ExoPlayerView extends FrameLayout implements AdViewProvider {
|
||||
}
|
||||
}
|
||||
|
||||
public void setUseTextureView(boolean useTextureView) {
|
||||
if (useTextureView != this.useTextureView) {
|
||||
this.useTextureView = useTextureView;
|
||||
updateSurfaceView();
|
||||
}
|
||||
}
|
||||
|
||||
public void useSecureView(boolean useSecureView) {
|
||||
if (useSecureView != this.useSecureView) {
|
||||
this.useSecureView = useSecureView;
|
||||
updateSurfaceView();
|
||||
}
|
||||
}
|
||||
|
||||
public void setHideShutterView(boolean hideShutterView) {
|
||||
this.hideShutterView = hideShutterView;
|
||||
updateShutterViewVisibility();
|
||||
|
@@ -589,6 +589,10 @@ public class ReactExoplayerView extends FrameLayout implements
|
||||
}
|
||||
}
|
||||
|
||||
public void setViewType(int viewType) {
|
||||
exoPlayerView.updateSurfaceView(viewType);
|
||||
}
|
||||
|
||||
private class RNVLoadControl extends DefaultLoadControl {
|
||||
private final int availableHeapInBytes;
|
||||
private final Runtime runtime;
|
||||
@@ -2243,15 +2247,6 @@ public class ReactExoplayerView extends FrameLayout implements
|
||||
updateFullScreenButtonVisibility();
|
||||
}
|
||||
|
||||
public void setUseTextureView(boolean useTextureView) {
|
||||
boolean finallyUseTextureView = useTextureView && drmProps == null;
|
||||
exoPlayerView.setUseTextureView(finallyUseTextureView);
|
||||
}
|
||||
|
||||
public void useSecureView(boolean useSecureView) {
|
||||
exoPlayerView.useSecureView(useSecureView);
|
||||
}
|
||||
|
||||
public void setHideShutterView(boolean hideShutterView) {
|
||||
exoPlayerView.setHideShutterView(hideShutterView);
|
||||
}
|
||||
|
@@ -17,6 +17,7 @@ import com.brentvatne.common.api.ResizeMode;
|
||||
import com.brentvatne.common.api.SideLoadedTextTrackList;
|
||||
import com.brentvatne.common.api.Source;
|
||||
import com.brentvatne.common.api.SubtitleStyle;
|
||||
import com.brentvatne.common.api.ViewType;
|
||||
import com.brentvatne.common.react.VideoEventEmitter;
|
||||
import com.brentvatne.common.toolbox.DebugLog;
|
||||
import com.brentvatne.common.toolbox.ReactBridgeUtils;
|
||||
@@ -69,8 +70,7 @@ public class ReactExoplayerViewManager extends ViewGroupManager<ReactExoplayerVi
|
||||
private static final String PROP_DISABLE_DISCONNECT_ERROR = "disableDisconnectError";
|
||||
private static final String PROP_FOCUSABLE = "focusable";
|
||||
private static final String PROP_FULLSCREEN = "fullscreen";
|
||||
private static final String PROP_USE_TEXTURE_VIEW = "useTextureView";
|
||||
private static final String PROP_SECURE_VIEW = "useSecureView";
|
||||
private static final String PROP_VIEW_TYPE = "viewType";
|
||||
private static final String PROP_SELECTED_VIDEO_TRACK = "selectedVideoTrack";
|
||||
private static final String PROP_SELECTED_VIDEO_TRACK_TYPE = "type";
|
||||
private static final String PROP_SELECTED_VIDEO_TRACK_VALUE = "value";
|
||||
@@ -121,7 +121,6 @@ public class ReactExoplayerViewManager extends ViewGroupManager<ReactExoplayerVi
|
||||
public void setDRM(final ReactExoplayerView videoView, @Nullable ReadableMap drm) {
|
||||
DRMProps drmProps = DRMProps.parse(drm);
|
||||
videoView.setDrm(drmProps);
|
||||
videoView.setUseTextureView(false);
|
||||
}
|
||||
|
||||
@ReactProp(name = PROP_SRC)
|
||||
@@ -301,14 +300,9 @@ public class ReactExoplayerViewManager extends ViewGroupManager<ReactExoplayerVi
|
||||
videoView.setFullscreen(fullscreen);
|
||||
}
|
||||
|
||||
@ReactProp(name = PROP_USE_TEXTURE_VIEW, defaultBoolean = true)
|
||||
public void setUseTextureView(final ReactExoplayerView videoView, final boolean useTextureView) {
|
||||
videoView.setUseTextureView(useTextureView);
|
||||
}
|
||||
|
||||
@ReactProp(name = PROP_SECURE_VIEW, defaultBoolean = true)
|
||||
public void useSecureView(final ReactExoplayerView videoView, final boolean useSecureView) {
|
||||
videoView.useSecureView(useSecureView);
|
||||
@ReactProp(name = PROP_VIEW_TYPE, defaultInt = ViewType.VIEW_TYPE_SURFACE)
|
||||
public void setViewType(final ReactExoplayerView videoView, final int viewType) {
|
||||
videoView.setViewType(viewType);
|
||||
}
|
||||
|
||||
@ReactProp(name = PROP_HIDE_SHUTTER_VIEW, defaultBoolean = false)
|
||||
|
Reference in New Issue
Block a user