Use animated circular design for gesture control (brightness and volume)
-Previous version used emojis for brightness and volume icons, which may be inconsistent across devices and do not fit well with other parts of UI (Frankly, previous version was more informative than eye-candy) -This commit replaces old version with circular progress bar that shows current value (before conversion). Gesture mode (volume/brightness) is indicated by icon that changes between (4/3) modes according to current value -Text information about current value was removed, because with progress bar present it does not add any real value to UI.
This commit is contained in:
parent
a817d8cbf9
commit
bf05ff6048
11 changed files with 239 additions and 87 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>
|
|
@ -503,43 +503,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_height="wrap_content"
|
||||||
|
android:layout_centerInParent="true"
|
||||||
|
tools:ignore="ContentDescription"
|
||||||
|
tools:src="@drawable/ic_volume_up_white_72dp" />
|
||||||
|
</RelativeLayout>
|
||||||
|
|
||||||
|
<RelativeLayout
|
||||||
|
android:id="@+id/brightnessRelativeLayout"
|
||||||
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"
|
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="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