feat(android): add settings button to control video playback speed (#4211)
This commit is contained in:
committed by
GitHub
parent
d81e6ea31e
commit
d1883a7e00
@@ -6,7 +6,6 @@ import com.facebook.react.bridge.ReadableMap
|
||||
class ControlsConfig {
|
||||
var hideSeekBar: Boolean = false
|
||||
var hideDuration: Boolean = false
|
||||
|
||||
var hidePosition: Boolean = false
|
||||
var hidePlayPause: Boolean = false
|
||||
var hideForward: Boolean = false
|
||||
@@ -17,6 +16,7 @@ class ControlsConfig {
|
||||
var hideNavigationBarOnFullScreenMode: Boolean = true
|
||||
var hideNotificationBarOnFullScreenMode: Boolean = true
|
||||
var liveLabel: String? = null
|
||||
var hideSettingButton: Boolean = true
|
||||
|
||||
var seekIncrementMS: Int = 10000
|
||||
|
||||
@@ -39,6 +39,7 @@ class ControlsConfig {
|
||||
config.hideNavigationBarOnFullScreenMode = ReactBridgeUtils.safeGetBool(controlsConfig, "hideNavigationBarOnFullScreenMode", true)
|
||||
config.hideNotificationBarOnFullScreenMode = ReactBridgeUtils.safeGetBool(controlsConfig, "hideNotificationBarOnFullScreenMode", true)
|
||||
config.liveLabel = ReactBridgeUtils.safeGetString(controlsConfig, "liveLabel", null)
|
||||
config.hideSettingButton = ReactBridgeUtils.safeGetBool(controlsConfig, "hideSettingButton", true)
|
||||
}
|
||||
return config
|
||||
}
|
||||
|
@@ -10,6 +10,7 @@ import static androidx.media3.common.C.TIME_END_OF_SOURCE;
|
||||
import android.annotation.SuppressLint;
|
||||
import android.app.Activity;
|
||||
import android.app.ActivityManager;
|
||||
import android.app.AlertDialog;
|
||||
import android.content.ComponentName;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
@@ -99,7 +100,6 @@ import androidx.media3.extractor.metadata.emsg.EventMessage;
|
||||
import androidx.media3.extractor.metadata.id3.Id3Frame;
|
||||
import androidx.media3.extractor.metadata.id3.TextInformationFrame;
|
||||
import androidx.media3.session.MediaSessionService;
|
||||
import androidx.media3.ui.DefaultTimeBar;
|
||||
import androidx.media3.ui.LegacyPlayerControlView;
|
||||
|
||||
import com.brentvatne.common.api.BufferConfig;
|
||||
@@ -258,6 +258,7 @@ public class ReactExoplayerView extends FrameLayout implements
|
||||
private long lastDuration = -1;
|
||||
|
||||
private boolean viewHasDropped = false;
|
||||
private int selectedSpeedIndex = 1; // Default is 1.0x
|
||||
|
||||
private final String instanceId = String.valueOf(UUID.randomUUID());
|
||||
|
||||
@@ -463,6 +464,10 @@ public class ReactExoplayerView extends FrameLayout implements
|
||||
setPausedModifier(true)
|
||||
);
|
||||
|
||||
//Handling the settingButton click event
|
||||
final ImageButton settingButton = playerControlView.findViewById(R.id.exo_settings);
|
||||
settingButton.setOnClickListener(v -> openSettings());
|
||||
|
||||
//Handling the fullScreenButton click event
|
||||
final ImageButton fullScreenButton = playerControlView.findViewById(R.id.exo_fullscreen);
|
||||
fullScreenButton.setOnClickListener(v -> setFullscreen(!isFullscreen));
|
||||
@@ -496,6 +501,35 @@ public class ReactExoplayerView extends FrameLayout implements
|
||||
};
|
||||
player.addListener(eventListener);
|
||||
}
|
||||
private void openSettings() {
|
||||
AlertDialog.Builder builder = new AlertDialog.Builder(themedReactContext);
|
||||
builder.setTitle(R.string.settings);
|
||||
String[] settingsOptions = {themedReactContext.getString(R.string.playback_speed)};
|
||||
builder.setItems(settingsOptions, (dialog, which) -> {
|
||||
if (which == 0) {
|
||||
showPlaybackSpeedOptions();
|
||||
}
|
||||
});
|
||||
builder.show();
|
||||
}
|
||||
|
||||
private void showPlaybackSpeedOptions() {
|
||||
String[] speedOptions = {"0.5x", "1.0x", "1.5x", "2.0x"};
|
||||
AlertDialog.Builder builder = new AlertDialog.Builder(themedReactContext);
|
||||
builder.setTitle(R.string.select_playback_speed);
|
||||
|
||||
builder.setSingleChoiceItems(speedOptions, selectedSpeedIndex, (dialog, which) -> {
|
||||
selectedSpeedIndex = which;
|
||||
float speed = switch (which) {
|
||||
case 0 -> 0.5f;
|
||||
case 2 -> 1.5f;
|
||||
case 3 -> 2.0f;
|
||||
default -> 1.0f;
|
||||
};
|
||||
setRateModifier(speed);
|
||||
});
|
||||
builder.show();
|
||||
}
|
||||
|
||||
/**
|
||||
* Adding Player control to the frame layout
|
||||
@@ -539,6 +573,7 @@ public class ReactExoplayerView extends FrameLayout implements
|
||||
updateViewVisibility(playerControlView.findViewById(R.id.exo_position), controlsConfig.getHidePosition(), GONE);
|
||||
updateViewVisibility(playerControlView.findViewById(R.id.exo_progress), controlsConfig.getHideSeekBar(), INVISIBLE);
|
||||
updateViewVisibility(playerControlView.findViewById(R.id.exo_duration), controlsConfig.getHideDuration(), GONE);
|
||||
updateViewVisibility(playerControlView.findViewById(R.id.exo_settings), controlsConfig.getHideSettingButton(), GONE );
|
||||
}
|
||||
|
||||
private void updateLiveContent() {
|
||||
|
@@ -101,6 +101,13 @@
|
||||
android:includeFontPadding="false"
|
||||
android:textColor="@color/silver_gray"/>
|
||||
|
||||
<ImageButton
|
||||
android:id="@+id/exo_settings"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
style="@style/ExoStyledControls.Button.Bottom.Settings"
|
||||
/>
|
||||
|
||||
<ImageButton
|
||||
android:id="@+id/exo_fullscreen"
|
||||
style="@style/ExoMediaButton.FullScreen"
|
||||
|
@@ -16,4 +16,10 @@
|
||||
<string name="error_drm_unsupported_scheme">This device does not support the required DRM scheme</string>
|
||||
|
||||
<string name="error_drm_unknown">An unknown DRM error occurred</string>
|
||||
|
||||
<string name="settings">Settings</string>
|
||||
|
||||
<string name="playback_speed">Playback Speed</string>
|
||||
|
||||
<string name="select_playback_speed">Select Playback Speed</string>
|
||||
</resources>
|
||||
|
Reference in New Issue
Block a user