Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/nextcloud/news-android.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'News-Android-App')
-rw-r--r--News-Android-App/src/extra/java/de/luhmer/owncloudnewsreader/services/podcast/YoutubePlaybackService.java5
-rw-r--r--News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/PodcastFragment.java128
-rw-r--r--News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/PodcastFragmentActivity.java5
-rw-r--r--News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/events/podcast/SpeedPodcast.java4
-rw-r--r--News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/services/PodcastPlaybackService.java18
-rw-r--r--News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/services/podcast/MediaPlayerPlaybackService.java12
-rw-r--r--News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/services/podcast/PlaybackService.java3
-rw-r--r--News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/services/podcast/TTSPlaybackService.java5
-rw-r--r--News-Android-App/src/main/res/drawable-hdpi/ic_slow_motion_video.pngbin0 -> 966 bytes
-rw-r--r--News-Android-App/src/main/res/drawable-mdpi/ic_slow_motion_video.pngbin0 -> 662 bytes
-rw-r--r--News-Android-App/src/main/res/drawable-xhdpi/ic_slow_motion_video.pngbin0 -> 1272 bytes
-rw-r--r--News-Android-App/src/main/res/drawable-xxhdpi/ic_slow_motion_video.pngbin0 -> 1912 bytes
-rw-r--r--News-Android-App/src/main/res/layout/fragment_podcast.xml32
-rw-r--r--News-Android-App/src/main/res/values/strings.xml2
14 files changed, 148 insertions, 66 deletions
diff --git a/News-Android-App/src/extra/java/de/luhmer/owncloudnewsreader/services/podcast/YoutubePlaybackService.java b/News-Android-App/src/extra/java/de/luhmer/owncloudnewsreader/services/podcast/YoutubePlaybackService.java
index 731b7af4..aba895cb 100644
--- a/News-Android-App/src/extra/java/de/luhmer/owncloudnewsreader/services/podcast/YoutubePlaybackService.java
+++ b/News-Android-App/src/extra/java/de/luhmer/owncloudnewsreader/services/podcast/YoutubePlaybackService.java
@@ -49,6 +49,11 @@ public class YoutubePlaybackService extends PlaybackService {
}
}
+ @Override
+ public void playbackSpeedChanged(float currentPlaybackSpeed) {
+
+ }
+
public void seekTo(double percent) {
if(youTubePlayer != null) {
double totalDuration = getTotalDuration();
diff --git a/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/PodcastFragment.java b/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/PodcastFragment.java
index 3953e08b..269a99cb 100644
--- a/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/PodcastFragment.java
+++ b/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/PodcastFragment.java
@@ -1,21 +1,24 @@
package de.luhmer.owncloudnewsreader;
import android.content.Context;
+import android.content.DialogInterface;
+import android.graphics.Paint;
import android.net.Uri;
import android.os.Bundle;
import android.support.v4.app.Fragment;
+import android.support.v7.app.AlertDialog;
import android.util.Log;
import android.view.ContextThemeWrapper;
-import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
-import android.widget.Button;
+import android.widget.EditText;
import android.widget.FrameLayout;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListView;
+import android.widget.NumberPicker;
import android.widget.ProgressBar;
import android.widget.RelativeLayout;
import android.widget.SeekBar;
@@ -31,21 +34,24 @@ import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
import java.io.File;
+import java.lang.reflect.Field;
+import java.util.Arrays;
import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;
import de.luhmer.owncloudnewsreader.ListView.PodcastArrayAdapter;
import de.luhmer.owncloudnewsreader.ListView.PodcastFeedArrayAdapter;
+import de.luhmer.owncloudnewsreader.events.podcast.SpeedPodcast;
import de.luhmer.owncloudnewsreader.events.podcast.StartDownloadPodcast;
import de.luhmer.owncloudnewsreader.events.podcast.TogglePlayerStateEvent;
import de.luhmer.owncloudnewsreader.events.podcast.UpdatePodcastStatusEvent;
import de.luhmer.owncloudnewsreader.events.podcast.WindPodcast;
-import de.luhmer.owncloudnewsreader.events.podcast.SpeedPodcast;
import de.luhmer.owncloudnewsreader.model.MediaItem;
import de.luhmer.owncloudnewsreader.model.PodcastFeedItem;
import de.luhmer.owncloudnewsreader.model.PodcastItem;
import de.luhmer.owncloudnewsreader.services.PodcastDownloadService;
+import de.luhmer.owncloudnewsreader.services.PodcastPlaybackService;
import de.luhmer.owncloudnewsreader.services.podcast.PlaybackService;
import de.luhmer.owncloudnewsreader.view.PodcastSlidingUpPanelLayout;
@@ -181,8 +187,6 @@ public class PodcastFragment extends Fragment {
tvTo.setText(String.format("%02d:%02d", minutes, seconds));
tvToSlider.setText(String.format("%02d:%02d", minutes, seconds));
- tvPlaybackSpeed.setText(String.format("%.02f", podcast.getSpeed()));
-
tvTitle.setText(podcast.getTitle());
tvTitleSlider.setText(podcast.getTitle());
@@ -225,6 +229,7 @@ public class PodcastFragment extends Fragment {
@BindView(R.id.btn_playPausePodcastSlider) ImageButton btnPlayPausePodcastSlider;
@BindView(R.id.btn_nextPodcastSlider) ImageButton btnNextPodcastSlider;
@BindView(R.id.btn_previousPodcastSlider) ImageButton btnPreviousPodcastSlider;
+ @BindView(R.id.btn_podcastSpeed) ImageButton btnPlaybackSpeed;
@BindView(R.id.img_feed_favicon) ImageView imgFavIcon;
@@ -241,9 +246,6 @@ public class PodcastFragment extends Fragment {
@BindView(R.id.pb_progress) ProgressBar pb_progress;
@BindView(R.id.pb_progress2) ProgressBar pb_progress2;
- @Bind(R.id.tv_playbackSpeed) TextView tvPlaybackSpeed;
- @Bind(R.id.buttonSpeedMinus) TextView btnSpeedMinus;
- @Bind(R.id.buttonSpeedPlus) TextView btnSpeedPlus;
@BindView(R.id.podcastFeedList) ListView /* CardGridView CardListView*/ podcastFeedList;
@BindView(R.id.rlPodcast) RelativeLayout rlPodcast;
@@ -281,16 +283,8 @@ public class PodcastFragment extends Fragment {
}});
}
- @OnClick(R.id.buttonSpeedMinus) void speedMinus() {
- eventBus.post(new SpeedPodcast() {{
- playbackSpeed = podcast.getSpeed() - 0.1f;
- }});
- }
-
- @OnClick(R.id.buttonSpeedPlus) void speedPlus() {
- eventBus.post(new SpeedPodcast() {{
- playbackSpeed = podcast.getSpeed() + 0.1f;
- }});
+ @OnClick(R.id.btn_podcastSpeed) void openSpeedMenu() {
+ showPlaybackSpeedPicker();
}
PodcastSlidingUpPanelLayout sliding_layout;
@@ -332,7 +326,6 @@ public class PodcastFragment extends Fragment {
podcastFeedList.setVisibility(View.VISIBLE);
sb_progress.setOnSeekBarChangeListener(onSeekBarChangeListener);
- tvPlaybackSpeed.setOnEditorActionListener(onEditorActionListener);
return view;
}
@@ -404,20 +397,6 @@ public class PodcastFragment extends Fragment {
}
};
- private TextView.OnEditorActionListener onEditorActionListener = new TextView.OnEditorActionListener() {
- @Override
- public boolean onEditorAction(final TextView textView, int i, KeyEvent keyEvent) {
- final float pbSpeed = Float.parseFloat(textView.getText().toString());
- if(hasTitleInCache) {
- eventBus.post(new SpeedPodcast() {{
- playbackSpeed = pbSpeed;
- }});
- }
- Log.v(TAG, "playback speed changed: "+pbSpeed);
- return true;
- }
- };
-
boolean blockSeekbarUpdate = false;
private SeekBar.OnSeekBarChangeListener onSeekBarChangeListener = new SeekBar.OnSeekBarChangeListener() {
@@ -444,4 +423,87 @@ public class PodcastFragment extends Fragment {
}
};
+
+ private void showPlaybackSpeedPicker() {
+ final NumberPicker numberPicker = new NumberPicker(getContext());
+ //setNumberPickerTextColor(numberPicker, Color.parseColor("#FFFFFF"));
+ numberPicker.setDescendantFocusability(NumberPicker.FOCUS_BLOCK_DESCENDANTS);
+ numberPicker.setMinValue(0);
+ numberPicker.setMaxValue(PodcastPlaybackService.PLAYBACK_SPEEDS.length-1);
+ numberPicker.setFormatter(new NumberPicker.Formatter() {
+ @Override
+ public String format(int i) {
+ return String.valueOf(PodcastPlaybackService.PLAYBACK_SPEEDS[i]);
+ }
+ });
+
+ if(getActivity() instanceof PodcastFragmentActivity) {
+ float playbackSpeed = ((PodcastFragmentActivity) getActivity()).getCurrentPlaybackSpeed();
+ int position = Arrays.binarySearch(PodcastPlaybackService.PLAYBACK_SPEEDS, playbackSpeed);
+ numberPicker.setValue(position);
+ } else {
+ numberPicker.setValue(3);
+ }
+ numberPicker.setWrapSelectorWheel(false);
+
+
+ AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(getActivity());
+
+ // set title
+ alertDialogBuilder.setTitle(getString(R.string.podcast_playback_speed_dialog_title));
+
+ // set dialog message
+ alertDialogBuilder
+ .setCancelable(false)
+ .setPositiveButton(getString(android.R.string.ok), new DialogInterface.OnClickListener() {
+ public void onClick(DialogInterface dialog, int id) {
+ float speed = PodcastPlaybackService.PLAYBACK_SPEEDS[numberPicker.getValue()];
+ //Toast.makeText(getActivity(), String.valueOf(speed]), Toast.LENGTH_SHORT).show();
+ eventBus.post(new SpeedPodcast(speed));
+ dialog.cancel();
+ }
+ })
+ .setNegativeButton(getString(android.R.string.cancel), new DialogInterface.OnClickListener() {
+ public void onClick(DialogInterface dialog, int id) {
+ dialog.cancel();
+ }
+ })
+ .setView(numberPicker);
+
+ // create alert dialog
+ AlertDialog alertDialog = alertDialogBuilder.create();
+
+ // show it
+ alertDialog.show();
+ }
+
+
+ public static boolean setNumberPickerTextColor(NumberPicker numberPicker, int color)
+ {
+ final int count = numberPicker.getChildCount();
+ for(int i = 0; i < count; i++){
+ View child = numberPicker.getChildAt(i);
+ if(child instanceof EditText){
+ try{
+ Field selectorWheelPaintField = numberPicker.getClass()
+ .getDeclaredField("mSelectorWheelPaint");
+ selectorWheelPaintField.setAccessible(true);
+ ((Paint)selectorWheelPaintField.get(numberPicker)).setColor(color);
+ ((EditText)child).setTextColor(color);
+ numberPicker.invalidate();
+ return true;
+ }
+ catch(NoSuchFieldException e){
+ Log.w("setNumberPickerTextCol", e);
+ }
+ catch(IllegalAccessException e){
+ Log.w("setNumberPickerTextCol", e);
+ }
+ catch(IllegalArgumentException e){
+ Log.w("setNumberPickerTextCol", e);
+ }
+ }
+ }
+ return false;
+ }
}
diff --git a/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/PodcastFragmentActivity.java b/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/PodcastFragmentActivity.java
index 96e5de3e..af9a9910 100644
--- a/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/PodcastFragmentActivity.java
+++ b/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/PodcastFragmentActivity.java
@@ -613,4 +613,9 @@ public class PodcastFragmentActivity extends AppCompatActivity implements IPlayP
public void pausePodcast() {
mPodcastPlaybackService.pause();
}
+
+ public float getCurrentPlaybackSpeed() {
+ return mPodcastPlaybackService.getPlaybackSpeed();
+ }
+
}
diff --git a/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/events/podcast/SpeedPodcast.java b/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/events/podcast/SpeedPodcast.java
index 0cd4ac52..c32e970c 100644
--- a/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/events/podcast/SpeedPodcast.java
+++ b/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/events/podcast/SpeedPodcast.java
@@ -3,6 +3,10 @@ package de.luhmer.owncloudnewsreader.events.podcast;
public class SpeedPodcast {
+ public SpeedPodcast(float playbackSpeed) {
+ this.playbackSpeed = playbackSpeed;
+ }
+
public float playbackSpeed;
}
diff --git a/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/services/PodcastPlaybackService.java b/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/services/PodcastPlaybackService.java
index 0cd9a9dd..f0c0a2a0 100644
--- a/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/services/PodcastPlaybackService.java
+++ b/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/services/PodcastPlaybackService.java
@@ -16,9 +16,9 @@ import de.luhmer.owncloudnewsreader.events.podcast.NewPodcastPlaybackListener;
import de.luhmer.owncloudnewsreader.events.podcast.PodcastCompletedEvent;
import de.luhmer.owncloudnewsreader.events.podcast.RegisterVideoOutput;
import de.luhmer.owncloudnewsreader.events.podcast.RegisterYoutubeOutput;
+import de.luhmer.owncloudnewsreader.events.podcast.SpeedPodcast;
import de.luhmer.owncloudnewsreader.events.podcast.TogglePlayerStateEvent;
import de.luhmer.owncloudnewsreader.events.podcast.UpdatePodcastStatusEvent;
-import de.luhmer.owncloudnewsreader.events.podcast.SpeedPodcast;
import de.luhmer.owncloudnewsreader.events.podcast.WindPodcast;
import de.luhmer.owncloudnewsreader.model.MediaItem;
import de.luhmer.owncloudnewsreader.model.PodcastItem;
@@ -85,6 +85,9 @@ public class PodcastPlaybackService extends Service {
private PlaybackService mPlaybackService;
+ public static final float PLAYBACK_SPEEDS[] = { 0.25f, 0.5f, 0.75f, 1.0f, 1.25f, 1.5f, 1.75f, 2.0f, 2.5f, 3.0f };
+ private float currentPlaybackSpeed = 1;
+
@Override
public void onCreate() {
@@ -143,6 +146,8 @@ public class PodcastPlaybackService extends Service {
podcastNotification.podcastChanged();
sendMediaStatus();
+
+ mPlaybackService.playbackSpeedChanged(currentPlaybackSpeed);
}
return Service.START_STICKY;
@@ -235,8 +240,10 @@ public class PodcastPlaybackService extends Service {
@Subscribe
public void onEvent(SpeedPodcast event) {
+ this.currentPlaybackSpeed = event.playbackSpeed;
+
if(mPlaybackService != null) {
- mPlaybackService.setPlaybackSpeed(event.playbackSpeed);
+ mPlaybackService.playbackSpeedChanged(currentPlaybackSpeed);
}
}
@@ -258,6 +265,11 @@ public class PodcastPlaybackService extends Service {
sendMediaStatus();
}
+
+ public float getPlaybackSpeed() {
+ return currentPlaybackSpeed;
+ }
+
public void sendMediaStatus() {
UpdatePodcastStatusEvent audioPodcastEvent;
@@ -271,7 +283,7 @@ public class PodcastPlaybackService extends Service {
mPlaybackService.getMediaItem().title,
mPlaybackService.getVideoType(),
mPlaybackService.getMediaItem().itemId,
- mPlaybackService.getPlaybackSpeed());
+ getPlaybackSpeed());
}
eventBus.post(audioPodcastEvent);
}
diff --git a/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/services/podcast/MediaPlayerPlaybackService.java b/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/services/podcast/MediaPlayerPlaybackService.java
index b4368c05..dab25833 100644
--- a/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/services/podcast/MediaPlayerPlaybackService.java
+++ b/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/services/podcast/MediaPlayerPlaybackService.java
@@ -2,7 +2,7 @@ package de.luhmer.owncloudnewsreader.services.podcast;
import android.content.Context;
import android.media.MediaPlayer;
-import android.media.PlaybackParams;
+import android.os.Build;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
@@ -97,14 +97,12 @@ public class MediaPlayerPlaybackService extends PlaybackService {
}
@Override
- public void setPlaybackSpeed(float speed) {
- mMediaPlayer.setPlaybackParams(mMediaPlayer.getPlaybackParams().setSpeed(speed));
+ public void playbackSpeedChanged(float currentPlaybackSpeed) {
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
+ mMediaPlayer.setPlaybackParams(mMediaPlayer.getPlaybackParams().setSpeed(currentPlaybackSpeed));
+ }
}
- @Override
- public float getPlaybackSpeed() {
- return mMediaPlayer.getPlaybackParams().getSpeed();
- }
@Override
public void seekTo(double percent) {
diff --git a/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/services/podcast/PlaybackService.java b/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/services/podcast/PlaybackService.java
index cb9d5ff4..e0995454 100644
--- a/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/services/podcast/PlaybackService.java
+++ b/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/services/podcast/PlaybackService.java
@@ -30,9 +30,8 @@ public abstract class PlaybackService {
public abstract void destroy();
public abstract void play();
public abstract void pause();
+ public abstract void playbackSpeedChanged(float currentPlaybackSpeed);
- public void setPlaybackSpeed(float speed) { }
- public float getPlaybackSpeed() {return 0; }
public void seekTo(double percent) { }
public int getCurrentDuration() { return 0; }
diff --git a/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/services/podcast/TTSPlaybackService.java b/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/services/podcast/TTSPlaybackService.java
index 430109f6..658baf8e 100644
--- a/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/services/podcast/TTSPlaybackService.java
+++ b/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/services/podcast/TTSPlaybackService.java
@@ -64,6 +64,11 @@ public class TTSPlaybackService extends PlaybackService implements TextToSpeech.
}
@Override
+ public void playbackSpeedChanged(float currentPlaybackSpeed) {
+ ttsController.setSpeechRate(currentPlaybackSpeed);
+ }
+
+ @Override
public void onInit(int status) {
if (status == TextToSpeech.SUCCESS) {
/*
diff --git a/News-Android-App/src/main/res/drawable-hdpi/ic_slow_motion_video.png b/News-Android-App/src/main/res/drawable-hdpi/ic_slow_motion_video.png
new file mode 100644
index 00000000..9fda0a8c
--- /dev/null
+++ b/News-Android-App/src/main/res/drawable-hdpi/ic_slow_motion_video.png
Binary files differ
diff --git a/News-Android-App/src/main/res/drawable-mdpi/ic_slow_motion_video.png b/News-Android-App/src/main/res/drawable-mdpi/ic_slow_motion_video.png
new file mode 100644
index 00000000..0edc705c
--- /dev/null
+++ b/News-Android-App/src/main/res/drawable-mdpi/ic_slow_motion_video.png
Binary files differ
diff --git a/News-Android-App/src/main/res/drawable-xhdpi/ic_slow_motion_video.png b/News-Android-App/src/main/res/drawable-xhdpi/ic_slow_motion_video.png
new file mode 100644
index 00000000..2753e19b
--- /dev/null
+++ b/News-Android-App/src/main/res/drawable-xhdpi/ic_slow_motion_video.png
Binary files differ
diff --git a/News-Android-App/src/main/res/drawable-xxhdpi/ic_slow_motion_video.png b/News-Android-App/src/main/res/drawable-xxhdpi/ic_slow_motion_video.png
new file mode 100644
index 00000000..1c40dfc2
--- /dev/null
+++ b/News-Android-App/src/main/res/drawable-xxhdpi/ic_slow_motion_video.png
Binary files differ
diff --git a/News-Android-App/src/main/res/layout/fragment_podcast.xml b/News-Android-App/src/main/res/layout/fragment_podcast.xml
index ba54b897..1b7f1b4d 100644
--- a/News-Android-App/src/main/res/layout/fragment_podcast.xml
+++ b/News-Android-App/src/main/res/layout/fragment_podcast.xml
@@ -341,27 +341,17 @@
android:scaleType="fitXY"
android:contentDescription="@string/content_desc_forward"/>
- <Button
- android:id="@+id/buttonSpeedMinus"
- android:layout_width="43dp"
- android:layout_height="wrap_content"
- android:text="-" />
-
- <EditText
- android:id="@+id/tv_playbackSpeed"
- android:layout_width="71dp"
- android:layout_height="wrap_content"
- android:ems="10"
- android:inputType="numberDecimal"
- android:selectAllOnFocus="true"
- android:visibility="visible"
- android:focusable="false"/>
-
- <Button
- android:id="@+id/buttonSpeedPlus"
- android:layout_width="42dp"
- android:layout_height="wrap_content"
- android:text="+" />
+ <ImageButton
+ android:id="@+id/btn_podcastSpeed"
+ android:layout_width="40dp"
+ android:layout_height="40dp"
+ android:layout_gravity="center"
+ android:src="@drawable/ic_slow_motion_video"
+ android:tint="@color/tintColorLight"
+ android:background="?attr/selectableItemBackgroundBorderless"
+ android:scaleType="fitXY"
+ android:layout_marginLeft="36dp"
+ android:contentDescription="@string/content_desc_playback_speed"/>
</LinearLayout>
diff --git a/News-Android-App/src/main/res/values/strings.xml b/News-Android-App/src/main/res/values/strings.xml
index 4cb0bd77..55b29314 100644
--- a/News-Android-App/src/main/res/values/strings.xml
+++ b/News-Android-App/src/main/res/values/strings.xml
@@ -153,6 +153,7 @@
<!-- Podcast -->
<string name="no_podcast_selected">No podcast selected</string>
<string name="no_chapters_available">No chapters available</string>
+ <string name="podcast_playback_speed_dialog_title">Playback Speed</string>
<!-- Settings for Display -->
@@ -270,6 +271,7 @@
<string name="content_desc_none" translatable="false">@null</string>
<string name="content_desc_play">play</string>
<string name="content_desc_pause">pause</string>
+ <string name="content_desc_playback_speed">playback speed</string>
<string name="content_desc_rewind">rewind</string>
<string name="content_desc_forward">forward</string>
<string name="content_desc_expand">expand</string>