diff --git a/app/src/main/java/com/nextcloud/client/player/ui/PlayerActivity.kt b/app/src/main/java/com/nextcloud/client/player/ui/PlayerActivity.kt index dc7d5ebf1593..751f465c34c3 100644 --- a/app/src/main/java/com/nextcloud/client/player/ui/PlayerActivity.kt +++ b/app/src/main/java/com/nextcloud/client/player/ui/PlayerActivity.kt @@ -12,7 +12,6 @@ import android.content.Intent import android.content.res.Configuration import android.media.AudioManager import android.os.Bundle -import android.view.View import androidx.activity.OnBackPressedCallback import androidx.activity.addCallback import androidx.activity.enableEdgeToEdge @@ -104,8 +103,7 @@ class PlayerActivity : PlaybackFileType.AUDIO -> AudioPlayerView(this) PlaybackFileType.VIDEO -> VideoPlayerView(this) } - val moreButton = playerView.findViewById(R.id.more) - moreButton.setOnClickListener { viewModel.onMoreButtonClick() } + playerView.onMoreClick = { viewModel.onMoreButtonClick() } setContentView(playerView) } diff --git a/app/src/main/java/com/nextcloud/client/player/ui/PlayerProgressIndicator.kt b/app/src/main/java/com/nextcloud/client/player/ui/PlayerProgressIndicator.kt index 947e9b04c46a..d605e7277876 100644 --- a/app/src/main/java/com/nextcloud/client/player/ui/PlayerProgressIndicator.kt +++ b/app/src/main/java/com/nextcloud/client/player/ui/PlayerProgressIndicator.kt @@ -34,8 +34,6 @@ class PlayerProgressIndicator @JvmOverloads constructor( private var playbackFile: PlaybackFile? = null init { - indicatorTrackGapSize = 0 - trackStopIndicatorSize = 0 if (!isInEditMode) { (context.applicationContext as HasAndroidInjector).androidInjector().inject(this) } diff --git a/app/src/main/java/com/nextcloud/client/player/ui/PlayerView.kt b/app/src/main/java/com/nextcloud/client/player/ui/PlayerView.kt index 7dc7ca7e18fa..eb632ca452a7 100644 --- a/app/src/main/java/com/nextcloud/client/player/ui/PlayerView.kt +++ b/app/src/main/java/com/nextcloud/client/player/ui/PlayerView.kt @@ -9,14 +9,14 @@ package com.nextcloud.client.player.ui import android.content.Context import android.util.AttributeSet -import android.view.View import android.widget.LinearLayout -import android.widget.TextView import androidx.annotation.CallSuper import androidx.annotation.LayoutRes import androidx.appcompat.app.AppCompatActivity +import androidx.core.graphics.Insets import androidx.fragment.app.Fragment import androidx.lifecycle.lifecycleScope +import com.google.android.material.appbar.MaterialToolbar import com.nextcloud.client.account.UserAccountManager import com.nextcloud.client.jobs.download.FileDownloadHelper import com.nextcloud.client.player.media3.PlaybackModel @@ -63,11 +63,12 @@ abstract class PlayerView @JvmOverloads constructor( protected val activity: AppCompatActivity by lazy { context as AppCompatActivity } protected val windowWrapper: WindowWrapper by lazy { WindowWrapper(activity.window) } - protected val topBar: View by lazy { findViewById(R.id.topBar) } - protected val titleTextView: TextView by lazy { findViewById(R.id.title) } + protected val topBar: MaterialToolbar by lazy { findViewById(R.id.topBar) } protected val playerPager: PlayerPager by lazy { findViewById(R.id.playerPager) } protected val playerControlView: PlayerControlView by lazy { findViewById(R.id.playerControlView) } + var onMoreClick: (() -> Unit)? = null + init { inflate(context, layoutRes, this) if (!isInEditMode) { @@ -75,10 +76,22 @@ abstract class PlayerView @JvmOverloads constructor( playerPager.initialize(activity.supportFragmentManager, activity.lifecycle, createFragment) playerPager.onItemSelected = { playbackModel.switchToFile(it) } playerControlView.navigator = playerPager - findViewById(R.id.back).setOnClickListener { activity.onBackPressedDispatcher.onBackPressed() } + topBar.setNavigationOnClickListener { activity.onBackPressedDispatcher.onBackPressed() } + topBar.setOnMenuItemClickListener { menuItem -> + val isMore = menuItem.itemId == R.id.action_more + if (isMore) { + onMoreClick?.invoke() + } + isMore + } } } + protected fun applyTopBarInsets(insets: Insets) { + val actionInset = resources.getDimensionPixelSize(R.dimen.standard_quarter_padding) + topBar.setPadding(insets.left, insets.top, insets.right + actionInset, 0) + } + @CallSuper open fun onStart() { val state = playbackModel.state @@ -151,10 +164,10 @@ abstract class PlayerView @JvmOverloads constructor( if (state.currentItemState != null) { val file = state.currentItemState.file - titleTextView.text = file.getNameWithoutExtension() + topBar.title = file.getNameWithoutExtension() playerPager.setCurrentItem(file) } else { - titleTextView.text = "" + topBar.title = "" } } } diff --git a/app/src/main/java/com/nextcloud/client/player/ui/audio/AudioPlayerView.kt b/app/src/main/java/com/nextcloud/client/player/ui/audio/AudioPlayerView.kt index 5ef66985a46c..13f27a139a55 100644 --- a/app/src/main/java/com/nextcloud/client/player/ui/audio/AudioPlayerView.kt +++ b/app/src/main/java/com/nextcloud/client/player/ui/audio/AudioPlayerView.kt @@ -31,7 +31,7 @@ class AudioPlayerView(context: Context) : PlayerView(context) { val windowInsetsCompat = WindowInsetsCompat.toWindowInsetsCompat(windowInsets) val insets = windowInsetsCompat.getInsets(Type.systemBars() or Type.displayCutout()) - topBar.setPadding(insets.left, insets.top, insets.right, 0) + applyTopBarInsets(insets) playerPager.setPadding(insets.left, 0, insets.right, 0) playerControlView.setPadding(insets.left, 0, insets.right, insets.bottom) diff --git a/app/src/main/java/com/nextcloud/client/player/ui/control/PlayerControlView.kt b/app/src/main/java/com/nextcloud/client/player/ui/control/PlayerControlView.kt index b80b01e3299b..646f04a313d7 100644 --- a/app/src/main/java/com/nextcloud/client/player/ui/control/PlayerControlView.kt +++ b/app/src/main/java/com/nextcloud/client/player/ui/control/PlayerControlView.kt @@ -8,19 +8,18 @@ package com.nextcloud.client.player.ui.control import android.content.Context +import android.content.res.ColorStateList import android.os.Build import android.util.AttributeSet import android.view.LayoutInflater import android.view.WindowInsets import android.widget.LinearLayout -import android.widget.SeekBar -import android.widget.SeekBar.OnSeekBarChangeListener -import androidx.appcompat.content.res.AppCompatResources import androidx.core.content.ContextCompat import androidx.core.view.updateLayoutParams import androidx.lifecycle.Lifecycle import androidx.lifecycle.LifecycleOwner import androidx.lifecycle.flowWithLifecycle +import com.nextcloud.android.common.ui.color.ColorUtil import com.nextcloud.client.player.media3.PlaybackModel import com.nextcloud.client.player.model.state.PlaybackItemState import com.nextcloud.client.player.model.state.PlaybackState @@ -29,6 +28,7 @@ import com.nextcloud.client.player.model.state.RepeatMode import com.nextcloud.client.player.ui.MediaNavigator import com.owncloud.android.R import com.owncloud.android.databinding.PlayerControlViewBinding +import com.owncloud.android.utils.theme.ViewThemeUtils import dagger.android.HasAndroidInjector import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers @@ -40,15 +40,9 @@ import kotlinx.coroutines.flow.debounce import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach import javax.inject.Inject +import kotlin.time.Duration.Companion.milliseconds private const val INDETERMINATE_TIME = "--:--" -private const val TAG_CLICK_COMMAND_PLAY = "TAG_CLICK_COMMAND_PLAY" -private const val TAG_CLICK_COMMAND_PAUSE = "TAG_CLICK_COMMAND_PAUSE" -private const val TAG_CLICK_COMMAND_REPEAT = "TAG_CLICK_COMMAND_REPEAT" -private const val TAG_CLICK_COMMAND_DO_NOT_REPEAT = "TAG_CLICK_COMMAND_DO_NOT_REPEAT" -private const val TAG_CLICK_COMMAND_SHUFFLE = "TAG_CLICK_COMMAND_SHUFFLE" -private const val TAG_CLICK_COMMAND_DO_NOT_SHUFFLE = "TAG_CLICK_COMMAND_DO_NOT_SHUFFLE" -private const val TAG_CLICK_COMMAND_UNKNOWN = "TAG_CLICK_COMMAND_UNKNOWN" private const val PROGRESS_CHANGE_DEBOUNCE_MS = 200L private const val DEFAULT_MIN_PROGRESS = 0 @@ -68,17 +62,42 @@ class PlayerControlView @JvmOverloads constructor( @Inject lateinit var playbackModel: PlaybackModel - private val seekBarProgressChangeFlow = MutableSharedFlow(extraBufferCapacity = 1) + @Inject + lateinit var viewThemeUtils: ViewThemeUtils + + @Inject + lateinit var colorUtil: ColorUtil + + private val seekPositionFlow = MutableSharedFlow(extraBufferCapacity = 1) private var viewScope: CoroutineScope? = null val binding = PlayerControlViewBinding.inflate(LayoutInflater.from(context), this, true) + private val serverPrimaryColor: Int by lazy { viewThemeUtils.getScheme(context).sourceColorArgb } + + private val serverPrimaryTint: ColorStateList by lazy { ColorStateList.valueOf(serverPrimaryColor) } + + private val onServerPrimaryTint: ColorStateList by lazy { + ColorStateList.valueOf(colorUtil.getForegroundColorForBackgroundColor(serverPrimaryColor)) + } + + private val transportIconTint: ColorStateList? by lazy { + ContextCompat.getColorStateList(context, R.color.player_control_icon_tint) + } + + private val toggleIconTint: ColorStateList by lazy { + ColorStateList( + arrayOf(intArrayOf(android.R.attr.state_checked), intArrayOf()), + intArrayOf(serverPrimaryColor, ContextCompat.getColor(context, R.color.player_default_icon_color)) + ) + } + var navigator: MediaNavigator? = null init { if (!isInEditMode) { (context.applicationContext as HasAndroidInjector).androidInjector().inject(this) - setDefaultTags() + themeControls() setListeners() } } @@ -87,7 +106,7 @@ class PlayerControlView @JvmOverloads constructor( super.onAttachedToWindow() if (!isInEditMode) { viewScope = CoroutineScope(SupervisorJob() + Dispatchers.Main.immediate) - collectSeekBarChanges() + collectSeekPositions() } } @@ -126,125 +145,99 @@ class PlayerControlView @JvmOverloads constructor( render(state) } - private fun setDefaultTags() { - binding.ivPlayPause.tag = TAG_CLICK_COMMAND_UNKNOWN - binding.ivRandom.tag = TAG_CLICK_COMMAND_UNKNOWN - binding.ivRepeat.tag = TAG_CLICK_COMMAND_UNKNOWN + private fun themeControls() { + binding.run { + ivPrevious.iconTint = transportIconTint + ivNext.iconTint = transportIconTint + ivRepeat.iconTint = toggleIconTint + ivRandom.iconTint = toggleIconTint + ivPlayPause.backgroundTintList = serverPrimaryTint + ivPlayPause.iconTint = onServerPrimaryTint + + slider.trackActiveTintList = serverPrimaryTint + slider.thumbTintList = serverPrimaryTint + slider.setLabelFormatter { formatTime(it.toInt(), slider.valueTo.toInt()) } + } } private fun setListeners() { binding.ivPlayPause.setOnClickListener { - when (binding.ivPlayPause.tag) { - TAG_CLICK_COMMAND_PLAY -> playbackModel.play() - TAG_CLICK_COMMAND_PAUSE -> playbackModel.pause() + if (binding.ivPlayPause.isChecked) { + playbackModel.play() + } else { + playbackModel.pause() } } binding.ivRepeat.setOnClickListener { + val repeatSingle = binding.ivRepeat.isChecked + // Repeat and Random are mutually exclusive playbackModel.setShuffle(false) - when (binding.ivRepeat.tag) { - TAG_CLICK_COMMAND_REPEAT -> playbackModel.setRepeatMode(RepeatMode.SINGLE) - TAG_CLICK_COMMAND_DO_NOT_REPEAT -> playbackModel.setRepeatMode(RepeatMode.ALL) - } + playbackModel.setRepeatMode(if (repeatSingle) RepeatMode.SINGLE else RepeatMode.ALL) } binding.ivRandom.setOnClickListener { + val shuffle = binding.ivRandom.isChecked + // Repeat and Random are mutually exclusive playbackModel.setRepeatMode(RepeatMode.OFF) - playbackModel.setShuffle(binding.ivRandom.tag == TAG_CLICK_COMMAND_SHUFFLE) + playbackModel.setShuffle(shuffle) } binding.ivNext.setOnClickListener { navigator?.showNext() } binding.ivPrevious.setOnClickListener { navigator?.showPrevious() } - binding.progressBar.setOnSeekBarChangeListener(object : OnSeekBarChangeListener { - override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) { - if (fromUser) { - seekBarProgressChangeFlow.tryEmit(progress) - } + binding.slider.addOnChangeListener { _, value, fromUser -> + if (fromUser) { + seekPositionFlow.tryEmit(value.toInt()) } - - override fun onStartTrackingTouch(seekBar: SeekBar?) = Unit - - override fun onStopTrackingTouch(seekBar: SeekBar?) = Unit - }) + } } @OptIn(FlowPreview::class) - private fun collectSeekBarChanges() { + private fun collectSeekPositions() { val viewScope = viewScope ?: return val lifecycleOwner = (context as? LifecycleOwner) ?: return - seekBarProgressChangeFlow - .debounce(PROGRESS_CHANGE_DEBOUNCE_MS) + seekPositionFlow + .debounce(PROGRESS_CHANGE_DEBOUNCE_MS.milliseconds) .flowWithLifecycle(lifecycleOwner.lifecycle, Lifecycle.State.STARTED) .onEach { playbackModel.seekToPosition(it.toLong()) } .launchIn(viewScope) } private fun render(playbackState: PlaybackState) { - renderRepeatButton(playbackState.repeatMode == RepeatMode.SINGLE) - renderShuffleButton(playbackState.shuffle) - renderPlayPauseButton(playbackState.currentItemState?.playerState == PlayerState.PLAYING) - renderNextPreviousButtons() - renderProgressBar(playbackState.currentItemState) - } - - private fun renderRepeatButton(repeatSingle: Boolean) { - binding.ivRepeat.iconTint = ContextCompat.getColorStateList( - binding.root.context, - if (repeatSingle) { - R.color.player_accent_color - } else { - R.color.player_default_icon_color - } - ) - binding.ivRepeat.tag = if (repeatSingle) TAG_CLICK_COMMAND_DO_NOT_REPEAT else TAG_CLICK_COMMAND_REPEAT - } - - private fun renderShuffleButton(shuffle: Boolean) { - binding.ivRandom.iconTint = ContextCompat.getColorStateList( - binding.root.context, - if (shuffle) { - R.color.player_accent_color - } else { - R.color.player_default_icon_color - } - ) - binding.ivRandom.tag = if (shuffle) TAG_CLICK_COMMAND_DO_NOT_SHUFFLE else TAG_CLICK_COMMAND_SHUFFLE - } - - private fun renderPlayPauseButton(isPlaying: Boolean) { - binding.ivPlayPause.icon = AppCompatResources.getDrawable( - binding.root.context, - if (isPlaying) { - R.drawable.player_ic_pause - } else { - R.drawable.player_ic_play - } - ) - binding.ivPlayPause.tag = if (isPlaying) TAG_CLICK_COMMAND_PAUSE else TAG_CLICK_COMMAND_PLAY - } - - private fun renderNextPreviousButtons() { + binding.ivRepeat.isChecked = playbackState.repeatMode == RepeatMode.SINGLE + binding.ivRandom.isChecked = playbackState.shuffle + binding.ivPlayPause.isChecked = playbackState.currentItemState?.playerState == PlayerState.PLAYING binding.ivNext.isEnabled = navigator?.hasNext == true binding.ivPrevious.isEnabled = navigator?.hasPrevious == true + renderProgress(playbackState.currentItemState) } - private fun renderProgressBar(playbackItemState: PlaybackItemState?) { + private fun renderProgress(playbackItemState: PlaybackItemState?) { val enabled = playbackItemState != null && playbackItemState.maxTimeInMilliseconds > DEFAULT_MIN_PROGRESS val max = if (enabled) playbackItemState.maxTimeInMilliseconds.toInt() else DEFAULT_MAX_PROGRESS val progress = if (enabled) playbackItemState.currentTimeInMilliseconds.toInt() else DEFAULT_MIN_PROGRESS - binding.progressBar.isEnabled = enabled - binding.progressBar.max = max - binding.progressBar.progress = progress + binding.slider.isEnabled = enabled + moveSliderTo(max.toFloat(), progress.toFloat()) binding.tvElapsed.text = if (enabled) formatTime(progress, max) else INDETERMINATE_TIME binding.tvTotalTime.text = if (enabled) formatTime(max, max) else INDETERMINATE_TIME } + private fun moveSliderTo(valueTo: Float, value: Float) { + binding.slider.run { + if (this.valueTo != valueTo) { + this.value = valueFrom + this.valueTo = valueTo + } + this.value = value.coerceIn(valueFrom, this.valueTo) + } + } + private fun formatTime(current: Int, max: Int): String { val seconds = current / MILLISECONDS_IN_SECOND val minutes = seconds / SECONDS_IN_MINUTE diff --git a/app/src/main/java/com/nextcloud/client/player/ui/video/VideoPlayerView.kt b/app/src/main/java/com/nextcloud/client/player/ui/video/VideoPlayerView.kt index 652f2b204212..125e3e9890ba 100644 --- a/app/src/main/java/com/nextcloud/client/player/ui/video/VideoPlayerView.kt +++ b/app/src/main/java/com/nextcloud/client/player/ui/video/VideoPlayerView.kt @@ -21,6 +21,7 @@ import com.owncloud.android.R import kotlinx.coroutines.Job import kotlinx.coroutines.delay import kotlinx.coroutines.launch +import kotlin.time.Duration.Companion.milliseconds class VideoPlayerView(context: Context) : PlayerView(context) { @@ -35,7 +36,7 @@ class VideoPlayerView(context: Context) : PlayerView(context) { private var hideControlsTimerJob: Job? = null init { - topBar.setBackgroundResource(R.color.player_video_toolbar_background_color) + topBar.setBackgroundResource(R.drawable.player_video_top_scrim) } override fun onStart() { @@ -55,7 +56,7 @@ class VideoPlayerView(context: Context) : PlayerView(context) { val windowInsetsCompat = WindowInsetsCompat.toWindowInsetsCompat(windowInsets) val insets = windowInsetsCompat.getInsets(Type.systemBars() or Type.displayCutout()) - topBar.setPadding(insets.left, insets.top, insets.right, 0) + applyTopBarInsets(insets) playerControlView.setPadding(insets.left, 0, insets.right, insets.bottom) windowWrapper.setupStatusBar(R.color.player_video_toolbar_background_color) @@ -98,7 +99,7 @@ class VideoPlayerView(context: Context) : PlayerView(context) { } hideControlsTimerJob = activity.lifecycleScope.launch { - delay(HIDE_CONTROLS_DELAY) + delay(HIDE_CONTROLS_DELAY.milliseconds) hideControls() } } diff --git a/app/src/main/res/color/player_control_icon_tint.xml b/app/src/main/res/color/player_control_icon_tint.xml new file mode 100644 index 000000000000..fa19cdbade74 --- /dev/null +++ b/app/src/main/res/color/player_control_icon_tint.xml @@ -0,0 +1,16 @@ + + + + + + + + diff --git a/app/src/main/res/drawable/player_ic_pause.xml b/app/src/main/res/drawable/player_ic_pause.xml index c756bb9e0f11..cbc0027a8895 100644 --- a/app/src/main/res/drawable/player_ic_pause.xml +++ b/app/src/main/res/drawable/player_ic_pause.xml @@ -7,11 +7,11 @@ + android:viewportWidth="24" + android:viewportHeight="24"> + android:pathData="M6,19h4V5H6v14zM14,5v14h4V5h-4z" /> diff --git a/app/src/main/res/drawable/player_ic_play.xml b/app/src/main/res/drawable/player_ic_play.xml index 075c21089ef0..eaf659d28052 100644 --- a/app/src/main/res/drawable/player_ic_play.xml +++ b/app/src/main/res/drawable/player_ic_play.xml @@ -7,11 +7,11 @@ + android:viewportWidth="24" + android:viewportHeight="24"> + android:pathData="M8,5v14l11,-7z" /> diff --git a/app/src/main/res/drawable/player_progress_thumb_selector.xml b/app/src/main/res/drawable/player_ic_play_pause.xml similarity index 63% rename from app/src/main/res/drawable/player_progress_thumb_selector.xml rename to app/src/main/res/drawable/player_ic_play_pause.xml index dc274c5987b4..5be14e39a400 100644 --- a/app/src/main/res/drawable/player_progress_thumb_selector.xml +++ b/app/src/main/res/drawable/player_ic_play_pause.xml @@ -7,9 +7,9 @@ + android:drawable="@drawable/player_ic_pause" + android:state_checked="true" /> - + diff --git a/app/src/main/res/drawable/player_progress_drawable.xml b/app/src/main/res/drawable/player_progress_drawable.xml deleted file mode 100644 index e5be77b41f13..000000000000 --- a/app/src/main/res/drawable/player_progress_drawable.xml +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/player_progress_thumb.xml b/app/src/main/res/drawable/player_progress_thumb.xml deleted file mode 100644 index 59b7d9087570..000000000000 --- a/app/src/main/res/drawable/player_progress_thumb.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/player_progress_thumb_pressed.xml b/app/src/main/res/drawable/player_progress_thumb_pressed.xml deleted file mode 100644 index 034ea94b38bf..000000000000 --- a/app/src/main/res/drawable/player_progress_thumb_pressed.xml +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/drawable/player_video_control_scrim.xml b/app/src/main/res/drawable/player_video_control_scrim.xml new file mode 100644 index 000000000000..caa78d3511f1 --- /dev/null +++ b/app/src/main/res/drawable/player_video_control_scrim.xml @@ -0,0 +1,15 @@ + + + + + + diff --git a/app/src/main/res/drawable/player_video_top_scrim.xml b/app/src/main/res/drawable/player_video_top_scrim.xml new file mode 100644 index 000000000000..28424508e791 --- /dev/null +++ b/app/src/main/res/drawable/player_video_top_scrim.xml @@ -0,0 +1,15 @@ + + + + + + diff --git a/app/src/main/res/layout/player_audio_file_fragment.xml b/app/src/main/res/layout/player_audio_file_fragment.xml index 4a1430541ff0..02e5603116cc 100644 --- a/app/src/main/res/layout/player_audio_file_fragment.xml +++ b/app/src/main/res/layout/player_audio_file_fragment.xml @@ -42,7 +42,7 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" app:layout_constraintWidth_max="@dimen/player_album_cover_size" - app:shapeAppearance="@style/ShapeAppearance.App.Player.Media" /> + app:shapeAppearance="@style/ShapeAppearance.App.Player.AlbumCover" /> - + android:layout_height="wrap_content" + android:layout_weight="1" /> + + + + + + + app:icon="@drawable/player_ic_play_pause" /> + + + + + + diff --git a/app/src/main/res/layout/player_top_bar.xml b/app/src/main/res/layout/player_top_bar.xml index 5aa851214be7..b6de94155ea8 100644 --- a/app/src/main/res/layout/player_top_bar.xml +++ b/app/src/main/res/layout/player_top_bar.xml @@ -5,39 +5,15 @@ ~ SPDX-License-Identifier: AGPL-3.0-or-later --> - - - - - - - - - + app:menu="@menu/player_top_bar" + app:navigationContentDescription="@string/common_back" + app:navigationIcon="@drawable/ic_arrow_back" + tools:title="Player title" /> diff --git a/app/src/main/res/layout/player_video_view.xml b/app/src/main/res/layout/player_video_view.xml index 6947f266bafd..dfa6d20b83a5 100644 --- a/app/src/main/res/layout/player_video_view.xml +++ b/app/src/main/res/layout/player_video_view.xml @@ -22,6 +22,6 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="bottom" - android:background="@color/player_video_control_view_background_color" /> + android:background="@drawable/player_video_control_scrim" /> diff --git a/app/src/main/res/layout/preview_playback_fragment.xml b/app/src/main/res/layout/preview_playback_fragment.xml index b20ee525a64f..2362b23a4631 100644 --- a/app/src/main/res/layout/preview_playback_fragment.xml +++ b/app/src/main/res/layout/preview_playback_fragment.xml @@ -36,6 +36,6 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="bottom" - android:background="@color/player_video_control_view_background_color" /> + android:background="@drawable/player_video_control_scrim" /> diff --git a/app/src/main/res/menu/player_top_bar.xml b/app/src/main/res/menu/player_top_bar.xml new file mode 100644 index 000000000000..615cd9b2df21 --- /dev/null +++ b/app/src/main/res/menu/player_top_bar.xml @@ -0,0 +1,17 @@ + + + + + + diff --git a/app/src/main/res/values-large/dims.xml b/app/src/main/res/values-large/dims.xml index b7f1e53ab405..33939cb9b099 100644 --- a/app/src/main/res/values-large/dims.xml +++ b/app/src/main/res/values-large/dims.xml @@ -6,9 +6,7 @@ --> 64dp - 12dp 24dp 24dp 48dp - 40dp \ No newline at end of file diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index afad3b71b8d4..5a05b4786e5f 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -91,7 +91,6 @@ #EFEFEF - @color/color_accent #111111 @color/white @color/white @@ -99,8 +98,6 @@ @color/white #21000000 #21000000 + #B3000000 #979797 - #33000000 - #40FFFFFF - #CFCFCF diff --git a/app/src/main/res/values/dims.xml b/app/src/main/res/values/dims.xml index e24be6d7d9be..14c61d430785 100644 --- a/app/src/main/res/values/dims.xml +++ b/app/src/main/res/values/dims.xml @@ -167,28 +167,13 @@ 56dp - 21sp - 24dp - 4dp - 12dp 16dp 16dp - 16sp 8dp - 12sp 32dp 350dp 96dp - 24dp @dimen/standard_padding @dimen/standard_padding - 2dp - 4dp - 12dp - 24dp - 1dp - 12dp - 15sp - 16dp 8dp diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 218a002a027b..8290142dd8f3 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -519,66 +519,74 @@ true end center - @color/player_default_text_color @style/TextAppearance.App.Player.ProgressTime + @color/player_default_text_color - - + + - - - @dimen/minimum_size_for_touchable_area - @dimen/minimum_size_for_touchable_area + - 0dp - 0dp - 0dp - 0dp - 0dp + - @dimen/player_button_margin_horizontal - @dimen/player_button_margin_horizontal +