diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/activities/ViewVideoActivity.java b/app/src/main/java/ml/docilealligator/infinityforreddit/activities/ViewVideoActivity.java index ce9e201e..55821679 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/activities/ViewVideoActivity.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/activities/ViewVideoActivity.java @@ -177,7 +177,7 @@ public class ViewVideoActivity extends AppCompatActivity implements CustomFontRe private boolean isDataSavingMode; private int dataSavingModeDefaultResolution; private int nonDataSavingModeDefaultResolution; - private boolean setNonDataSavingModeDefaultResolutionAlready = false; + private boolean setDefaultResolutionAlready = false; private Integer originalOrientation; private int playbackSpeed = 100; private boolean useBottomAppBar; @@ -520,7 +520,7 @@ public class ViewVideoActivity extends AppCompatActivity implements CustomFontRe videoType = savedInstanceState.getInt(VIDEO_TYPE_STATE); subredditName = savedInstanceState.getString(SUBREDDIT_NAME_STATE); id = savedInstanceState.getString(ID_STATE); - setNonDataSavingModeDefaultResolutionAlready = savedInstanceState.getBoolean(SET_NON_DATA_SAVING_MODE_DEFAULT_RESOLUTION_ALREADY_STATE); + setDefaultResolutionAlready = savedInstanceState.getBoolean(SET_NON_DATA_SAVING_MODE_DEFAULT_RESOLUTION_ALREADY_STATE); setPlaybackSpeed(savedInstanceState.getInt(PLAYBACK_SPEED_STATE, 100)); } @@ -546,8 +546,8 @@ public class ViewVideoActivity extends AppCompatActivity implements CustomFontRe ImmutableList trackGroups = tracks.getGroups(); if (!trackGroups.isEmpty()) { if (videoType == VIDEO_TYPE_NORMAL) { - binding.getHdButton().setVisibility(View.VISIBLE); - binding.getHdButton().setOnClickListener(view -> { + binding.getVideoQualityButton().setVisibility(View.VISIBLE); + binding.getVideoQualityButton().setOnClickListener(view -> { TrackSelectionDialogBuilder builder = new TrackSelectionDialogBuilder(ViewVideoActivity.this, getString(R.string.select_video_quality), player, C.TRACK_TYPE_VIDEO); builder.setShowDisableOption(true); builder.setAllowAdaptiveSelections(false); @@ -559,7 +559,7 @@ public class ViewVideoActivity extends AppCompatActivity implements CustomFontRe } }); - if (!setNonDataSavingModeDefaultResolutionAlready) { + if (!setDefaultResolutionAlready) { int desiredResolution = 0; if (isDataSavingMode) { if (dataSavingModeDefaultResolution > 0) { @@ -616,7 +616,7 @@ public class ViewVideoActivity extends AppCompatActivity implements CustomFontRe ); } } - setNonDataSavingModeDefaultResolutionAlready = true; + setDefaultResolutionAlready = true; } } @@ -1051,7 +1051,7 @@ public class ViewVideoActivity extends AppCompatActivity implements CustomFontRe outState.putString(ID_STATE, id); } outState.putInt(PLAYBACK_SPEED_STATE, playbackSpeed); - outState.putBoolean(SET_NON_DATA_SAVING_MODE_DEFAULT_RESOLUTION_ALREADY_STATE, setNonDataSavingModeDefaultResolutionAlready); + outState.putBoolean(SET_NON_DATA_SAVING_MODE_DEFAULT_RESOLUTION_ALREADY_STATE, setDefaultResolutionAlready); } @Override diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/activities/ViewVideoActivityBindingAdapter.java b/app/src/main/java/ml/docilealligator/infinityforreddit/activities/ViewVideoActivityBindingAdapter.java index 118bfcc1..ef9c0422 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/activities/ViewVideoActivityBindingAdapter.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/activities/ViewVideoActivityBindingAdapter.java @@ -25,7 +25,7 @@ public class ViewVideoActivityBindingAdapter { private final MaterialButton forwardButton; private final MaterialButton rewindButton; private final MaterialButton muteButton; - private final MaterialButton hdButton; + private final MaterialButton videoQualityButton; private final BottomAppBar bottomAppBar; private final TextView titleTextView; private final MaterialButton backButton; @@ -38,7 +38,7 @@ public class ViewVideoActivityBindingAdapter { forwardButton = binding.getRoot().findViewById(R.id.exo_ffwd); rewindButton = binding.getRoot().findViewById(R.id.exo_rew); muteButton = binding.getRoot().findViewById(R.id.mute_exo_playback_control_view); - hdButton = binding.getRoot().findViewById(R.id.hd_exo_playback_control_view); + videoQualityButton = binding.getRoot().findViewById(R.id.video_quality_exo_playback_control_view); bottomAppBar = binding.getRoot().findViewById(R.id.bottom_navigation_exo_playback_control_view); titleTextView = binding.getRoot().findViewById(R.id.title_text_view_exo_playback_control_view); backButton = binding.getRoot().findViewById(R.id.back_button_exo_playback_control_view); @@ -52,7 +52,7 @@ public class ViewVideoActivityBindingAdapter { forwardButton = binding.getRoot().findViewById(R.id.exo_ffwd); rewindButton = binding.getRoot().findViewById(R.id.exo_rew); muteButton = binding.getRoot().findViewById(R.id.mute_exo_playback_control_view); - hdButton = binding.getRoot().findViewById(R.id.hd_exo_playback_control_view); + videoQualityButton = binding.getRoot().findViewById(R.id.video_quality_exo_playback_control_view); bottomAppBar = binding.getRoot().findViewById(R.id.bottom_navigation_exo_playback_control_view); titleTextView = binding.getRoot().findViewById(R.id.title_text_view_exo_playback_control_view); backButton = binding.getRoot().findViewById(R.id.back_button_exo_playback_control_view); @@ -88,8 +88,8 @@ public class ViewVideoActivityBindingAdapter { return muteButton; } - public MaterialButton getHdButton() { - return hdButton; + public MaterialButton getVideoQualityButton() { + return videoQualityButton; } public BottomAppBar getBottomAppBar() { diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/adapters/PostRecyclerViewAdapter.java b/app/src/main/java/ml/docilealligator/infinityforreddit/adapters/PostRecyclerViewAdapter.java index be296b36..b4baade8 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/adapters/PostRecyclerViewAdapter.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/adapters/PostRecyclerViewAdapter.java @@ -1,5 +1,6 @@ package ml.docilealligator.infinityforreddit.adapters; +import android.app.Dialog; import android.content.Intent; import android.content.SharedPreferences; import android.content.res.ColorStateList; @@ -27,12 +28,15 @@ import android.widget.Toast; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.annotation.OptIn; +import androidx.appcompat.app.AlertDialog; import androidx.appcompat.content.res.AppCompatResources; import androidx.constraintlayout.widget.ConstraintLayout; import androidx.constraintlayout.widget.ConstraintSet; import androidx.core.content.ContextCompat; +import androidx.media3.common.C; import androidx.media3.common.PlaybackException; import androidx.media3.common.Player; +import androidx.media3.common.TrackSelectionOverride; import androidx.media3.common.Tracks; import androidx.media3.common.util.UnstableApi; import androidx.media3.common.util.Util; @@ -40,6 +44,7 @@ import androidx.media3.ui.AspectRatioFrameLayout; import androidx.media3.ui.DefaultTimeBar; import androidx.media3.ui.PlayerView; import androidx.media3.ui.TimeBar; +import androidx.media3.ui.TrackSelectionDialogBuilder; import androidx.paging.PagingDataAdapter; import androidx.recyclerview.widget.DiffUtil; import androidx.recyclerview.widget.ItemTouchHelper; @@ -256,6 +261,8 @@ public class PostRecyclerViewAdapter extends PagingDataAdapter trackGroups = tracks.getGroups(); if (!trackGroups.isEmpty()) { + if (getPost().isNormalVideo()) { + videoQualityButton.setVisibility(View.VISIBLE); + videoQualityButton.setOnClickListener(view -> { + TrackSelectionDialogBuilder builder = new TrackSelectionDialogBuilder(mActivity, mActivity.getString(R.string.select_video_quality), helper.getPlayer(), C.TRACK_TYPE_VIDEO); + builder.setShowDisableOption(true); + builder.setAllowAdaptiveSelections(false); + Dialog dialog = builder.setTheme(R.style.MaterialAlertDialogTheme).build(); + dialog.show(); + if (dialog instanceof AlertDialog) { + ((AlertDialog) dialog).getButton(AlertDialog.BUTTON_POSITIVE).setTextColor(mCustomThemeWrapper.getPrimaryTextColor()); + ((AlertDialog) dialog).getButton(AlertDialog.BUTTON_NEGATIVE).setTextColor(mCustomThemeWrapper.getPrimaryTextColor()); + } + }); + + if (!setDefaultResolutionAlready) { + int desiredResolution = 0; + if (mDataSavingMode) { + if (mDataSavingModeDefaultResolution > 0) { + desiredResolution = mDataSavingModeDefaultResolution; + } + } else if (mNonDataSavingModeDefaultResolution > 0) { + desiredResolution = mNonDataSavingModeDefaultResolution; + } + + if (desiredResolution > 0) { + TrackSelectionOverride trackSelectionOverride = null; + int bestTrackIndex = -1; + int bestResolution = -1; + int worstResolution = Integer.MAX_VALUE; + int worstTrackIndex = -1; + Tracks.Group bestTrackGroup = null; + Tracks.Group worstTrackGroup = null; + for (Tracks.Group trackGroup : tracks.getGroups()) { + if (trackGroup.getType() == C.TRACK_TYPE_VIDEO) { + for (int trackIndex = 0; trackIndex < trackGroup.length; trackIndex++) { + int trackResolution = Math.min(trackGroup.getTrackFormat(trackIndex).height, trackGroup.getTrackFormat(trackIndex).width); + if (trackResolution <= desiredResolution && trackResolution > bestResolution) { + bestTrackIndex = trackIndex; + bestResolution = trackResolution; + bestTrackGroup = trackGroup; + } + if (trackResolution < worstResolution) { + worstTrackIndex = trackIndex; + worstResolution = trackResolution; + worstTrackGroup = trackGroup; + } + } + } + } + + if (bestTrackIndex != -1 && bestTrackGroup != null) { + trackSelectionOverride = new TrackSelectionOverride( + bestTrackGroup.getMediaTrackGroup(), + ImmutableList.of(bestTrackIndex) + ); + } else if (worstTrackIndex != -1 && worstTrackGroup != null) { + trackSelectionOverride = new TrackSelectionOverride( + worstTrackGroup.getMediaTrackGroup(), + ImmutableList.of(worstTrackIndex) + ); + } + + if (trackSelectionOverride != null) { + helper.getPlayer().setTrackSelectionParameters( + helper.getPlayer().getTrackSelectionParameters() + .buildUpon() + .addOverride(trackSelectionOverride) + .build() + ); + } + } + setDefaultResolutionAlready = true; + } + } + for (int i = 0; i < trackGroups.size(); i++) { String mimeType = trackGroups.get(i).getTrackFormat(0).sampleMimeType; if (mimeType != null && mimeType.contains("audio")) { @@ -3043,6 +3132,7 @@ public class PostRecyclerViewAdapter extends PagingDataAdapter + + + +