java code
1 message
Rahul Singh <ps8303383@[Link]> Thu, Jun 19, 2025 at 3:32 PM
To: Pritesh Singh <priteshsingh8303@[Link]>
package [Link].ecoplayer2025;
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link].C;
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
@UnstableApi
public class PlayerActivity extends AppCompatActivity {
PlayerView playerView;
ExoPlayer exoPlayer;
private ArrayList<String> videoQualities;
private DefaultTrackSelector defaultTrackSelector;
private int selectedQualityIndex = 0;
boolean isFullScreen = false;
String Speed_txt = "1x";
final int[] selectedIndex = { -1 };
final int[] selected = {-1}; // Store selected index
// private ControlsMode controlsMode;
// public enum ControlsMode{
// LOCK,FULLSCREEN;
// }
// gesture
private int touchPositionX;
private GestureDetectorCompat gestureDetectorCompat;
private int brightness = 0;
private int volume = 0;
private AudioManager audioManager;
private final int SHOW_MAX_BRIGHTNESS = 100;
private final int SHOW_MAX_VOLUME = 50;
private boolean shouldShowController = true;
private LinearLayout brightnessVolumeContainer;
private ImageView volumeIcon, brightnessIcon;
private TextView brightVolumeTV;
private static final String TAG = "MADARA";
//--------------
[Link] dataSourceFactory;
@SuppressLint("ClickableViewAccessibility")
@Override
protected void onCreate(Bundle savedInstanceState) {
[Link](savedInstanceState);
[Link](this);
[Link](getWindow(), getWindow().getDecorView()).
setAppearanceLightStatusBars(false);
[Link](getWindow(), getWindow().getDecorView()).
setAppearanceLightNavigationBars(false);
if ([Link].SDK_INT >= Build.VERSION_CODES.Q) {
getWindow().setNavigationBarContrastEnforced(false);
}
setContentView([Link].activity_player);
[Link](findViewById([Link]), (v, insets) -> {
Insets systemBars = [Link]([Link]());
[Link]([Link], [Link], [Link], [Link]);
return insets;
});
String stream = getIntent().getStringExtra("url");
[Link] videoTrackSelectionFactory = new [Link]();
defaultTrackSelector = new DefaultTrackSelector(this, videoTrackSelectionFactory);
DefaultRenderersFactory renderersFactory = new DefaultRenderersFactory(this)
.forceEnableMediaCodecAsynchronousQueueing()
.setExtensionRendererMode(DefaultRenderersFactory.EXTENSION_RENDERER_MODE_OFF);
playerView = findViewById([Link].player_view);
Uri uri = [Link](stream);
dataSourceFactory = new [Link]();
MediaSource mediaSource = buildMediaSource(uri);
exoPlayer = new [Link](this, renderersFactory)
.setTrackSelector(defaultTrackSelector)
.build();
[Link](exoPlayer);
[Link](mediaSource);
[Link]();
[Link](true);
[Link]();
// ............................................................
..............................
brightnessVolumeContainer = findViewById([Link].brightness_volume_container);
brightnessIcon = findViewById([Link].brightness_icon);
volumeIcon = findViewById([Link].volume_icon);
brightVolumeTV = findViewById([Link].brightness_volume_tv);
audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++++++++++++++++++++++++++++++
/* This block of codes set the current device volume and brightness to the video on startup */
brightness = (int) (getCurrentScreenBrightness() * 100);
setVolumeVariable();
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
[Link]((view, motionEvent) -> {
[Link](motionEvent);
if ([Link]() == MotionEvent.ACTION_UP) {
[Link]([Link]);
if (!shouldShowController) {
[Link](false);
new Handler().postDelayed(() -> {
shouldShowController = true;
[Link](true);
}, 500);
}
}
if ([Link]() == MotionEvent.ACTION_DOWN) {
touchPositionX = (int) [Link]();
}
return false;
});
// ..........................................................................................
// ************************************************************
******************************
gestureDetectorCompat = new GestureDetectorCompat(this, new GestureDetector.
OnGestureListener() {
@Override
public boolean onDown(@NonNull MotionEvent motionEvent) {
return false;
}
@Override
public void onShowPress(@NonNull MotionEvent motionEvent) {
@Override
public boolean onSingleTapUp(@NonNull MotionEvent motionEvent) {
return false;
}
@Override
public void onLongPress(@NonNull MotionEvent motionEvent) {
@Override
public boolean onFling(MotionEvent motionEvent, @NonNull MotionEvent motionEvent1, float
v, float v1) {
return false;
}
@Override
public boolean onScroll(MotionEvent motionEvent, @NonNull MotionEvent motionEvent1, float
distanceX, float distanceY) {
int deviceWidth = [Link]().getDisplayMetrics().widthPixels;
if ([Link](distanceY) > [Link](distanceX)) {
[Link]([Link]);
shouldShowController = false;
if ([Link]() < deviceWidth / 2) {
[Link]([Link]);
[Link]([Link]);
boolean increase = distanceY > 0;
int newValue = (increase) ? brightness + 1 : brightness - 1;
if (newValue >= 0 && newValue <= SHOW_MAX_BRIGHTNESS) {
brightness = newValue;
}
[Link]([Link](brightness));
setScreenBrightness(brightness);
} else {
if (audioManager != null) {
[Link]([Link]);
[Link]([Link]);
boolean increase = distanceY > 0;
int newValue = (increase) ? volume + 1 : volume - 1;
if (newValue >= 0 && newValue <= SHOW_MAX_VOLUME) {
volume = newValue;
}
[Link]([Link](volume));
setVolume(volume);
}
}
}
return true;
}
});
ImageView backButton = [Link]([Link].Back_Button);
[Link](v -> {
[Link] mappedTrackInfo = defaultTrackSelector.
getCurrentMappedTrackInfo();
if (mappedTrackInfo == null) {
[Link](this, "No subtitle tracks found", Toast.LENGTH_SHORT).show();
return;
}
for (int rendererIndex = 0; rendererIndex < [Link]();
rendererIndex++) {
if ([Link](rendererIndex) == C.TRACK_TYPE_TEXT) {
TrackGroupArray trackGroups = [Link](rendererIndex);
int trackCount = [Link];
String[] subtitleNames = new String[trackCount +1];//+1
subtitleNames[0] = "Disable";
int checkedItem = 0; // default: subtitles off
for (int i = 0; i < trackCount; i++) {
Format format = [Link](i).getFormat(0);
String label = ([Link] != null) ? [Link] :
([Link] != null ? new Locale([Link]).
getDisplayLanguage() : "Subtitle" + (i + 1));//Subtitle
subtitleNames[i +1] = label;//+1
// Currently selected subtitle
Tracks currentTracks = [Link]();
for ([Link] group : [Link]()) {
if ([Link]() == C.TRACK_TYPE_TEXT &&
[Link]() &&
[Link]().equals([Link](i))) {
checkedItem = i + 1;//+1
}
}
}
final int[] selectedIndex = {checkedItem}; // use array to modify in inner class
//final int finalRendererIndex = rendererIndex;
[Link] builder = new [Link](this);
[Link]("Select Subtitle");
[Link](subtitleNames, checkedItem, (dialog, which) -> {
selectedIndex[0] = which; // store selected index
});
[Link]("OK", (dialog, which) -> {
[Link] paramsBuilder = defaultTrackSelector.
getParameters().buildUpon();
if (selectedIndex[0] == 0) {
// Turn off subtitles
[Link](C.TRACK_TYPE_TEXT, true);
//[Link](finalRendererIndex, true);
} else {
TrackGroup selectedGroup = [Link](selectedIndex[0] -1);//-1
TrackSelectionOverride override = new TrackSelectionOverride(
selectedGroup, 0);
[Link](C.TRACK_TYPE_TEXT, false)
.clearOverridesOfType(C.TRACK_TYPE_TEXT)
.addOverride(override);
}
[Link]([Link]());
[Link](this, "Subtitle updated"+subtitleNames[selectedIndex[0]],
Toast.LENGTH_SHORT).show();
});
[Link]("Cancel", null);
[Link]();
break;
}
});
LinearLayout Ratio = [Link]([Link]);
[Link](v -> {
[Link] mappedTrackInfo = defaultTrackSelector.
getCurrentMappedTrackInfo();
if (mappedTrackInfo == null) {
[Link](this, "No tracks available", Toast.LENGTH_SHORT).show();
return;
}
for (int rendererIndex = 0; rendererIndex < [Link]();
rendererIndex++) {
if ([Link](rendererIndex) == C.TRACK_TYPE_AUDIO) {
TrackGroupArray trackGroups = [Link](rendererIndex);
String[] languageNames = new String[[Link]];
int checkedItem = -1;
for (int i = 0; i < [Link]; i++) {
Format format = [Link](i).getFormat(0);
String languageCode = [Link];
String label = [Link];
if (label != null && ![Link]()) {
languageNames[i] = label;
} else if (languageCode != null) {
Locale locale = new Locale(languageCode);
languageNames[i] = [Link]();
} else {
languageNames[i] = "Unknown Language";
}
// Check if this track is currently selected
Tracks currentTracks =[Link]();
for ([Link] group : [Link]()) {
if ([Link]() == C.TRACK_TYPE_AUDIO &&
[Link]() &&
[Link]().equals([Link](i))) {
checkedItem = i;
selectedIndex[0] = i;
break;
}
}
}
[Link] builder = new [Link](this);
[Link]("Select Audio Language");
[Link](languageNames, checkedItem, (dialog, which) ->
selectedIndex[0] = which);
[Link]("Ok", (dialogInterface, i) -> {
TrackGroup selectedGroup = [Link](selectedIndex[0]);
TrackSelectionOverride override = new TrackSelectionOverride(selectedGroup,
0);
TrackSelectionParameters newParams = defaultTrackSelector
.getParameters()
.buildUpon()
.setOverrideForType(override)
.build();
[Link](newParams);
[Link](this, "Switched to " +languageNames[selectedIndex[0]],
Toast.LENGTH_SHORT).show();
});
[Link]("Cancel", null);
[Link]();
break;
}
}
});
// ******************************************************************************************
String[] groupName = { "0.5x", "1.0x", "1.5x", "2.0x" };
float[] playerSpeedGroup = { 0.5f, 1f, 1.5f, 2f };
final int[] selectedGroup = {1};
final int[] tempSelectedGroup = {1};
LinearLayout speed = [Link]([Link].Speed_Button);
[Link](v -> {
[Link] alt_bld = new [Link](this, [Link]);
alt_bld.setTitle("Select Player Speed");
alt_bld.setSingleChoiceItems(groupName, selectedGroup[0], new DialogInterface
.OnClickListener() {
public void onClick(DialogInterface dialog, int item) {
tempSelectedGroup[0] = item;
}
})
.setPositiveButton("Ok", new [Link]() {
@Override
public void onClick(DialogInterface dialog, int which) {
PlaybackParameters param = new PlaybackParameters(playerSpeed
Group[tempSelectedGroup[0]]);
[Link](param);
selectedGroup[0] = tempSelectedGroup[0];
[Link]();
Speed_txt = groupName[selectedGroup[0]];
[Link]([Link], "Speed:"+groupName[selectedGroup[0]],
Toast.LENGTH_SHORT).show();
}
})
.setNegativeButton("Cancel", new [Link]() {
@Override
public void onClick(DialogInterface dialog, int which) {
[Link]();
}
});
AlertDialog alert = alt_bld.create();
[Link]();
});
ImageView unlock_button = [Link]([Link].UnLock_Button);
ImageView lock_button = [Link]([Link].Lock_Button);
ConstraintLayout constraintLayout = [Link]([Link].custom_control);
lock_button.setOnClickListener(v -> {
// controlsMode = [Link];
[Link]([Link]);
lock_button.setVisibility([Link]);
});
unlock_button.setOnClickListener(v -> {
// controlsMode = [Link];
[Link]([Link]);
lock_button.setVisibility([Link]);
});
ImageView setting_btn = [Link]([Link].Setting_Button);
setting_btn.setOnClickListener(v -> {
ShowDialog();
});
TextView title = [Link]([Link].Exo_Title);
ImageView resize = [Link]([Link].Resize_Button);
ImageView fullscreen = [Link]([Link].Full_Button);
[Link](v -> {
if (isFullScreen) {
if (getSupportActionBar() != null) {
getSupportActionBar().show();
}
getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
//
LinearLayout controls = [Link]([Link]);
[Link]([Link]);
[Link]([Link]);
[Link]([Link]);
unlock_button.setVisibility([Link]);
setting_btn.setVisibility([Link]);
//
[Link]([Link]([Link],
[Link].full_close));
[Link] params = ([Link])
[Link]();
[Link] = params.MATCH_PARENT;
[Link] = (int) (200 * getApplicationContext().getResources().
getDisplayMetrics().density);
[Link](params);
isFullScreen = false;
} else {
if (getSupportActionBar() != null) {
getSupportActionBar().hide();
}
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN
| View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION);
//
LinearLayout controls = [Link]([Link]);
[Link]([Link]);
[Link]([Link]);
[Link]([Link]);
unlock_button.setVisibility([Link]);
setting_btn.setVisibility([Link]);
//
[Link]([Link]([Link],
[Link].full_open));
[Link] params = ([Link])
[Link]();
[Link] = params.MATCH_PARENT;
[Link] = params.MATCH_PARENT;
[Link](params);
isFullScreen = true;
}
});
LinearLayout setting = [Link]([Link].Video_Button);
[Link](v -> {
if (videoQualities != null) {
if ([Link]() > 0) {
getQualityChooserDialog(this, videoQualities);
} else {
[Link](this, "No video quality found.", Toast.LENGTH_SHORT).show();
}
} else {
[Link](this, "Wait until video start.", Toast.LENGTH_SHORT).show();
}
});
[Link](new [Link]() {
@Override
public void onPlaybackStateChanged(int state) {
if (state == Player.STATE_READY) {
videoQualities = getVideoQualitiesTracks();
} else if (state == Player.STATE_BUFFERING) {
} else {
}
}
});
}
private MediaSource buildMediaSource(Uri uri) {
int contentType = [Link](uri);
MediaItem mediaItem = [Link](uri);
if (contentType==C.CONTENT_TYPE_RTSP) {
[Link](this, "RTSP", Toast.LENGTH_SHORT).show();
return new [Link]().createMediaSource(mediaItem);
} else if (contentType==C.CONTENT_TYPE_HLS) {
[Link](this, "HLS", Toast.LENGTH_SHORT).show();
return new [Link](dataSourceFactory).createMediaSource(mediaItem);
} else if (contentType==C.CONTENT_TYPE_DASH) {
[Link](this, "DASH", Toast.LENGTH_SHORT).show();
return new [Link](dataSourceFactory).createMediaSource(mediaItem);
} else if (contentType==C.CONTENT_TYPE_SS) {
[Link](this, "SS", Toast.LENGTH_SHORT).show();
return new [Link](dataSourceFactory).createMediaSource(mediaItem);
} else {
[Link](this, "PMS", Toast.LENGTH_SHORT).show();
return new [Link](dataSourceFactory).createMediaSource(mediaItem);
}
}
private void ShowDialog() {
final Dialog dialog = new Dialog(this);
[Link](Window.FEATURE_NO_TITLE);
[Link]([Link].bottom_sheet);
TextView speed_txt = [Link]([Link].Speed_bottom);
speed_txt.setText(Speed_txt);
[Link]([Link]()).setLayout([Link].MATCH_
PARENT,[Link].WRAP_CONTENT);
[Link]().setBackgroundDrawable(new ColorDrawable([Link]));
[Link]().getAttributes().windowAnimations = [Link];
[Link]().setGravity([Link]);
[Link]();
private ArrayList<String> getVideoQualitiesTracks() {
ArrayList<String> videoQualities = new ArrayList<>();
[Link] renderTrack = defaultTrackSelector.
getCurrentMappedTrackInfo();
assert renderTrack != null;
int renderCount = [Link]();
for (int rendererIndex = 0; rendererIndex < renderCount; rendererIndex++) {
if (isSupportedFormat(renderTrack, rendererIndex)) {
int trackGroupType = [Link](rendererIndex);
TrackGroupArray trackGroups = [Link](rendererIndex);
int trackGroupsCount = [Link];
if (trackGroupType == C.TRACK_TYPE_VIDEO) {
for (int groupIndex = 0; groupIndex < trackGroupsCount; groupIndex++) {
int videoQualityTrackCount = [Link](groupIndex).length;
for (int trackIndex = 0; trackIndex < videoQualityTrackCount; trackIndex++) {
boolean isTrackSupported = [Link](rendererIndex,
groupIndex, trackIndex) == C.FORMAT_HANDLED;
if (isTrackSupported) {
TrackGroup track = [Link](groupIndex);
int videoWidth = [Link](trackIndex).width;
int videoHeight = [Link](trackIndex).height;
String quality = videoWidth + "x" + videoHeight;
[Link](quality);
}
}
}
}
}
}
return videoQualities;
}
private boolean isSupportedFormat([Link] mappedTrackInfo, int
rendererIndex) {
TrackGroupArray trackGroupArray = [Link](rendererIndex);
if ([Link] == 0) {
return false;
} else {
return [Link](rendererIndex) == C.TRACK_TYPE_VIDEO;
}
}
//______________________________________________________________________________________________
// private void getQualityChooserDialog(Context context, ArrayList<String> arrayList) {
// CharSequence[] charSequences = new CharSequence[[Link]() + 1];
// charSequences[0] = "Auto";
//
// for (int i = 0; i < [Link](); i++) {
// charSequences[i + 1] = [Link](i); //.split("x")[1] + "p";
// }
//
// MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(context);
// [Link]("Select video quality:");
// [Link](charSequences, selectedQualityIndex, (dialogInterface, which) -
> selectedQualityIndex = which);
// [Link]("Ok", (dialogInterface, i) -> {
//
// if (selectedQualityIndex == 0) {
// [Link](context, [Link]([Link].app_name) + " will choose video
resolution automatically.", Toast.LENGTH_SHORT).show();
// [Link]([Link]().
setMaxVideoSizeSd());
// } else {
// String[] videoQualityInfo = [Link](selectedQualityIndex - 1).split("x");
//
// [Link](context, "Video will be played with " + videoQualityInfo[1] + "p
resolution.", Toast.LENGTH_SHORT).show();
//
// int videoWidth = [Link](videoQualityInfo[0]);
// int videoHeight = [Link](videoQualityInfo[1]);
//
// [Link](
// defaultTrackSelector
// .buildUponParameters()
// .setMaxVideoSize(videoWidth, videoHeight)
// .setMinVideoSize(videoWidth, videoHeight)
// );
// }
// });
// [Link]("Cancel", (dialogInterface, i) -> [Link]());
// [Link]();
// }
private void getQualityChooserDialog(Context context, ArrayList<String> arrayList) {
CharSequence[] charSequences = new CharSequence[[Link]() + 1];
charSequences[0] = "Auto";
for (int i = 0; i < [Link](); i++) {
charSequences[i + 1] = [Link](i); //.split("x")[1] + "p";
}
[Link] builder = new [Link](context, [Link]);
[Link]("Video Quality");
[Link](charSequences, selectedQualityIndex, (dialogInterface, which) ->
selectedQualityIndex = which);
[Link]("Ok", (dialogInterface, i) -> {
if (selectedQualityIndex == 0) {
[Link](context, [Link]([Link].app_name) + " will choose video
resolution automatically.", Toast.LENGTH_SHORT).show();
[Link]([Link]().
setMaxVideoSizeSd());
} else {
String[] videoQualityInfo = [Link](selectedQualityIndex - 1).split("x");
[Link](context, "Video will be played with " + videoQualityInfo[1] + "p
resolution.", Toast.LENGTH_SHORT).show();
int videoWidth = [Link](videoQualityInfo[0]);
int videoHeight = [Link](videoQualityInfo[1]);
[Link](
defaultTrackSelector
.buildUponParameters()
.setMaxVideoSize(videoWidth, videoHeight)
.setMinVideoSize(videoWidth, videoHeight)
);
}
});
[Link]("Cancel", (dialogInterface, i) -> [Link]());
[Link]();
}
//______________________________________________________________________________________________
//______________________________________________________________________________________________
@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_VOLUME_UP || keyCode == KeyEvent.KEYCODE_VOLUME_DOWN) {
setVolumeVariable();
}
return [Link](keyCode, event);
}
private void setScreenBrightness(int brightness1) {
float d = 1.0f / SHOW_MAX_BRIGHTNESS;
[Link] lp = getWindow().getAttributes();
[Link] = d * brightness1;
getWindow().setAttributes(lp);
}
private float getCurrentScreenBrightness() {
// Get the current screen brightness value
int currentBrightness = 0;
try {
currentBrightness = [Link](
getContentResolver(),
[Link].SCREEN_BRIGHTNESS
);
} catch ([Link] e) {
Log.e(TAG, "getCurrentScreenBrightness: ", e);
}
// Get the maximum brightness value supported by the device's screen
int maxBrightness = 255; // Default value; you can get the actual maximum brightness using
system APIs
// Calculate the brightness value in the range [0, 1.0]
float brightnessValue = (float) currentBrightness / maxBrightness;
// Clamp the brightnessValue to the range [0, 1.0]
brightnessValue = [Link](0f, [Link](1.0f, brightnessValue));
return brightnessValue;
}
private void setVolume(int volume1) {
int maxVolume = [Link](AudioManager.STREAM_MUSIC);
float d = (maxVolume * 1.0f) / SHOW_MAX_VOLUME;
int newVolume = (int) (d * volume1);
if (newVolume > maxVolume) {
newVolume = maxVolume;
}
if (volume1 == SHOW_MAX_VOLUME && newVolume < maxVolume) {
newVolume = maxVolume;
}
[Link](AudioManager.STREAM_MUSIC, newVolume, 0);
}
private void setVolumeVariable() {
volume = (int) (([Link](AudioManager.STREAM_MUSIC) * 1.0f) /
[Link](AudioManager.STREAM_MUSIC) * SHOW_MAX_VOLUME);
if (volume > SHOW_MAX_VOLUME) {
volume = SHOW_MAX_VOLUME;
}
}
//______________________________________________________________________________________________
@Override
protected void onResume() {
[Link]();
[Link]();
if (brightness > 0) {
setScreenBrightness(brightness);
}
setVolume(volume);
}
@Override
protected void onPause() {
[Link]();
[Link]();
}
@Override
protected void onDestroy() {
[Link]();
[Link]();
}
}