Merge pull request #1604 from TheMatten/player_controls
Gesture controls
This commit is contained in:
commit
4e478c65d3
11 changed files with 242 additions and 89 deletions
|
@ -36,6 +36,7 @@ import android.support.annotation.NonNull;
|
||||||
import android.support.annotation.Nullable;
|
import android.support.annotation.Nullable;
|
||||||
import android.support.v4.app.ActivityCompat;
|
import android.support.v4.app.ActivityCompat;
|
||||||
import android.support.v7.app.AppCompatActivity;
|
import android.support.v7.app.AppCompatActivity;
|
||||||
|
import android.support.v7.content.res.AppCompatResources;
|
||||||
import android.support.v7.widget.RecyclerView;
|
import android.support.v7.widget.RecyclerView;
|
||||||
import android.support.v7.widget.helper.ItemTouchHelper;
|
import android.support.v7.widget.helper.ItemTouchHelper;
|
||||||
import android.util.DisplayMetrics;
|
import android.util.DisplayMetrics;
|
||||||
|
@ -46,7 +47,9 @@ import android.view.MotionEvent;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.WindowManager;
|
import android.view.WindowManager;
|
||||||
import android.widget.ImageButton;
|
import android.widget.ImageButton;
|
||||||
|
import android.widget.ImageView;
|
||||||
import android.widget.PopupMenu;
|
import android.widget.PopupMenu;
|
||||||
|
import android.widget.ProgressBar;
|
||||||
import android.widget.RelativeLayout;
|
import android.widget.RelativeLayout;
|
||||||
import android.widget.SeekBar;
|
import android.widget.SeekBar;
|
||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
|
@ -82,6 +85,7 @@ import java.util.UUID;
|
||||||
import static org.schabi.newpipe.player.BasePlayer.STATE_PLAYING;
|
import static org.schabi.newpipe.player.BasePlayer.STATE_PLAYING;
|
||||||
import static org.schabi.newpipe.player.VideoPlayer.DEFAULT_CONTROLS_DURATION;
|
import static org.schabi.newpipe.player.VideoPlayer.DEFAULT_CONTROLS_DURATION;
|
||||||
import static org.schabi.newpipe.player.VideoPlayer.DEFAULT_CONTROLS_HIDE_TIME;
|
import static org.schabi.newpipe.player.VideoPlayer.DEFAULT_CONTROLS_HIDE_TIME;
|
||||||
|
import static org.schabi.newpipe.util.AnimationUtils.Type.SCALE_AND_ALPHA;
|
||||||
import static org.schabi.newpipe.util.AnimationUtils.Type.SLIDE_AND_ALPHA;
|
import static org.schabi.newpipe.util.AnimationUtils.Type.SLIDE_AND_ALPHA;
|
||||||
import static org.schabi.newpipe.util.AnimationUtils.animateRotation;
|
import static org.schabi.newpipe.util.AnimationUtils.animateRotation;
|
||||||
import static org.schabi.newpipe.util.AnimationUtils.animateView;
|
import static org.schabi.newpipe.util.AnimationUtils.animateView;
|
||||||
|
@ -365,10 +369,16 @@ public final class MainVideoPlayer extends AppCompatActivity
|
||||||
|
|
||||||
@SuppressWarnings({"unused", "WeakerAccess"})
|
@SuppressWarnings({"unused", "WeakerAccess"})
|
||||||
private class VideoPlayerImpl extends VideoPlayer {
|
private class VideoPlayerImpl extends VideoPlayer {
|
||||||
|
private final float MAX_GESTURE_LENGTH = 0.75f;
|
||||||
|
|
||||||
private TextView titleTextView;
|
private TextView titleTextView;
|
||||||
private TextView channelTextView;
|
private TextView channelTextView;
|
||||||
private TextView volumeTextView;
|
private RelativeLayout volumeRelativeLayout;
|
||||||
private TextView brightnessTextView;
|
private ProgressBar volumeProgressBar;
|
||||||
|
private ImageView volumeImageView;
|
||||||
|
private RelativeLayout brightnessRelativeLayout;
|
||||||
|
private ProgressBar brightnessProgressBar;
|
||||||
|
private ImageView brightnessImageView;
|
||||||
private ImageButton queueButton;
|
private ImageButton queueButton;
|
||||||
private ImageButton repeatButton;
|
private ImageButton repeatButton;
|
||||||
private ImageButton shuffleButton;
|
private ImageButton shuffleButton;
|
||||||
|
@ -392,6 +402,8 @@ public final class MainVideoPlayer extends AppCompatActivity
|
||||||
private RelativeLayout windowRootLayout;
|
private RelativeLayout windowRootLayout;
|
||||||
private View secondaryControls;
|
private View secondaryControls;
|
||||||
|
|
||||||
|
private int maxGestureLength;
|
||||||
|
|
||||||
VideoPlayerImpl(final Context context) {
|
VideoPlayerImpl(final Context context) {
|
||||||
super("VideoPlayerImpl" + MainVideoPlayer.TAG, context);
|
super("VideoPlayerImpl" + MainVideoPlayer.TAG, context);
|
||||||
}
|
}
|
||||||
|
@ -401,8 +413,12 @@ public final class MainVideoPlayer extends AppCompatActivity
|
||||||
super.initViews(rootView);
|
super.initViews(rootView);
|
||||||
this.titleTextView = rootView.findViewById(R.id.titleTextView);
|
this.titleTextView = rootView.findViewById(R.id.titleTextView);
|
||||||
this.channelTextView = rootView.findViewById(R.id.channelTextView);
|
this.channelTextView = rootView.findViewById(R.id.channelTextView);
|
||||||
this.volumeTextView = rootView.findViewById(R.id.volumeTextView);
|
this.volumeRelativeLayout = rootView.findViewById(R.id.volumeRelativeLayout);
|
||||||
this.brightnessTextView = rootView.findViewById(R.id.brightnessTextView);
|
this.volumeProgressBar = rootView.findViewById(R.id.volumeProgressBar);
|
||||||
|
this.volumeImageView = rootView.findViewById(R.id.volumeImageView);
|
||||||
|
this.brightnessRelativeLayout = rootView.findViewById(R.id.brightnessRelativeLayout);
|
||||||
|
this.brightnessProgressBar = rootView.findViewById(R.id.brightnessProgressBar);
|
||||||
|
this.brightnessImageView = rootView.findViewById(R.id.brightnessImageView);
|
||||||
this.queueButton = rootView.findViewById(R.id.queueButton);
|
this.queueButton = rootView.findViewById(R.id.queueButton);
|
||||||
this.repeatButton = rootView.findViewById(R.id.repeatButton);
|
this.repeatButton = rootView.findViewById(R.id.repeatButton);
|
||||||
this.shuffleButton = rootView.findViewById(R.id.shuffleButton);
|
this.shuffleButton = rootView.findViewById(R.id.shuffleButton);
|
||||||
|
@ -461,6 +477,20 @@ public final class MainVideoPlayer extends AppCompatActivity
|
||||||
toggleOrientationButton.setOnClickListener(this);
|
toggleOrientationButton.setOnClickListener(this);
|
||||||
switchBackgroundButton.setOnClickListener(this);
|
switchBackgroundButton.setOnClickListener(this);
|
||||||
switchPopupButton.setOnClickListener(this);
|
switchPopupButton.setOnClickListener(this);
|
||||||
|
|
||||||
|
getRootView().addOnLayoutChangeListener((view, l, t, r, b, ol, ot, or, ob) -> {
|
||||||
|
if (l != ol || t != ot || r != or || b != ob) {
|
||||||
|
// Use smaller value to be consistent between screen orientations
|
||||||
|
// (and to make usage easier)
|
||||||
|
int width = r - l, height = b - t;
|
||||||
|
maxGestureLength = (int) (Math.min(width, height) * MAX_GESTURE_LENGTH);
|
||||||
|
|
||||||
|
if (DEBUG) Log.d(TAG, "maxGestureLength = " + maxGestureLength);
|
||||||
|
|
||||||
|
volumeProgressBar.setMax(maxGestureLength);
|
||||||
|
brightnessProgressBar.setMax(maxGestureLength);
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
public void minimize() {
|
public void minimize() {
|
||||||
|
@ -872,12 +902,28 @@ public final class MainVideoPlayer extends AppCompatActivity
|
||||||
return channelTextView;
|
return channelTextView;
|
||||||
}
|
}
|
||||||
|
|
||||||
public TextView getVolumeTextView() {
|
public RelativeLayout getVolumeRelativeLayout() {
|
||||||
return volumeTextView;
|
return volumeRelativeLayout;
|
||||||
}
|
}
|
||||||
|
|
||||||
public TextView getBrightnessTextView() {
|
public ProgressBar getVolumeProgressBar() {
|
||||||
return brightnessTextView;
|
return volumeProgressBar;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ImageView getVolumeImageView() {
|
||||||
|
return volumeImageView;
|
||||||
|
}
|
||||||
|
|
||||||
|
public RelativeLayout getBrightnessRelativeLayout() {
|
||||||
|
return brightnessRelativeLayout;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ProgressBar getBrightnessProgressBar() {
|
||||||
|
return brightnessProgressBar;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ImageView getBrightnessImageView() {
|
||||||
|
return brightnessImageView;
|
||||||
}
|
}
|
||||||
|
|
||||||
public ImageButton getRepeatButton() {
|
public ImageButton getRepeatButton() {
|
||||||
|
@ -887,6 +933,10 @@ public final class MainVideoPlayer extends AppCompatActivity
|
||||||
public ImageButton getPlayPauseButton() {
|
public ImageButton getPlayPauseButton() {
|
||||||
return playPauseButton;
|
return playPauseButton;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public int getMaxGestureLength() {
|
||||||
|
return maxGestureLength;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private class MySimpleOnGestureListener extends GestureDetector.SimpleOnGestureListener implements View.OnTouchListener {
|
private class MySimpleOnGestureListener extends GestureDetector.SimpleOnGestureListener implements View.OnTouchListener {
|
||||||
|
@ -930,23 +980,10 @@ public final class MainVideoPlayer extends AppCompatActivity
|
||||||
|
|
||||||
private final boolean isPlayerGestureEnabled = PlayerHelper.isPlayerGestureEnabled(getApplicationContext());
|
private final boolean isPlayerGestureEnabled = PlayerHelper.isPlayerGestureEnabled(getApplicationContext());
|
||||||
|
|
||||||
private final float stepsBrightness = 15, stepBrightness = (1f / stepsBrightness), minBrightness = .01f;
|
private final int maxVolume = playerImpl.getAudioReactor().getMaxVolume();
|
||||||
private float currentBrightness = getWindow().getAttributes().screenBrightness > 0
|
|
||||||
? getWindow().getAttributes().screenBrightness
|
|
||||||
: 0.5f;
|
|
||||||
|
|
||||||
private int currentVolume, maxVolume = playerImpl.getAudioReactor().getMaxVolume();
|
|
||||||
private final float stepsVolume = 15, stepVolume = (float) Math.ceil(maxVolume / stepsVolume), minVolume = 0;
|
|
||||||
|
|
||||||
private final String brightnessUnicode = new String(Character.toChars(0x2600));
|
|
||||||
private final String volumeUnicode = new String(Character.toChars(0x1F508));
|
|
||||||
|
|
||||||
private final int MOVEMENT_THRESHOLD = 40;
|
private final int MOVEMENT_THRESHOLD = 40;
|
||||||
private final int eventsThreshold = 8;
|
|
||||||
private boolean triggered = false;
|
|
||||||
private int eventsNum;
|
|
||||||
|
|
||||||
// TODO: Improve video gesture controls
|
|
||||||
@Override
|
@Override
|
||||||
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
|
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
|
||||||
if (!isPlayerGestureEnabled) return false;
|
if (!isPlayerGestureEnabled) return false;
|
||||||
|
@ -956,63 +993,77 @@ public final class MainVideoPlayer extends AppCompatActivity
|
||||||
", e1.getRaw = [" + e1.getRawX() + ", " + e1.getRawY() + "]" +
|
", e1.getRaw = [" + e1.getRawX() + ", " + e1.getRawY() + "]" +
|
||||||
", e2.getRaw = [" + e2.getRawX() + ", " + e2.getRawY() + "]" +
|
", e2.getRaw = [" + e2.getRawX() + ", " + e2.getRawY() + "]" +
|
||||||
", distanceXy = [" + distanceX + ", " + distanceY + "]");
|
", distanceXy = [" + distanceX + ", " + distanceY + "]");
|
||||||
float abs = Math.abs(e2.getY() - e1.getY());
|
|
||||||
if (!triggered) {
|
if (!isMoving && (
|
||||||
triggered = abs > MOVEMENT_THRESHOLD;
|
Math.abs(e2.getY() - e1.getY()) <= MOVEMENT_THRESHOLD
|
||||||
|
|| Math.abs(distanceX) > Math.abs(distanceY)
|
||||||
|
) || playerImpl.getCurrentState() == BasePlayer.STATE_COMPLETED)
|
||||||
return false;
|
return false;
|
||||||
}
|
|
||||||
|
|
||||||
if (eventsNum++ % eventsThreshold != 0 || playerImpl.getCurrentState() == BasePlayer.STATE_COMPLETED) return false;
|
|
||||||
isMoving = true;
|
isMoving = true;
|
||||||
// boolean up = !((e2.getY() - e1.getY()) > 0) && distanceY > 0; // Android's origin point is on top
|
|
||||||
boolean up = distanceY > 0;
|
|
||||||
|
|
||||||
|
|
||||||
if (e1.getX() > playerImpl.getRootView().getWidth() / 2) {
|
if (e1.getX() > playerImpl.getRootView().getWidth() / 2) {
|
||||||
double floor = Math.floor(up ? stepVolume : -stepVolume);
|
playerImpl.getVolumeProgressBar().incrementProgressBy((int) distanceY);
|
||||||
currentVolume = (int) (playerImpl.getAudioReactor().getVolume() + floor);
|
float currentProgressPercent =
|
||||||
if (currentVolume >= maxVolume) currentVolume = maxVolume;
|
(float) playerImpl.getVolumeProgressBar().getProgress() / playerImpl.getMaxGestureLength();
|
||||||
if (currentVolume <= minVolume) currentVolume = (int) minVolume;
|
int currentVolume = (int) (maxVolume * currentProgressPercent);
|
||||||
playerImpl.getAudioReactor().setVolume(currentVolume);
|
playerImpl.getAudioReactor().setVolume(currentVolume);
|
||||||
|
|
||||||
currentVolume = playerImpl.getAudioReactor().getVolume();
|
|
||||||
if (DEBUG) Log.d(TAG, "onScroll().volumeControl, currentVolume = " + currentVolume);
|
if (DEBUG) Log.d(TAG, "onScroll().volumeControl, currentVolume = " + currentVolume);
|
||||||
final String volumeText = volumeUnicode + " " + Math.round((((float) currentVolume) / maxVolume) * 100) + "%";
|
|
||||||
playerImpl.getVolumeTextView().setText(volumeText);
|
|
||||||
|
|
||||||
if (playerImpl.getVolumeTextView().getVisibility() != View.VISIBLE) animateView(playerImpl.getVolumeTextView(), true, 200);
|
final int resId =
|
||||||
if (playerImpl.getBrightnessTextView().getVisibility() == View.VISIBLE) playerImpl.getBrightnessTextView().setVisibility(View.GONE);
|
currentProgressPercent <= 0 ? R.drawable.ic_volume_off_white_72dp
|
||||||
|
: currentProgressPercent < 0.25 ? R.drawable.ic_volume_mute_white_72dp
|
||||||
|
: currentProgressPercent < 0.75 ? R.drawable.ic_volume_down_white_72dp
|
||||||
|
: R.drawable.ic_volume_up_white_72dp;
|
||||||
|
|
||||||
|
playerImpl.getVolumeImageView().setImageDrawable(
|
||||||
|
AppCompatResources.getDrawable(getApplicationContext(), resId)
|
||||||
|
);
|
||||||
|
|
||||||
|
if (playerImpl.getVolumeRelativeLayout().getVisibility() != View.VISIBLE) {
|
||||||
|
animateView(playerImpl.getVolumeRelativeLayout(), SCALE_AND_ALPHA, true, 200);
|
||||||
|
}
|
||||||
|
if (playerImpl.getBrightnessRelativeLayout().getVisibility() == View.VISIBLE) {
|
||||||
|
playerImpl.getBrightnessRelativeLayout().setVisibility(View.GONE);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
WindowManager.LayoutParams lp = getWindow().getAttributes();
|
playerImpl.getBrightnessProgressBar().incrementProgressBy((int) distanceY);
|
||||||
currentBrightness += up ? stepBrightness : -stepBrightness;
|
float currentProgressPercent =
|
||||||
if (currentBrightness >= 1f) currentBrightness = 1f;
|
(float) playerImpl.getBrightnessProgressBar().getProgress() / playerImpl.getMaxGestureLength();
|
||||||
if (currentBrightness <= minBrightness) currentBrightness = minBrightness;
|
WindowManager.LayoutParams layoutParams = getWindow().getAttributes();
|
||||||
|
layoutParams.screenBrightness = currentProgressPercent;
|
||||||
|
getWindow().setAttributes(layoutParams);
|
||||||
|
|
||||||
lp.screenBrightness = currentBrightness;
|
if (DEBUG) Log.d(TAG, "onScroll().brightnessControl, currentBrightness = " + currentProgressPercent);
|
||||||
getWindow().setAttributes(lp);
|
|
||||||
if (DEBUG) Log.d(TAG, "onScroll().brightnessControl, currentBrightness = " + currentBrightness);
|
|
||||||
int brightnessNormalized = Math.round(currentBrightness * 100);
|
|
||||||
|
|
||||||
final String brightnessText = brightnessUnicode + " " + (brightnessNormalized == 1 ? 0 : brightnessNormalized) + "%";
|
final int resId =
|
||||||
playerImpl.getBrightnessTextView().setText(brightnessText);
|
currentProgressPercent < 0.25 ? R.drawable.ic_brightness_low_white_72dp
|
||||||
|
: currentProgressPercent < 0.75 ? R.drawable.ic_brightness_medium_white_72dp
|
||||||
|
: R.drawable.ic_brightness_high_white_72dp;
|
||||||
|
|
||||||
if (playerImpl.getBrightnessTextView().getVisibility() != View.VISIBLE) animateView(playerImpl.getBrightnessTextView(), true, 200);
|
playerImpl.getBrightnessImageView().setImageDrawable(
|
||||||
if (playerImpl.getVolumeTextView().getVisibility() == View.VISIBLE) playerImpl.getVolumeTextView().setVisibility(View.GONE);
|
AppCompatResources.getDrawable(getApplicationContext(), resId)
|
||||||
|
);
|
||||||
|
|
||||||
|
if (playerImpl.getBrightnessRelativeLayout().getVisibility() != View.VISIBLE) {
|
||||||
|
animateView(playerImpl.getBrightnessRelativeLayout(), SCALE_AND_ALPHA, true, 200);
|
||||||
|
}
|
||||||
|
if (playerImpl.getVolumeRelativeLayout().getVisibility() == View.VISIBLE) {
|
||||||
|
playerImpl.getVolumeRelativeLayout().setVisibility(View.GONE);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void onScrollEnd() {
|
private void onScrollEnd() {
|
||||||
if (DEBUG) Log.d(TAG, "onScrollEnd() called");
|
if (DEBUG) Log.d(TAG, "onScrollEnd() called");
|
||||||
triggered = false;
|
|
||||||
eventsNum = 0;
|
if (playerImpl.getVolumeRelativeLayout().getVisibility() == View.VISIBLE) {
|
||||||
/* if (playerImpl.getVolumeTextView().getVisibility() == View.VISIBLE) playerImpl.getVolumeTextView().setVisibility(View.GONE);
|
animateView(playerImpl.getVolumeRelativeLayout(), SCALE_AND_ALPHA, false, 200, 200);
|
||||||
if (playerImpl.getBrightnessTextView().getVisibility() == View.VISIBLE) playerImpl.getBrightnessTextView().setVisibility(View.GONE);*/
|
|
||||||
if (playerImpl.getVolumeTextView().getVisibility() == View.VISIBLE) {
|
|
||||||
animateView(playerImpl.getVolumeTextView(), false, 200, 200);
|
|
||||||
}
|
}
|
||||||
if (playerImpl.getBrightnessTextView().getVisibility() == View.VISIBLE) {
|
if (playerImpl.getBrightnessRelativeLayout().getVisibility() == View.VISIBLE) {
|
||||||
animateView(playerImpl.getBrightnessTextView(), false, 200, 200);
|
animateView(playerImpl.getBrightnessRelativeLayout(), SCALE_AND_ALPHA, false, 200, 200);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (playerImpl.isControlsVisible() && playerImpl.getCurrentState() == STATE_PLAYING) {
|
if (playerImpl.isControlsVisible() && playerImpl.getCurrentState() == STATE_PLAYING) {
|
||||||
|
|
|
@ -0,0 +1,5 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<shape xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:shape="oval">
|
||||||
|
<solid android:color="#64000000" />
|
||||||
|
</shape>
|
10
app/src/main/res/drawable/ic_brightness_high_white_72dp.xml
Normal file
10
app/src/main/res/drawable/ic_brightness_high_white_72dp.xml
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="72dp"
|
||||||
|
android:height="72dp"
|
||||||
|
android:tint="#FFFFFF"
|
||||||
|
android:viewportWidth="24.0"
|
||||||
|
android:viewportHeight="24.0">
|
||||||
|
<path
|
||||||
|
android:fillColor="#FF000000"
|
||||||
|
android:pathData="M20,8.69L20,4h-4.69L12,0.69 8.69,4L4,4v4.69L0.69,12 4,15.31L4,20h4.69L12,23.31 15.31,20L20,20v-4.69L23.31,12 20,8.69zM12,18c-3.31,0 -6,-2.69 -6,-6s2.69,-6 6,-6 6,2.69 6,6 -2.69,6 -6,6zM12,8c-2.21,0 -4,1.79 -4,4s1.79,4 4,4 4,-1.79 4,-4 -1.79,-4 -4,-4z" />
|
||||||
|
</vector>
|
10
app/src/main/res/drawable/ic_brightness_low_white_72dp.xml
Normal file
10
app/src/main/res/drawable/ic_brightness_low_white_72dp.xml
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="72dp"
|
||||||
|
android:height="72dp"
|
||||||
|
android:tint="#FFFFFF"
|
||||||
|
android:viewportWidth="24.0"
|
||||||
|
android:viewportHeight="24.0">
|
||||||
|
<path
|
||||||
|
android:fillColor="#FF000000"
|
||||||
|
android:pathData="M20,15.31L23.31,12 20,8.69V4h-4.69L12,0.69 8.69,4H4v4.69L0.69,12 4,15.31V20h4.69L12,23.31 15.31,20H20v-4.69zM12,18c-3.31,0 -6,-2.69 -6,-6s2.69,-6 6,-6 6,2.69 6,6 -2.69,6 -6,6z" />
|
||||||
|
</vector>
|
|
@ -0,0 +1,10 @@
|
||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="72dp"
|
||||||
|
android:height="72dp"
|
||||||
|
android:tint="#FFFFFF"
|
||||||
|
android:viewportWidth="24.0"
|
||||||
|
android:viewportHeight="24.0">
|
||||||
|
<path
|
||||||
|
android:fillColor="#FF000000"
|
||||||
|
android:pathData="M20,15.31L23.31,12 20,8.69V4h-4.69L12,0.69 8.69,4H4v4.69L0.69,12 4,15.31V20h4.69L12,23.31 15.31,20H20v-4.69zM12,18V6c3.31,0 6,2.69 6,6s-2.69,6 -6,6z" />
|
||||||
|
</vector>
|
10
app/src/main/res/drawable/ic_volume_down_white_72dp.xml
Normal file
10
app/src/main/res/drawable/ic_volume_down_white_72dp.xml
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="72dp"
|
||||||
|
android:height="72dp"
|
||||||
|
android:tint="#FFFFFF"
|
||||||
|
android:viewportWidth="24.0"
|
||||||
|
android:viewportHeight="24.0">
|
||||||
|
<path
|
||||||
|
android:fillColor="#FF000000"
|
||||||
|
android:pathData="M18.5,12c0,-1.77 -1.02,-3.29 -2.5,-4.03v8.05c1.48,-0.73 2.5,-2.25 2.5,-4.02zM5,9v6h4l5,5V4L9,9H5z" />
|
||||||
|
</vector>
|
10
app/src/main/res/drawable/ic_volume_mute_white_72dp.xml
Normal file
10
app/src/main/res/drawable/ic_volume_mute_white_72dp.xml
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="72dp"
|
||||||
|
android:height="72dp"
|
||||||
|
android:tint="#FFFFFF"
|
||||||
|
android:viewportWidth="24.0"
|
||||||
|
android:viewportHeight="24.0">
|
||||||
|
<path
|
||||||
|
android:fillColor="#FF000000"
|
||||||
|
android:pathData="M7,9v6h4l5,5V4l-5,5H7z" />
|
||||||
|
</vector>
|
10
app/src/main/res/drawable/ic_volume_off_white_72dp.xml
Normal file
10
app/src/main/res/drawable/ic_volume_off_white_72dp.xml
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="72dp"
|
||||||
|
android:height="72dp"
|
||||||
|
android:tint="#FFFFFF"
|
||||||
|
android:viewportWidth="24.0"
|
||||||
|
android:viewportHeight="24.0">
|
||||||
|
<path
|
||||||
|
android:fillColor="#FF000000"
|
||||||
|
android:pathData="M16.5,12c0,-1.77 -1.02,-3.29 -2.5,-4.03v2.21l2.45,2.45c0.03,-0.2 0.05,-0.41 0.05,-0.63zM19,12c0,0.94 -0.2,1.82 -0.54,2.64l1.51,1.51C20.63,14.91 21,13.5 21,12c0,-4.28 -2.99,-7.86 -7,-8.77v2.06c2.89,0.86 5,3.54 5,6.71zM4.27,3L3,4.27 7.73,9L3,9v6h4l5,5v-6.73l4.25,4.25c-0.67,0.52 -1.42,0.93 -2.25,1.18v2.06c1.38,-0.31 2.63,-0.95 3.69,-1.81L19.73,21 21,19.73l-9,-9L4.27,3zM12,4L9.91,6.09 12,8.18L12,4z" />
|
||||||
|
</vector>
|
10
app/src/main/res/drawable/ic_volume_up_white_72dp.xml
Normal file
10
app/src/main/res/drawable/ic_volume_up_white_72dp.xml
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="72dp"
|
||||||
|
android:height="72dp"
|
||||||
|
android:tint="#FFFFFF"
|
||||||
|
android:viewportWidth="24.0"
|
||||||
|
android:viewportHeight="24.0">
|
||||||
|
<path
|
||||||
|
android:fillColor="#FF000000"
|
||||||
|
android:pathData="M3,9v6h4l5,5L12,4L7,9L3,9zM16.5,12c0,-1.77 -1.02,-3.29 -2.5,-4.03v8.05c1.48,-0.73 2.5,-2.25 2.5,-4.02zM14,3.23v2.06c2.89,0.86 5,3.54 5,6.71s-2.11,5.85 -5,6.71v2.06c4.01,-0.91 7,-4.49 7,-8.77s-2.99,-7.86 -7,-8.77z" />
|
||||||
|
</vector>
|
12
app/src/main/res/drawable/progress_circular_white.xml
Normal file
12
app/src/main/res/drawable/progress_circular_white.xml
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<rotate xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:fromDegrees="-90"
|
||||||
|
android:toDegrees="-90">
|
||||||
|
<shape xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:innerRadiusRatio="2.25"
|
||||||
|
android:shape="ring"
|
||||||
|
android:thicknessRatio="17.75"
|
||||||
|
android:useLevel="true">
|
||||||
|
<solid android:color="@android:color/white" />
|
||||||
|
</shape>
|
||||||
|
</rotate>
|
|
@ -471,9 +471,10 @@
|
||||||
android:id="@+id/controlAnimationView"
|
android:id="@+id/controlAnimationView"
|
||||||
android:layout_width="100dp"
|
android:layout_width="100dp"
|
||||||
android:layout_height="100dp"
|
android:layout_height="100dp"
|
||||||
android:src="@drawable/ic_action_av_fast_rewind"
|
android:background="@drawable/background_oval_black_transparent"
|
||||||
android:visibility="gone"
|
android:visibility="gone"
|
||||||
tools:ignore="ContentDescription"
|
tools:ignore="ContentDescription"
|
||||||
|
tools:src="@drawable/ic_action_av_fast_rewind"
|
||||||
tools:visibility="visible" />
|
tools:visibility="visible" />
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|
||||||
|
@ -503,43 +504,57 @@
|
||||||
android:layout_toRightOf="@+id/loading_panel"
|
android:layout_toRightOf="@+id/loading_panel"
|
||||||
tools:ignore="RtlHardcoded">
|
tools:ignore="RtlHardcoded">
|
||||||
|
|
||||||
<TextView
|
<RelativeLayout
|
||||||
android:id="@+id/volumeTextView"
|
android:id="@+id/volumeRelativeLayout"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_alignParentLeft="true"
|
|
||||||
android:layout_centerInParent="true"
|
android:layout_centerInParent="true"
|
||||||
android:layout_marginLeft="20dp"
|
android:background="@drawable/background_oval_black_transparent"
|
||||||
android:background="#64000000"
|
|
||||||
android:paddingBottom="10dp"
|
|
||||||
android:paddingLeft="30dp"
|
|
||||||
android:paddingRight="30dp"
|
|
||||||
android:paddingTop="10dp"
|
|
||||||
android:textColor="@android:color/white"
|
|
||||||
android:textSize="35sp"
|
|
||||||
android:visibility="gone"
|
android:visibility="gone"
|
||||||
tools:ignore="RtlHardcoded"
|
tools:visibility="visible">
|
||||||
tools:text="Volume 0"
|
|
||||||
tools:visibility="visible" />
|
|
||||||
|
|
||||||
<TextView
|
<ProgressBar
|
||||||
android:id="@+id/brightnessTextView"
|
android:id="@+id/volumeProgressBar"
|
||||||
|
style="?android:progressBarStyleHorizontal"
|
||||||
|
android:layout_width="128dp"
|
||||||
|
android:layout_height="128dp"
|
||||||
|
android:indeterminate="false"
|
||||||
|
android:progressDrawable="@drawable/progress_circular_white" />
|
||||||
|
|
||||||
|
<ImageView
|
||||||
|
android:id="@+id/volumeImageView"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_alignParentRight="true"
|
|
||||||
android:layout_centerInParent="true"
|
android:layout_centerInParent="true"
|
||||||
android:layout_marginRight="20dp"
|
tools:ignore="ContentDescription"
|
||||||
android:background="#64000000"
|
tools:src="@drawable/ic_volume_up_white_72dp" />
|
||||||
android:paddingBottom="10dp"
|
</RelativeLayout>
|
||||||
android:paddingLeft="30dp"
|
|
||||||
android:paddingRight="30dp"
|
<RelativeLayout
|
||||||
android:paddingTop="10dp"
|
android:id="@+id/brightnessRelativeLayout"
|
||||||
android:textColor="@android:color/white"
|
android:layout_width="wrap_content"
|
||||||
android:textSize="35sp"
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_centerInParent="true"
|
||||||
|
android:background="@drawable/background_oval_black_transparent"
|
||||||
android:visibility="gone"
|
android:visibility="gone"
|
||||||
tools:ignore="RtlHardcoded"
|
tools:visibility="visible">
|
||||||
tools:text="Brightness 0"
|
|
||||||
tools:visibility="visible" />
|
<ProgressBar
|
||||||
|
android:id="@+id/brightnessProgressBar"
|
||||||
|
style="?android:progressBarStyleHorizontal"
|
||||||
|
android:layout_width="128dp"
|
||||||
|
android:layout_height="128dp"
|
||||||
|
android:indeterminate="false"
|
||||||
|
android:progressDrawable="@drawable/progress_circular_white" />
|
||||||
|
|
||||||
|
<ImageView
|
||||||
|
android:id="@+id/brightnessImageView"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_centerInParent="true"
|
||||||
|
tools:ignore="ContentDescription"
|
||||||
|
tools:src="@drawable/ic_brightness_high_white_72dp" />
|
||||||
|
</RelativeLayout>
|
||||||
|
|
||||||
<TextView
|
<TextView
|
||||||
android:id="@+id/currentDisplaySeek"
|
android:id="@+id/currentDisplaySeek"
|
||||||
|
|
Loading…
Reference in a new issue