Change playback speed.

This commit is contained in:
Alex Ning 2021-10-09 21:22:18 +08:00
parent e02f5a28b3
commit abd57e23a6
8 changed files with 332 additions and 2 deletions

View File

@ -36,6 +36,7 @@ import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat; import androidx.core.content.ContextCompat;
import com.google.android.exoplayer2.ExoPlayerFactory; import com.google.android.exoplayer2.ExoPlayerFactory;
import com.google.android.exoplayer2.PlaybackParameters;
import com.google.android.exoplayer2.Player; import com.google.android.exoplayer2.Player;
import com.google.android.exoplayer2.SimpleExoPlayer; import com.google.android.exoplayer2.SimpleExoPlayer;
import com.google.android.exoplayer2.source.ProgressiveMediaSource; import com.google.android.exoplayer2.source.ProgressiveMediaSource;
@ -55,8 +56,6 @@ import com.google.android.exoplayer2.upstream.cache.SimpleCache;
import com.google.android.exoplayer2.util.Util; import com.google.android.exoplayer2.util.Util;
import com.google.android.material.bottomappbar.BottomAppBar; import com.google.android.material.bottomappbar.BottomAppBar;
import com.google.android.material.snackbar.Snackbar; import com.google.android.material.snackbar.Snackbar;
import app.futured.hauler.DragDirection;
import app.futured.hauler.HaulerView;
import org.apache.commons.io.FilenameUtils; import org.apache.commons.io.FilenameUtils;
@ -66,12 +65,15 @@ import java.util.concurrent.Executor;
import javax.inject.Inject; import javax.inject.Inject;
import javax.inject.Named; import javax.inject.Named;
import app.futured.hauler.DragDirection;
import app.futured.hauler.HaulerView;
import butterknife.BindView; import butterknife.BindView;
import butterknife.ButterKnife; import butterknife.ButterKnife;
import ml.docilealligator.infinityforreddit.FetchGfycatOrRedgifsVideoLinks; import ml.docilealligator.infinityforreddit.FetchGfycatOrRedgifsVideoLinks;
import ml.docilealligator.infinityforreddit.Infinity; import ml.docilealligator.infinityforreddit.Infinity;
import ml.docilealligator.infinityforreddit.R; import ml.docilealligator.infinityforreddit.R;
import ml.docilealligator.infinityforreddit.apis.VReddIt; import ml.docilealligator.infinityforreddit.apis.VReddIt;
import ml.docilealligator.infinityforreddit.bottomsheetfragments.PlaybackSpeedBottomSheetFragment;
import ml.docilealligator.infinityforreddit.font.ContentFontFamily; import ml.docilealligator.infinityforreddit.font.ContentFontFamily;
import ml.docilealligator.infinityforreddit.font.ContentFontStyle; import ml.docilealligator.infinityforreddit.font.ContentFontStyle;
import ml.docilealligator.infinityforreddit.font.FontFamily; import ml.docilealligator.infinityforreddit.font.FontFamily;
@ -91,6 +93,14 @@ import retrofit2.Retrofit;
public class ViewVideoActivity extends AppCompatActivity { public class ViewVideoActivity extends AppCompatActivity {
public static final int PLAYBACK_SPEED_25 = 25;
public static final int PLAYBACK_SPEED_50 = 50;
public static final int PLAYBACK_SPEED_75 = 75;
public static final int PLAYBACK_SPEED_NORMAL = 100;
public static final int PLAYBACK_SPEED_125 = 125;
public static final int PLAYBACK_SPEED_150 = 150;
public static final int PLAYBACK_SPEED_175 = 175;
public static final int PLAYBACK_SPEED_200 = 200;
public static final String EXTRA_VIDEO_DOWNLOAD_URL = "EVDU"; public static final String EXTRA_VIDEO_DOWNLOAD_URL = "EVDU";
public static final String EXTRA_SUBREDDIT = "ES"; public static final String EXTRA_SUBREDDIT = "ES";
public static final String EXTRA_ID = "EI"; public static final String EXTRA_ID = "EI";
@ -113,6 +123,7 @@ public class ViewVideoActivity extends AppCompatActivity {
private static final String VIDEO_TYPE_STATE = "VTS"; private static final String VIDEO_TYPE_STATE = "VTS";
private static final String SUBREDDIT_NAME_STATE = "SNS"; private static final String SUBREDDIT_NAME_STATE = "SNS";
private static final String ID_STATE= "IS"; private static final String ID_STATE= "IS";
private static final String PLAYBACK_SPEED_STATE = "PSS";
@BindView(R.id.hauler_view_view_video_activity) @BindView(R.id.hauler_view_view_video_activity)
HaulerView haulerView; HaulerView haulerView;
@ -152,6 +163,7 @@ public class ViewVideoActivity extends AppCompatActivity {
private boolean isDataSavingMode; private boolean isDataSavingMode;
private boolean isHd; private boolean isHd;
private Integer originalOrientation; private Integer originalOrientation;
private int playbackSpeed = 100;
@Inject @Inject
@Named("no_oauth") @Named("no_oauth")
@ -347,7 +359,9 @@ public class ViewVideoActivity extends AppCompatActivity {
videoType = savedInstanceState.getInt(VIDEO_TYPE_STATE); videoType = savedInstanceState.getInt(VIDEO_TYPE_STATE);
subredditName = savedInstanceState.getString(SUBREDDIT_NAME_STATE); subredditName = savedInstanceState.getString(SUBREDDIT_NAME_STATE);
id = savedInstanceState.getString(ID_STATE); id = savedInstanceState.getString(ID_STATE);
playbackSpeed = savedInstanceState.getInt(PLAYBACK_SPEED_STATE);
} }
setPlaybackSpeed(playbackSpeed);
if (videoType == VIDEO_TYPE_V_REDD_IT) { if (videoType == VIDEO_TYPE_V_REDD_IT) {
loadVReddItVideo(savedInstanceState); loadVReddItVideo(savedInstanceState);
@ -626,11 +640,23 @@ public class ViewVideoActivity extends AppCompatActivity {
isDownloading = true; isDownloading = true;
requestPermissionAndDownload(); requestPermissionAndDownload();
return true; return true;
} else if (itemId == R.id.action_playback_speed_view_video_activity) {
PlaybackSpeedBottomSheetFragment playbackSpeedBottomSheetFragment = new PlaybackSpeedBottomSheetFragment();
Bundle bundle = new Bundle();
bundle.putInt(PlaybackSpeedBottomSheetFragment.EXTRA_PLAYBACK_SPEED, playbackSpeed);
playbackSpeedBottomSheetFragment.setArguments(bundle);
playbackSpeedBottomSheetFragment.show(getSupportFragmentManager(), playbackSpeedBottomSheetFragment.getTag());
return true;
} }
return false; return false;
} }
public void setPlaybackSpeed(int speed100X) {
this.playbackSpeed = speed100X;
player.setPlaybackParameters(new PlaybackParameters((float) (speed100X / 100.0)));
}
private void requestPermissionAndDownload() { private void requestPermissionAndDownload() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) {
if (ContextCompat.checkSelfPermission(this, if (ContextCompat.checkSelfPermission(this,
@ -712,5 +738,6 @@ public class ViewVideoActivity extends AppCompatActivity {
outState.putString(SUBREDDIT_NAME_STATE, subredditName); outState.putString(SUBREDDIT_NAME_STATE, subredditName);
outState.putString(ID_STATE, id); outState.putString(ID_STATE, id);
} }
outState.putInt(PLAYBACK_SPEED_STATE, playbackSpeed);
} }
} }

View File

@ -0,0 +1,126 @@
package ml.docilealligator.infinityforreddit.bottomsheetfragments;
import android.content.Context;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import androidx.annotation.NonNull;
import butterknife.BindView;
import butterknife.ButterKnife;
import ml.docilealligator.infinityforreddit.R;
import ml.docilealligator.infinityforreddit.activities.ViewVideoActivity;
import ml.docilealligator.infinityforreddit.customviews.LandscapeExpandedRoundedBottomSheetDialogFragment;
public class PlaybackSpeedBottomSheetFragment extends LandscapeExpandedRoundedBottomSheetDialogFragment {
public static final String EXTRA_PLAYBACK_SPEED = "EPS";
@BindView(R.id.playback_speed_025_text_view_playback_speed_bottom_sheet_fragment)
TextView playbackSpeed025TextView;
@BindView(R.id.playback_speed_050_text_view_playback_speed_bottom_sheet_fragment)
TextView playbackSpeed050TextView;
@BindView(R.id.playback_speed_075_text_view_playback_speed_bottom_sheet_fragment)
TextView playbackSpeed075TextView;
@BindView(R.id.playback_speed_normal_text_view_playback_speed_bottom_sheet_fragment)
TextView playbackSpeedNormalTextView;
@BindView(R.id.playback_speed_125_text_view_playback_speed_bottom_sheet_fragment)
TextView playbackSpeed125TextView;
@BindView(R.id.playback_speed_150_text_view_playback_speed_bottom_sheet_fragment)
TextView playbackSpeed150TextView;
@BindView(R.id.playback_speed_175_text_view_playback_speed_bottom_sheet_fragment)
TextView playbackSpeed175TextView;
@BindView(R.id.playback_speed_200_text_view_playback_speed_bottom_sheet_fragment)
TextView playbackSpeed200TextView;
private ViewVideoActivity viewVideoActivity;
public PlaybackSpeedBottomSheetFragment() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View rootView = inflater.inflate(R.layout.fragment_playback_speed, container, false);
ButterKnife.bind(this, rootView);
int playbackSpeed = getArguments().getInt(EXTRA_PLAYBACK_SPEED, ViewVideoActivity.PLAYBACK_SPEED_NORMAL);
switch (playbackSpeed) {
case ViewVideoActivity.PLAYBACK_SPEED_25:
playbackSpeed025TextView.setCompoundDrawablesWithIntrinsicBounds(0, 0, R.drawable.ic_playback_speed_24dp, 0);
break;
case ViewVideoActivity.PLAYBACK_SPEED_50:
playbackSpeed050TextView.setCompoundDrawablesWithIntrinsicBounds(0, 0, R.drawable.ic_playback_speed_24dp, 0);
break;
case ViewVideoActivity.PLAYBACK_SPEED_75:
playbackSpeed075TextView.setCompoundDrawablesWithIntrinsicBounds(0, 0, R.drawable.ic_playback_speed_24dp, 0);
break;
case ViewVideoActivity.PLAYBACK_SPEED_NORMAL:
playbackSpeedNormalTextView.setCompoundDrawablesWithIntrinsicBounds(0, 0, R.drawable.ic_playback_speed_24dp, 0);
break;
case ViewVideoActivity.PLAYBACK_SPEED_125:
playbackSpeed125TextView.setCompoundDrawablesWithIntrinsicBounds(0, 0, R.drawable.ic_playback_speed_24dp, 0);
break;
case ViewVideoActivity.PLAYBACK_SPEED_150:
playbackSpeed150TextView.setCompoundDrawablesWithIntrinsicBounds(0, 0, R.drawable.ic_playback_speed_24dp, 0);
break;
case ViewVideoActivity.PLAYBACK_SPEED_175:
playbackSpeed175TextView.setCompoundDrawablesWithIntrinsicBounds(0, 0, R.drawable.ic_playback_speed_24dp, 0);
break;
case ViewVideoActivity.PLAYBACK_SPEED_200:
playbackSpeed200TextView.setCompoundDrawablesWithIntrinsicBounds(0, 0, R.drawable.ic_playback_speed_24dp, 0);
break;
}
playbackSpeed025TextView.setOnClickListener(view -> {
viewVideoActivity.setPlaybackSpeed(ViewVideoActivity.PLAYBACK_SPEED_25);
dismiss();
});
playbackSpeed050TextView.setOnClickListener(view -> {
viewVideoActivity.setPlaybackSpeed(ViewVideoActivity.PLAYBACK_SPEED_50);
dismiss();
});
playbackSpeed075TextView.setOnClickListener(view -> {
viewVideoActivity.setPlaybackSpeed(ViewVideoActivity.PLAYBACK_SPEED_75);
dismiss();
});
playbackSpeedNormalTextView.setOnClickListener(view -> {
viewVideoActivity.setPlaybackSpeed(ViewVideoActivity.PLAYBACK_SPEED_NORMAL);
dismiss();
});
playbackSpeed125TextView.setOnClickListener(view -> {
viewVideoActivity.setPlaybackSpeed(ViewVideoActivity.PLAYBACK_SPEED_125);
dismiss();
});
playbackSpeed150TextView.setOnClickListener(view -> {
viewVideoActivity.setPlaybackSpeed(ViewVideoActivity.PLAYBACK_SPEED_150);
dismiss();
});
playbackSpeed175TextView.setOnClickListener(view -> {
viewVideoActivity.setPlaybackSpeed(ViewVideoActivity.PLAYBACK_SPEED_175);
dismiss();
});
playbackSpeed200TextView.setOnClickListener(view -> {
viewVideoActivity.setPlaybackSpeed(ViewVideoActivity.PLAYBACK_SPEED_200);
dismiss();
});
return rootView;
}
@Override
public void onAttach(@NonNull Context context) {
super.onAttach(context);
viewVideoActivity = (ViewVideoActivity) context;
}
}

View File

@ -0,0 +1,6 @@
<vector android:height="24dp"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@android:color/white" android:pathData="M20.38,8.57l-1.23,1.85a8,8 0,0 1,-0.22 7.58H5.07A8,8 0,0 1,15.58 6.85l1.85,-1.23A10,10 0,0 0,3.35 19a2,2 0,0 0,1.72 1h13.85a2,2 0,0 0,1.74 -1,10 10,0 0,0 -0.27,-10.44z"/>
<path android:fillColor="@android:color/white" android:pathData="M10.59,15.41a2,2 0,0 0,2.83 0l5.66,-8.49 -8.49,5.66a2,2 0,0 0,0 2.83z"/>
</vector>

View File

@ -0,0 +1,6 @@
<vector android:height="24dp"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@android:color/black" android:pathData="M20.38,8.57l-1.23,1.85a8,8 0,0 1,-0.22 7.58H5.07A8,8 0,0 1,15.58 6.85l1.85,-1.23A10,10 0,0 0,3.35 19a2,2 0,0 0,1.72 1h13.85a2,2 0,0 0,1.74 -1,10 10,0 0,0 -0.27,-10.44z"/>
<path android:fillColor="@android:color/black" android:pathData="M10.59,15.41a2,2 0,0 0,2.83 0l5.66,-8.49 -8.49,5.66a2,2 0,0 0,0 2.83z"/>
</vector>

View File

@ -0,0 +1,6 @@
<vector android:height="24dp" android:tint="#FFFFFF"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@android:color/white" android:pathData="M20.38,8.57l-1.23,1.85a8,8 0,0 1,-0.22 7.58H5.07A8,8 0,0 1,15.58 6.85l1.85,-1.23A10,10 0,0 0,3.35 19a2,2 0,0 0,1.72 1h13.85a2,2 0,0 0,1.74 -1,10 10,0 0,0 -0.27,-10.44z"/>
<path android:fillColor="@android:color/white" android:pathData="M10.59,15.41a2,2 0,0 0,2.83 0l5.66,-8.49 -8.49,5.66a2,2 0,0 0,0 2.83z"/>
</vector>

View File

@ -0,0 +1,151 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.core.widget.NestedScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingBottom="8dp"
android:overScrollMode="never">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:id="@+id/playback_speed_025_text_view_playback_speed_bottom_sheet_fragment"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:paddingTop="16dp"
android:paddingBottom="16dp"
android:paddingStart="32dp"
android:paddingEnd="32dp"
android:text="0.25x"
android:textColor="?attr/primaryTextColor"
android:textSize="?attr/font_default"
android:fontFamily="?attr/font_family"
android:clickable="true"
android:focusable="true"
android:background="?attr/selectableItemBackground" />
<TextView
android:id="@+id/playback_speed_050_text_view_playback_speed_bottom_sheet_fragment"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:paddingTop="16dp"
android:paddingBottom="16dp"
android:paddingStart="32dp"
android:paddingEnd="32dp"
android:text="0.5x"
android:textColor="?attr/primaryTextColor"
android:textSize="?attr/font_default"
android:fontFamily="?attr/font_family"
android:clickable="true"
android:focusable="true"
android:background="?attr/selectableItemBackground" />
<TextView
android:id="@+id/playback_speed_075_text_view_playback_speed_bottom_sheet_fragment"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:paddingTop="16dp"
android:paddingBottom="16dp"
android:paddingStart="32dp"
android:paddingEnd="32dp"
android:text="0.75x"
android:textColor="?attr/primaryTextColor"
android:textSize="?attr/font_default"
android:fontFamily="?attr/font_family"
android:clickable="true"
android:focusable="true"
android:background="?attr/selectableItemBackground" />
<TextView
android:id="@+id/playback_speed_normal_text_view_playback_speed_bottom_sheet_fragment"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:paddingTop="16dp"
android:paddingBottom="16dp"
android:paddingStart="32dp"
android:paddingEnd="32dp"
android:text="@string/normal"
android:textColor="?attr/primaryTextColor"
android:textSize="?attr/font_default"
android:fontFamily="?attr/font_family"
android:clickable="true"
android:focusable="true"
android:background="?attr/selectableItemBackground" />
<TextView
android:id="@+id/playback_speed_125_text_view_playback_speed_bottom_sheet_fragment"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:paddingTop="16dp"
android:paddingBottom="16dp"
android:paddingStart="32dp"
android:paddingEnd="32dp"
android:text="1.25x"
android:textColor="?attr/primaryTextColor"
android:textSize="?attr/font_default"
android:fontFamily="?attr/font_family"
android:clickable="true"
android:focusable="true"
android:background="?attr/selectableItemBackground" />
<TextView
android:id="@+id/playback_speed_150_text_view_playback_speed_bottom_sheet_fragment"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:paddingTop="16dp"
android:paddingBottom="16dp"
android:paddingStart="32dp"
android:paddingEnd="32dp"
android:text="1.5x"
android:textColor="?attr/primaryTextColor"
android:textSize="?attr/font_default"
android:fontFamily="?attr/font_family"
android:clickable="true"
android:focusable="true"
android:background="?attr/selectableItemBackground" />
<TextView
android:id="@+id/playback_speed_175_text_view_playback_speed_bottom_sheet_fragment"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:paddingTop="16dp"
android:paddingBottom="16dp"
android:paddingStart="32dp"
android:paddingEnd="32dp"
android:text="1.75x"
android:textColor="?attr/primaryTextColor"
android:textSize="?attr/font_default"
android:fontFamily="?attr/font_family"
android:clickable="true"
android:focusable="true"
android:background="?attr/selectableItemBackground" />
<TextView
android:id="@+id/playback_speed_200_text_view_playback_speed_bottom_sheet_fragment"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:paddingTop="16dp"
android:paddingBottom="16dp"
android:paddingStart="32dp"
android:paddingEnd="32dp"
android:text="2x"
android:textColor="?attr/primaryTextColor"
android:textSize="?attr/font_default"
android:fontFamily="?attr/font_family"
android:clickable="true"
android:focusable="true"
android:background="?attr/selectableItemBackground" />
</LinearLayout>
</androidx.core.widget.NestedScrollView>

View File

@ -7,4 +7,11 @@
android:title="@string/action_download" android:title="@string/action_download"
android:icon="@drawable/ic_file_download_toolbar_white_24dp" android:icon="@drawable/ic_file_download_toolbar_white_24dp"
app:showAsAction="ifRoom" /> app:showAsAction="ifRoom" />
<item
android:id="@+id/action_playback_speed_view_video_activity"
android:orderInCategory="2"
android:title="@string/action_playback_speed"
android:icon="@drawable/ic_playback_speed_toolbar_24dp"
app:showAsAction="ifRoom" />
</menu> </menu>

View File

@ -90,6 +90,7 @@
<string name="action_share_rpan_link">Share RPAN Link</string> <string name="action_share_rpan_link">Share RPAN Link</string>
<string name="action_share_post_link">Share Post Link</string> <string name="action_share_post_link">Share Post Link</string>
<string name="action_go_to_wiki">Go to Wiki</string> <string name="action_go_to_wiki">Go to Wiki</string>
<string name="action_playback_speed">Playback Speed</string>
<string name="parse_json_response_error">Error occurred when parsing the JSON response</string> <string name="parse_json_response_error">Error occurred when parsing the JSON response</string>
<string name="retrieve_token_error">Error Retrieving the token</string> <string name="retrieve_token_error">Error Retrieving the token</string>