2017-10-28 19:08:01 +02:00
|
|
|
package org.schabi.newpipe.player.helper;
|
2017-10-27 04:59:25 +02:00
|
|
|
|
|
|
|
import android.content.Context;
|
|
|
|
import android.content.SharedPreferences;
|
|
|
|
import android.preference.PreferenceManager;
|
|
|
|
import android.support.annotation.NonNull;
|
2018-02-03 23:39:03 +01:00
|
|
|
|
|
|
|
import com.google.android.exoplayer2.ui.AspectRatioFrameLayout;
|
|
|
|
import com.google.android.exoplayer2.util.MimeTypes;
|
2017-10-27 04:59:25 +02:00
|
|
|
|
|
|
|
import org.schabi.newpipe.R;
|
2018-02-03 23:39:03 +01:00
|
|
|
import org.schabi.newpipe.extractor.Subtitles;
|
2018-02-27 04:57:59 +01:00
|
|
|
import org.schabi.newpipe.extractor.stream.AudioStream;
|
|
|
|
import org.schabi.newpipe.extractor.stream.StreamInfo;
|
2018-02-03 23:39:03 +01:00
|
|
|
import org.schabi.newpipe.extractor.stream.SubtitlesFormat;
|
2018-02-27 04:57:59 +01:00
|
|
|
import org.schabi.newpipe.extractor.stream.VideoStream;
|
2017-10-27 04:59:25 +02:00
|
|
|
|
|
|
|
import java.text.DecimalFormat;
|
|
|
|
import java.text.NumberFormat;
|
|
|
|
import java.util.Formatter;
|
|
|
|
import java.util.Locale;
|
|
|
|
|
2017-11-01 01:07:12 +01:00
|
|
|
import javax.annotation.Nonnull;
|
|
|
|
|
2018-02-03 23:39:03 +01:00
|
|
|
import static com.google.android.exoplayer2.ui.AspectRatioFrameLayout.RESIZE_MODE_FILL;
|
|
|
|
import static com.google.android.exoplayer2.ui.AspectRatioFrameLayout.RESIZE_MODE_FIT;
|
|
|
|
import static com.google.android.exoplayer2.ui.AspectRatioFrameLayout.RESIZE_MODE_FIXED_HEIGHT;
|
|
|
|
import static com.google.android.exoplayer2.ui.AspectRatioFrameLayout.RESIZE_MODE_FIXED_WIDTH;
|
|
|
|
import static com.google.android.exoplayer2.ui.AspectRatioFrameLayout.RESIZE_MODE_ZOOM;
|
|
|
|
|
2017-10-27 04:59:25 +02:00
|
|
|
public class PlayerHelper {
|
|
|
|
private PlayerHelper() {}
|
|
|
|
|
|
|
|
private static final StringBuilder stringBuilder = new StringBuilder();
|
|
|
|
private static final Formatter stringFormatter = new Formatter(stringBuilder, Locale.getDefault());
|
|
|
|
private static final NumberFormat speedFormatter = new DecimalFormat("0.##x");
|
|
|
|
private static final NumberFormat pitchFormatter = new DecimalFormat("##%");
|
|
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////////
|
|
|
|
// Exposed helpers
|
|
|
|
////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
public static String getTimeString(int milliSeconds) {
|
|
|
|
long seconds = (milliSeconds % 60000L) / 1000L;
|
|
|
|
long minutes = (milliSeconds % 3600000L) / 60000L;
|
|
|
|
long hours = (milliSeconds % 86400000L) / 3600000L;
|
|
|
|
long days = (milliSeconds % (86400000L * 7L)) / 86400000L;
|
|
|
|
|
|
|
|
stringBuilder.setLength(0);
|
|
|
|
return days > 0 ? stringFormatter.format("%d:%02d:%02d:%02d", days, hours, minutes, seconds).toString()
|
|
|
|
: hours > 0 ? stringFormatter.format("%d:%02d:%02d", hours, minutes, seconds).toString()
|
|
|
|
: stringFormatter.format("%02d:%02d", minutes, seconds).toString();
|
|
|
|
}
|
|
|
|
|
|
|
|
public static String formatSpeed(float speed) {
|
|
|
|
return speedFormatter.format(speed);
|
|
|
|
}
|
|
|
|
|
|
|
|
public static String formatPitch(float pitch) {
|
|
|
|
return pitchFormatter.format(pitch);
|
|
|
|
}
|
|
|
|
|
2018-02-03 23:39:03 +01:00
|
|
|
public static String mimeTypesOf(final SubtitlesFormat format) {
|
|
|
|
switch (format) {
|
|
|
|
case VTT: return MimeTypes.TEXT_VTT;
|
|
|
|
case TTML: return MimeTypes.APPLICATION_TTML;
|
|
|
|
default: throw new IllegalArgumentException("Unrecognized mime type: " + format.name());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@NonNull
|
2018-02-20 13:58:51 +01:00
|
|
|
public static String captionLanguageOf(@NonNull final Context context,
|
|
|
|
@NonNull final Subtitles subtitles) {
|
2018-02-03 23:39:03 +01:00
|
|
|
final String displayName = subtitles.getLocale().getDisplayName(subtitles.getLocale());
|
2018-02-27 04:57:59 +01:00
|
|
|
return displayName + (subtitles.isAutoGenerated() ? " (" + context.getString(R.string.caption_auto_generated)+ ")" : "");
|
2018-02-03 23:39:03 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
public static String resizeTypeOf(@NonNull final Context context,
|
|
|
|
@AspectRatioFrameLayout.ResizeMode final int resizeMode) {
|
|
|
|
switch (resizeMode) {
|
2018-02-07 22:11:19 +01:00
|
|
|
case RESIZE_MODE_FIT: return context.getResources().getString(R.string.resize_fit);
|
|
|
|
case RESIZE_MODE_FILL: return context.getResources().getString(R.string.resize_fill);
|
|
|
|
case RESIZE_MODE_ZOOM: return context.getResources().getString(R.string.resize_zoom);
|
2018-02-03 23:39:03 +01:00
|
|
|
default: throw new IllegalArgumentException("Unrecognized resize mode: " + resizeMode);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-02-27 04:57:59 +01:00
|
|
|
public static String cacheKeyOf(@NonNull final StreamInfo info, @NonNull VideoStream video) {
|
|
|
|
return info.getUrl() + video.getResolution() + video.getFormat().getName();
|
|
|
|
}
|
|
|
|
|
|
|
|
public static String cacheKeyOf(@NonNull final StreamInfo info, @NonNull AudioStream audio) {
|
|
|
|
return info.getUrl() + audio.getAverageBitrate() + audio.getFormat().getName();
|
|
|
|
}
|
|
|
|
|
2017-10-27 04:59:25 +02:00
|
|
|
public static boolean isResumeAfterAudioFocusGain(@NonNull final Context context) {
|
|
|
|
return isResumeAfterAudioFocusGain(context, false);
|
|
|
|
}
|
|
|
|
|
|
|
|
public static boolean isPlayerGestureEnabled(@NonNull final Context context) {
|
|
|
|
return isPlayerGestureEnabled(context, true);
|
|
|
|
}
|
|
|
|
|
|
|
|
public static boolean isUsingOldPlayer(@NonNull final Context context) {
|
|
|
|
return isUsingOldPlayer(context, false);
|
|
|
|
}
|
|
|
|
|
2017-11-01 01:07:12 +01:00
|
|
|
public static boolean isRememberingPopupDimensions(@Nonnull final Context context) {
|
|
|
|
return isRememberingPopupDimensions(context, true);
|
|
|
|
}
|
|
|
|
|
2017-10-27 04:59:25 +02:00
|
|
|
public static long getPreferredCacheSize(@NonNull final Context context) {
|
|
|
|
return 64 * 1024 * 1024L;
|
|
|
|
}
|
|
|
|
|
|
|
|
public static long getPreferredFileSize(@NonNull final Context context) {
|
|
|
|
return 512 * 1024L;
|
|
|
|
}
|
|
|
|
|
|
|
|
public static int getMinBufferMs(@NonNull final Context context) {
|
|
|
|
return 15000;
|
|
|
|
}
|
|
|
|
|
|
|
|
public static int getMaxBufferMs(@NonNull final Context context) {
|
|
|
|
return 30000;
|
|
|
|
}
|
|
|
|
|
2018-02-17 20:55:45 +01:00
|
|
|
public static int getBufferForPlaybackMs(@NonNull final Context context) {
|
|
|
|
return 2500;
|
2017-10-27 04:59:25 +02:00
|
|
|
}
|
|
|
|
|
2017-10-28 19:08:01 +02:00
|
|
|
public static boolean isUsingDSP(@NonNull final Context context) {
|
|
|
|
return true;
|
|
|
|
}
|
2017-11-01 01:07:12 +01:00
|
|
|
|
|
|
|
public static int getShutdownFlingVelocity(@Nonnull final Context context) {
|
|
|
|
return 10000;
|
|
|
|
}
|
|
|
|
|
|
|
|
public static int getTossFlingVelocity(@Nonnull final Context context) {
|
|
|
|
return 2500;
|
|
|
|
}
|
|
|
|
|
2017-10-27 04:59:25 +02:00
|
|
|
////////////////////////////////////////////////////////////////////////////
|
|
|
|
// Private helpers
|
|
|
|
////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
@NonNull
|
|
|
|
private static SharedPreferences getPreferences(@NonNull final Context context) {
|
|
|
|
return PreferenceManager.getDefaultSharedPreferences(context);
|
|
|
|
}
|
|
|
|
|
|
|
|
private static boolean isResumeAfterAudioFocusGain(@NonNull final Context context, final boolean b) {
|
|
|
|
return getPreferences(context).getBoolean(context.getString(R.string.resume_on_audio_focus_gain_key), b);
|
|
|
|
}
|
|
|
|
|
|
|
|
private static boolean isPlayerGestureEnabled(@NonNull final Context context, final boolean b) {
|
|
|
|
return getPreferences(context).getBoolean(context.getString(R.string.player_gesture_controls_key), b);
|
|
|
|
}
|
|
|
|
|
|
|
|
private static boolean isUsingOldPlayer(@NonNull final Context context, final boolean b) {
|
|
|
|
return getPreferences(context).getBoolean(context.getString(R.string.use_old_player_key), b);
|
|
|
|
}
|
2017-11-01 01:07:12 +01:00
|
|
|
|
|
|
|
private static boolean isRememberingPopupDimensions(@Nonnull final Context context, final boolean b) {
|
|
|
|
return getPreferences(context).getBoolean(context.getString(R.string.popup_remember_size_pos_key), b);
|
|
|
|
}
|
2017-10-27 04:59:25 +02:00
|
|
|
}
|