Merge pull request #1165 from mfietz/issue/1123-playback-speed
Choose playback speed directly
This commit is contained in:
commit
1ac58a34eb
app
@ -11,6 +11,7 @@ dependencies {
|
||||
compile 'com.android.support:support-v4:22.2.1'
|
||||
compile 'com.android.support:appcompat-v7:22.2.1'
|
||||
compile 'com.android.support:gridlayout-v7:22.2.1'
|
||||
compile 'com.android.support:cardview-v7:22.2.1'
|
||||
compile 'org.apache.commons:commons-lang3:3.3.2'
|
||||
compile('org.shredzone.flattr4j:flattr4j-core:2.12') {
|
||||
exclude group: 'org.json', module: 'json'
|
||||
@ -24,7 +25,7 @@ dependencies {
|
||||
compile 'de.greenrobot:eventbus:2.4.0'
|
||||
compile 'io.reactivex:rxandroid:1.0.1'
|
||||
compile 'com.joanzapata.iconify:android-iconify-fontawesome:2.0.3'
|
||||
|
||||
|
||||
compile project(':core')
|
||||
compile project(':library:drag-sort-listview')
|
||||
}
|
||||
|
@ -5,6 +5,7 @@ import android.content.Intent;
|
||||
import android.content.SharedPreferences;
|
||||
import android.content.res.Configuration;
|
||||
import android.content.res.TypedArray;
|
||||
import android.graphics.drawable.BitmapDrawable;
|
||||
import android.os.AsyncTask;
|
||||
import android.os.Bundle;
|
||||
import android.support.v4.app.Fragment;
|
||||
@ -15,21 +16,26 @@ import android.support.v7.app.ActionBarDrawerToggle;
|
||||
import android.support.v7.widget.Toolbar;
|
||||
import android.util.Log;
|
||||
import android.view.ContextMenu;
|
||||
import android.view.Gravity;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.MenuInflater;
|
||||
import android.view.MenuItem;
|
||||
import android.view.View;
|
||||
import android.view.View.OnClickListener;
|
||||
import android.view.View.OnLongClickListener;
|
||||
import android.view.ViewGroup;
|
||||
import android.view.animation.LinearInterpolator;
|
||||
import android.view.animation.ScaleAnimation;
|
||||
import android.widget.AdapterView;
|
||||
import android.widget.ArrayAdapter;
|
||||
import android.widget.Button;
|
||||
import android.widget.ImageButton;
|
||||
import android.widget.ListView;
|
||||
import android.widget.PopupWindow;
|
||||
import android.widget.SeekBar;
|
||||
import android.widget.TextView;
|
||||
|
||||
import com.bumptech.glide.Glide;
|
||||
import com.bumptech.glide.load.engine.DiskCacheStrategy;
|
||||
|
||||
import org.apache.commons.lang3.ArrayUtils;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
|
||||
import de.danoeh.antennapod.R;
|
||||
@ -50,7 +56,6 @@ import de.danoeh.antennapod.core.storage.DBWriter;
|
||||
import de.danoeh.antennapod.core.util.playback.ExternalMedia;
|
||||
import de.danoeh.antennapod.core.util.playback.Playable;
|
||||
import de.danoeh.antennapod.core.util.playback.PlaybackController;
|
||||
import de.danoeh.antennapod.dialog.VariableSpeedDialog;
|
||||
import de.danoeh.antennapod.fragment.CoverFragment;
|
||||
import de.danoeh.antennapod.fragment.ItemDescriptionFragment;
|
||||
import de.danoeh.antennapod.menuhandler.NavDrawerActivity;
|
||||
@ -61,6 +66,7 @@ import de.danoeh.antennapod.preferences.PreferenceController;
|
||||
*/
|
||||
public class AudioplayerActivity extends MediaplayerActivity implements ItemDescriptionFragment.ItemDescriptionFragmentCallback,
|
||||
NavDrawerActivity {
|
||||
|
||||
private static final int POS_COVER = 0;
|
||||
private static final int POS_DESCR = 1;
|
||||
private static final int POS_CHAPTERS = 2;
|
||||
@ -98,6 +104,8 @@ public class AudioplayerActivity extends MediaplayerActivity implements ItemDesc
|
||||
private ImageButton butNavChaptersShownotes;
|
||||
private ImageButton butShowCover;
|
||||
|
||||
private PopupWindow popupWindow;
|
||||
|
||||
private void resetFragmentView() {
|
||||
FragmentTransaction fT = getSupportFragmentManager().beginTransaction();
|
||||
|
||||
@ -325,14 +333,11 @@ public class AudioplayerActivity extends MediaplayerActivity implements ItemDesc
|
||||
};
|
||||
chapterFragment.setListAdapter(new ChapterListAdapter(
|
||||
AudioplayerActivity.this, 0, media
|
||||
.getChapters(), media, new ChapterListAdapter.Callback() {
|
||||
@Override
|
||||
public void onPlayChapterButtonClicked(int position) {
|
||||
Chapter chapter = (Chapter)
|
||||
chapterFragment.getListAdapter().getItem(position);
|
||||
controller.seekToChapter(chapter);
|
||||
}
|
||||
}
|
||||
.getChapters(), media, position -> {
|
||||
Chapter chapter = (Chapter)
|
||||
chapterFragment.getListAdapter().getItem(position);
|
||||
controller.seekToChapter(chapter);
|
||||
}
|
||||
));
|
||||
}
|
||||
currentlyShownFragment = chapterFragment;
|
||||
@ -426,91 +431,117 @@ public class AudioplayerActivity extends MediaplayerActivity implements ItemDesc
|
||||
|
||||
navAdapter = new NavListAdapter(itemAccess, this);
|
||||
navList.setAdapter(navAdapter);
|
||||
navList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
|
||||
@Override
|
||||
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
|
||||
int viewType = parent.getAdapter().getItemViewType(position);
|
||||
if (viewType != NavListAdapter.VIEW_TYPE_SECTION_DIVIDER) {
|
||||
Intent intent = new Intent(AudioplayerActivity.this, MainActivity.class);
|
||||
intent.putExtra(MainActivity.EXTRA_NAV_TYPE, viewType);
|
||||
intent.putExtra(MainActivity.EXTRA_NAV_INDEX, position);
|
||||
startActivity(intent);
|
||||
}
|
||||
drawerLayout.closeDrawer(navDrawer);
|
||||
navList.setOnItemClickListener((parent, view, position, id) -> {
|
||||
int viewType = parent.getAdapter().getItemViewType(position);
|
||||
if (viewType != NavListAdapter.VIEW_TYPE_SECTION_DIVIDER) {
|
||||
Intent intent = new Intent(AudioplayerActivity.this, MainActivity.class);
|
||||
intent.putExtra(MainActivity.EXTRA_NAV_TYPE, viewType);
|
||||
intent.putExtra(MainActivity.EXTRA_NAV_INDEX, position);
|
||||
startActivity(intent);
|
||||
}
|
||||
drawerLayout.closeDrawer(navDrawer);
|
||||
});
|
||||
registerForContextMenu(navList);
|
||||
drawerToggle.syncState();
|
||||
|
||||
findViewById(R.id.nav_settings).setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
drawerLayout.closeDrawer(navDrawer);
|
||||
startActivity(new Intent(AudioplayerActivity.this, PreferenceController.getPreferenceActivity()));
|
||||
findViewById(R.id.nav_settings).setOnClickListener(v -> {
|
||||
drawerLayout.closeDrawer(navDrawer);
|
||||
startActivity(new Intent(AudioplayerActivity.this, PreferenceController.getPreferenceActivity()));
|
||||
});
|
||||
|
||||
butNavChaptersShownotes.setOnClickListener(v -> {
|
||||
if (currentlyShownPosition == POS_CHAPTERS) {
|
||||
switchToFragment(POS_DESCR);
|
||||
} else if (currentlyShownPosition == POS_DESCR) {
|
||||
switchToFragment(POS_CHAPTERS);
|
||||
} else if (currentlyShownPosition == POS_COVER) {
|
||||
switchToLastFragment();
|
||||
}
|
||||
});
|
||||
|
||||
butNavChaptersShownotes.setOnClickListener(new OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
if (currentlyShownPosition == POS_CHAPTERS) {
|
||||
switchToFragment(POS_DESCR);
|
||||
} else if (currentlyShownPosition == POS_DESCR) {
|
||||
switchToFragment(POS_CHAPTERS);
|
||||
} else if (currentlyShownPosition == POS_COVER) {
|
||||
switchToLastFragment();
|
||||
butShowCover.setOnClickListener(v -> switchToFragment(POS_COVER));
|
||||
|
||||
butPlaybackSpeed.setOnClickListener(v -> {
|
||||
if (controller != null && controller.canSetPlaybackSpeed()) {
|
||||
String[] availableSpeeds = UserPreferences
|
||||
.getPlaybackSpeedArray();
|
||||
String currentSpeed = UserPreferences.getPlaybackSpeed();
|
||||
|
||||
// Provide initial value in case the speed list has changed
|
||||
// out from under us
|
||||
// and our current speed isn't in the new list
|
||||
String newSpeed;
|
||||
if (availableSpeeds.length > 0) {
|
||||
newSpeed = availableSpeeds[0];
|
||||
} else {
|
||||
newSpeed = "1.0";
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
butShowCover.setOnClickListener(new OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
switchToFragment(POS_COVER);
|
||||
}
|
||||
});
|
||||
|
||||
butPlaybackSpeed.setOnClickListener(new OnClickListener() {
|
||||
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
if (controller != null && controller.canSetPlaybackSpeed()) {
|
||||
String[] availableSpeeds = UserPreferences
|
||||
.getPlaybackSpeedArray();
|
||||
String currentSpeed = UserPreferences.getPlaybackSpeed();
|
||||
|
||||
// Provide initial value in case the speed list has changed
|
||||
// out from under us
|
||||
// and our current speed isn't in the new list
|
||||
String newSpeed;
|
||||
if (availableSpeeds.length > 0) {
|
||||
newSpeed = availableSpeeds[0];
|
||||
} else {
|
||||
newSpeed = "1.0";
|
||||
}
|
||||
|
||||
for (int i = 0; i < availableSpeeds.length; i++) {
|
||||
if (availableSpeeds[i].equals(currentSpeed)) {
|
||||
if (i == availableSpeeds.length - 1) {
|
||||
newSpeed = availableSpeeds[0];
|
||||
} else {
|
||||
newSpeed = availableSpeeds[i + 1];
|
||||
}
|
||||
break;
|
||||
for (int i = 0; i < availableSpeeds.length; i++) {
|
||||
if (availableSpeeds[i].equals(currentSpeed)) {
|
||||
if (i == availableSpeeds.length - 1) {
|
||||
newSpeed = availableSpeeds[0];
|
||||
} else {
|
||||
newSpeed = availableSpeeds[i + 1];
|
||||
}
|
||||
break;
|
||||
}
|
||||
UserPreferences.setPlaybackSpeed(newSpeed);
|
||||
controller.setPlaybackSpeed(Float.parseFloat(newSpeed));
|
||||
}
|
||||
UserPreferences.setPlaybackSpeed(newSpeed);
|
||||
controller.setPlaybackSpeed(Float.parseFloat(newSpeed));
|
||||
}
|
||||
});
|
||||
|
||||
butPlaybackSpeed.setOnLongClickListener(new OnLongClickListener() {
|
||||
@Override
|
||||
public boolean onLongClick(View v) {
|
||||
VariableSpeedDialog.showDialog(AudioplayerActivity.this);
|
||||
return true;
|
||||
}
|
||||
butPlaybackSpeed.setOnLongClickListener(v -> {
|
||||
|
||||
String[] availableSpeeds = getResources().getStringArray(R.array.playback_speed_values);
|
||||
String currentSpeed = UserPreferences.getPlaybackSpeed();
|
||||
|
||||
LayoutInflater inflater = getLayoutInflater();
|
||||
View popupView = inflater.inflate(R.layout.choose_speed_dialog, null);
|
||||
TextView txtvSelectedSpeed = (TextView) popupView.findViewById(R.id.txtvSelectedSpeed);
|
||||
SeekBar sbSelectSpeed = (SeekBar) popupView.findViewById(R.id.sbSelectSpeed);
|
||||
|
||||
txtvSelectedSpeed.setText(currentSpeed);
|
||||
int progress = ArrayUtils.indexOf(availableSpeeds, currentSpeed);
|
||||
int max = Math.max(progress, ArrayUtils.indexOf(availableSpeeds, "2.50"));
|
||||
sbSelectSpeed.setMax(max);
|
||||
sbSelectSpeed.setProgress(progress);
|
||||
sbSelectSpeed.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
|
||||
@Override
|
||||
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
|
||||
txtvSelectedSpeed.setText(availableSpeeds[progress]);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStartTrackingTouch(SeekBar seekBar) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStopTrackingTouch(SeekBar seekBar) {
|
||||
String selectedSpeed = availableSpeeds[sbSelectSpeed.getProgress()];
|
||||
UserPreferences.setPlaybackSpeed(selectedSpeed);
|
||||
controller.setPlaybackSpeed(Float.parseFloat(selectedSpeed));
|
||||
if (popupWindow != null && popupWindow.isShowing()) {
|
||||
popupWindow.dismiss();
|
||||
}
|
||||
ScaleAnimation anim = new ScaleAnimation(1.0f, 1.33f, 1.0f, 1.33f,
|
||||
butPlaybackSpeed.getWidth()/2, butPlaybackSpeed.getHeight()/2);
|
||||
anim.setDuration(150);
|
||||
anim.setRepeatMode(ScaleAnimation.REVERSE);
|
||||
anim.setRepeatCount(1);
|
||||
anim.setInterpolator(new LinearInterpolator());
|
||||
butPlaybackSpeed.startAnimation(anim);
|
||||
}
|
||||
});
|
||||
popupWindow = new PopupWindow(popupView,
|
||||
ViewGroup.LayoutParams.MATCH_PARENT,
|
||||
ViewGroup.LayoutParams.WRAP_CONTENT,
|
||||
true);
|
||||
popupWindow.setBackgroundDrawable(new BitmapDrawable());
|
||||
popupWindow.setOutsideTouchable(true);
|
||||
popupWindow.showAtLocation(popupView, Gravity.CENTER, 0, 0);
|
||||
return true;
|
||||
});
|
||||
}
|
||||
|
||||
@ -630,7 +661,7 @@ public class AudioplayerActivity extends MediaplayerActivity implements ItemDesc
|
||||
}
|
||||
|
||||
public interface AudioplayerContentFragment {
|
||||
public void onDataSetChanged(Playable media);
|
||||
void onDataSetChanged(Playable media);
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -793,4 +824,5 @@ public class AudioplayerActivity extends MediaplayerActivity implements ItemDesc
|
||||
return navDrawerData != null ? navDrawerData.feedCounters.get(feedId) : 0;
|
||||
}
|
||||
};
|
||||
|
||||
}
|
||||
|
@ -26,7 +26,6 @@
|
||||
android:paddingLeft="8dp"
|
||||
android:paddingRight="8dp">
|
||||
|
||||
|
||||
<TextView
|
||||
android:id="@+id/txtvTitle"
|
||||
android:layout_width="0dp"
|
||||
@ -138,7 +137,6 @@
|
||||
android:background="?attr/selectableItemBackground"
|
||||
android:contentDescription="@string/set_playback_speed_label"
|
||||
android:src="?attr/av_fast_forward"
|
||||
android:textColor="@color/gray"
|
||||
android:textSize="@dimen/text_size_medium"
|
||||
android:visibility="gone"
|
||||
tools:background="@android:color/holo_green_dark" />
|
||||
|
45
app/src/main/res/layout/choose_speed_dialog.xml
Normal file
45
app/src/main/res/layout/choose_speed_dialog.xml
Normal file
@ -0,0 +1,45 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<LinearLayout
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent">
|
||||
|
||||
<android.support.v7.widget.CardView
|
||||
xmlns:card_view="http://schemas.android.com/apk/res-auto"
|
||||
android:id="@+id/card_view"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center"
|
||||
android:layout_margin="16dp"
|
||||
card_view:cardElevation="12dp"
|
||||
card_view:cardCornerRadius="4dp"
|
||||
card_view:cardUseCompatPadding="true"
|
||||
card_view:cardBackgroundColor="?attr/overlay_background">
|
||||
|
||||
<LinearLayout
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:orientation="vertical"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center_vertical"
|
||||
android:gravity="center">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/txtvSelectedSpeed"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="8dp"
|
||||
android:textSize="22sp"
|
||||
android:textStyle="bold"/>
|
||||
|
||||
<SeekBar
|
||||
android:id="@+id/sbSelectSpeed"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginBottom="8dp"/>
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
</android.support.v7.widget.CardView>
|
||||
|
||||
</LinearLayout>
|
Loading…
x
Reference in New Issue
Block a user