Add play/pause controls

Add play/pause controls to the playback fragments.
This commit is contained in:
OxygenCobalt 2020-10-11 11:02:04 -06:00
parent 0c069dfbac
commit eb6839b10c
33 changed files with 207 additions and 60 deletions

View file

@ -103,7 +103,7 @@ class AlbumDetailFragment : Fragment() {
}
}
binding.albumArtist.setBackgroundResource(R.drawable.ripple)
binding.albumArtist.setBackgroundResource(R.drawable.ui_ripple)
}
Log.d(this::class.simpleName, "Fragment created.")

View file

@ -109,7 +109,7 @@ class LoadingFragment : Fragment(R.layout.fragment_loading) {
) == PackageManager.PERMISSION_DENIED
}
// Remove the loading indicator and show the error groups
// Remove the loading ui_indicator and show the error groups
private fun showError(binding: FragmentLoadingBinding) {
binding.loadingBar.visibility = View.GONE
binding.loadingErrorIcon.visibility = View.VISIBLE

View file

@ -66,7 +66,7 @@ class MusicLoader(
private fun loadGenres() {
Log.d(this::class.simpleName, "Starting genre search...")
// First, get a cursor for every genre in the android system
// First, get a ui_cursor for every genre in the android system
genreCursor = resolver.query(
Genres.EXTERNAL_CONTENT_URI,
arrayOf(

View file

@ -7,6 +7,7 @@ import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
import androidx.fragment.app.activityViewModels
import org.oxycblt.auxio.R
import org.oxycblt.auxio.databinding.FragmentCompactPlaybackBinding
import org.oxycblt.auxio.music.MusicViewModel
@ -31,6 +32,7 @@ class CompactPlaybackFragment : Fragment() {
// Put a placeholder song in the binding & hide the playback fragment initially,
// as for some reason the attach event doesn't register anymore w/LiveData
binding.song = musicModel.songs.value!![0]
binding.playbackModel = playbackModel
binding.root.visibility = View.GONE
binding.root.setOnClickListener {
@ -54,6 +56,15 @@ class CompactPlaybackFragment : Fragment() {
}
}
// TODO: Animate this icon
playbackModel.isPlaying.observe(viewLifecycleOwner) {
if (it) {
binding.songControls.setImageResource(R.drawable.ic_pause)
} else {
binding.songControls.setImageResource(R.drawable.ic_play)
}
}
Log.d(this::class.simpleName, "Fragment Created")
return binding.root

View file

@ -1,17 +1,22 @@
package org.oxycblt.auxio.playback
import android.content.res.ColorStateList
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.activityViewModels
import com.google.android.material.bottomsheet.BottomSheetDialogFragment
import org.oxycblt.auxio.R
import org.oxycblt.auxio.databinding.FragmentPlaybackBinding
import org.oxycblt.auxio.theme.accent
import org.oxycblt.auxio.theme.toColor
class PlaybackFragment : BottomSheetDialogFragment() {
private val playbackModel: PlaybackViewModel by activityViewModels()
// TODO: Implement nav to artists/albums
// TODO: Add a full playback fragment
// TODO: Possibly implement a trackbar with a spectrum shown as well.
override fun onCreateView(
inflater: LayoutInflater,
@ -20,18 +25,39 @@ class PlaybackFragment : BottomSheetDialogFragment() {
): View? {
val binding = FragmentPlaybackBinding.inflate(inflater)
val accentColor = ColorStateList.valueOf(accent.first.toColor(requireContext()))
val white = ColorStateList.valueOf(android.R.color.white.toColor(requireContext()))
// --- UI SETUP ---
binding.playbackModel = playbackModel
// Make marquee scroll work
binding.songName.isSelected = true
binding.songAlbum.isSelected = true
binding.songArtist.isSelected = true
binding.playbackSong.isSelected = true
binding.playbackAlbum.isSelected = true
binding.playbackArtist.isSelected = true
// Override the accents manually because the BottomSheetFragment is too dumb to do it themselves.
binding.playbackSeekBar.thumbTintList = accentColor
binding.playbackSeekBar.progressTintList = accentColor
binding.playbackSeekBar.progressBackgroundTintList = accentColor
// --- VIEWMODEL SETUP --
playbackModel.currentSong.observe(viewLifecycleOwner) {
binding.song = it
}
playbackModel.isPlaying.observe(viewLifecycleOwner) {
if (it) {
binding.playbackPlayPause.setImageResource(R.drawable.ic_pause)
binding.playbackPlayPause.backgroundTintList = accentColor
} else {
binding.playbackPlayPause.setImageResource(R.drawable.ic_play)
binding.playbackPlayPause.backgroundTintList = white
}
}
return binding.root
}
}

View file

@ -7,6 +7,8 @@ import org.oxycblt.auxio.music.Song
// TODO: Implement media controls
// TODO: Add the playback service itself
// TODO: Possibly add some swipe-to-next-track function, could require a ViewPager.
// A ViewModel that acts as an intermediary between PlaybackService and the Playback Fragments.
class PlaybackViewModel : ViewModel() {
private val mCurrentSong = MutableLiveData<Song>()
val currentSong: LiveData<Song> get() = mCurrentSong
@ -14,8 +16,12 @@ class PlaybackViewModel : ViewModel() {
private val mShouldOpenPlayback = MutableLiveData<Boolean>()
val shouldOpenPlayback: LiveData<Boolean> get() = mShouldOpenPlayback
private val mIsPlaying = MutableLiveData(false)
val isPlaying: LiveData<Boolean> get() = mIsPlaying
fun updateSong(song: Song) {
mCurrentSong.value = song
mIsPlaying.value = true
}
fun openPlayback() {
@ -25,4 +31,9 @@ class PlaybackViewModel : ViewModel() {
fun doneWithOpenPlayback() {
mShouldOpenPlayback.value = false
}
// Invert, not directly set the p
fun invertPlayingStatus() {
mIsPlaying.value = !mIsPlaying.value!!
}
}

View file

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="30dp"
android:height="30dp"
android:viewportWidth="24"
android:viewportHeight="24"
android:tint="@color/control_color">
<path
android:fillColor="@android:color/white"
android:pathData="M6,19h4L10,5L6,5v14zM14,5v14h4L18,5h-4z" />
</vector>

View file

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="30dp"
android:height="30dp"
android:viewportWidth="24"
android:viewportHeight="24"
android:tint="@color/control_color">
<path
android:name="play"
android:fillColor="@android:color/white"
android:pathData="M8,5v14l11,-7z" />
</vector>

View file

@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
android:color="@color/selection_color">
<item>
<shape android:shape="oval">
<solid android:color="@android:color/white" />
</shape>
</item>
</ripple>

View file

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?><!--
Custom cursor shape that reflects the current accent color.
Custom ui_cursor shape that reflects the current accent color.
https://stackoverflow.com/a/28311351/14143986
-->
<shape xmlns:android="http://schemas.android.com/apk/res/android"

View file

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<shape android:shape="oval">
<solid android:color="?android:attr/colorPrimary" />
</shape>
</item>
</selector>

View file

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
android:color="@color/selection_color"
android:radius="24dp" />

View file

@ -103,7 +103,7 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="@dimen/padding_medium"
android:background="@drawable/header_dividers"
android:background="@drawable/ui_header_dividers"
android:fontFamily="@font/inter_bold"
android:paddingStart="@dimen/padding_medium"
android:paddingTop="@dimen/padding_small"
@ -119,7 +119,7 @@
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_marginTop="@dimen/margin_medium"
android:background="@drawable/header_dividers"
android:background="@drawable/ui_header_dividers"
android:contentDescription="@string/description_sort_button"
android:paddingStart="@dimen/padding_medium"
android:paddingTop="@dimen/padding_small"

View file

@ -100,7 +100,7 @@
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_marginTop="@dimen/margin_medium"
android:background="@drawable/header_dividers"
android:background="@drawable/ui_header_dividers"
android:fontFamily="@font/inter_bold"
android:paddingStart="@dimen/padding_medium"
android:paddingTop="@dimen/padding_small"
@ -117,7 +117,7 @@
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_marginTop="@dimen/margin_medium"
android:background="@drawable/header_dividers"
android:background="@drawable/ui_header_dividers"
android:contentDescription="@string/description_sort_button"
android:paddingStart="@dimen/padding_medium"
android:paddingTop="@dimen/padding_small"

View file

@ -9,18 +9,22 @@
<variable
name="song"
type="org.oxycblt.auxio.music.Song" />
<variable
name="playbackModel"
type="org.oxycblt.auxio.playback.PlaybackViewModel" />
</data>
<androidx.constraintlayout.widget.ConstraintLayout
android:animateLayoutChanges="true"
android:background="@drawable/ripple"
android:background="@drawable/ui_ripple"
android:clickable="true"
android:focusable="true"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ProgressBar
android:id="@+id/song_progress"
android:id="@+id/playback_progress"
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="match_parent"
android:layout_height="@dimen/playback_progress_size"
@ -32,7 +36,7 @@
tools:progress="70" />
<ImageView
android:id="@+id/album_cover"
android:id="@+id/playback_cover"
android:layout_width="@dimen/cover_size_compact"
android:layout_height="@dimen/cover_size_compact"
android:contentDescription="@{@string/description_album_cover(song.name)}"
@ -40,42 +44,58 @@
app:coverArt="@{song}"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/song_progress"
app:layout_constraintTop_toBottomOf="@+id/playback_progress"
tools:src="@drawable/ic_song" />
<TextView
android:id="@+id/song_name"
android:id="@+id/playback_song"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:fontFamily="@font/inter_semibold"
android:text="@{song.name}"
android:layout_marginStart="@dimen/margin_smallish"
android:textAppearance="@style/TextAppearance.SmallHeader"
android:singleLine="true"
android:layout_marginEnd="@dimen/margin_smallish"
android:ellipsize="marquee"
android:fontFamily="@font/inter_semibold"
android:marqueeRepeatLimit="marquee_forever"
app:layout_constraintBottom_toTopOf="@+id/song_info"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@+id/album_cover"
android:singleLine="true"
android:text="@{song.name}"
android:textAppearance="@style/TextAppearance.SmallHeader"
app:layout_constraintBottom_toTopOf="@+id/playback_info"
app:layout_constraintEnd_toStartOf="@+id/playback_controls"
app:layout_constraintStart_toEndOf="@+id/playback_cover"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_chainStyle="packed"
tools:text="Song Name" />
<TextView
android:id="@+id/song_info"
android:id="@+id/playback_info"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/margin_smallish"
android:layout_marginEnd="@dimen/margin_smallish"
android:ellipsize="marquee"
android:singleLine="true"
android:marqueeRepeatLimit="marquee_forever"
android:textAppearance="@style/TextAppearance.MaterialComponents.Caption"
android:singleLine="true"
android:text="@{@string/format_info(song.album.artist.name, song.album.name)}"
android:textAppearance="@style/TextAppearance.MaterialComponents.Caption"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/playback_controls"
app:layout_constraintStart_toEndOf="@+id/playback_cover"
app:layout_constraintTop_toBottomOf="@+id/playback_song"
tools:text="Artist Name / Album Name" />
<ImageButton
android:id="@+id/playback_controls"
style="@style/Widget.AppCompat.Button.Borderless"
android:layout_marginEnd="@dimen/margin_smallish"
android:contentDescription="@{playbackModel.isPlaying ? @string/description_pause : @string/description_play}"
android:layout_width="@dimen/controls_size_compact"
android:layout_height="@dimen/controls_size_compact"
android:background="@drawable/ui_unbounded_ripple"
android:onClick="@{() -> playbackModel.invertPlayingStatus()}"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@+id/album_cover"
app:layout_constraintTop_toBottomOf="@+id/song_name"
tools:text="Artist Name / Album Name" />
app:layout_constraintTop_toTopOf="parent"
tools:src="@drawable/ic_play" />
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>

View file

@ -100,7 +100,7 @@
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_marginTop="@dimen/margin_medium"
android:background="@drawable/header_dividers"
android:background="@drawable/ui_header_dividers"
android:fontFamily="@font/inter_bold"
android:paddingStart="@dimen/padding_medium"
android:paddingTop="@dimen/padding_small"
@ -117,7 +117,7 @@
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_marginTop="@dimen/margin_medium"
android:background="@drawable/header_dividers"
android:background="@drawable/ui_header_dividers"
android:contentDescription="@string/description_sort_button"
android:paddingStart="@dimen/padding_medium"
android:paddingTop="@dimen/padding_small"

View file

@ -34,7 +34,7 @@
app:tabGravity="fill"
app:tabIconTint="?android:attr/colorPrimary"
app:tabIconTintMode="src_in"
app:tabIndicator="@drawable/indicator"
app:tabIndicator="@drawable/ui_indicator"
app:tabIndicatorColor="?android:attr/colorPrimary"
app:tabMode="fixed"
app:tabRippleColor="@color/selection_color"

View file

@ -8,17 +8,22 @@
<variable
name="song"
type="org.oxycblt.auxio.music.Song" />
<variable
name="playbackModel"
type="org.oxycblt.auxio.playback.PlaybackViewModel" />
</data>
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/playback_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/background"
android:padding="@dimen/padding_medium"
android:theme="@style/ThemeOverlay.AppCompat.DayNight">
android:theme="@style/ThemeOverlay.AppCompat.DayNight"
android:padding="@dimen/padding_medium">
<ImageView
android:id="@+id/album_cover"
android:id="@+id/playback_cover"
android:layout_width="@dimen/cover_size_playback"
android:layout_height="@dimen/cover_size_playback"
android:contentDescription="@{@string/description_album_cover(song.name)}"
@ -29,7 +34,7 @@
tools:src="@drawable/ic_song" />
<TextView
android:id="@+id/song_name"
android:id="@+id/playback_song"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/margin_medium"
@ -40,32 +45,33 @@
android:focusable="true"
android:text="@{song.name}"
android:textAppearance="@style/TextAppearance.MaterialComponents.Headline6"
app:layout_constraintBottom_toTopOf="@+id/song_artist"
app:layout_constraintBottom_toTopOf="@+id/playback_artist"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@+id/album_cover"
app:layout_constraintStart_toEndOf="@+id/playback_cover"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_chainStyle="packed"
tools:text="Song Name" />
<TextView
android:id="@+id/song_artist"
android:id="@+id/playback_artist"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/margin_medium"
android:singleLine="true"
android:ellipsize="marquee"
android:marqueeRepeatLimit="marquee_forever"
android:singleLine="true"
android:text="@{song.album.artist.name}"
android:textAppearance="@style/TextAppearance.MaterialComponents.Subtitle1"
android:textColor="?android:attr/textColorSecondary"
app:layout_constraintBottom_toTopOf="@+id/song_album"
app:layout_constraintBottom_toTopOf="@+id/playback_album"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@+id/album_cover"
app:layout_constraintTop_toBottomOf="@+id/song_name"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toEndOf="@+id/playback_cover"
app:layout_constraintTop_toBottomOf="@+id/playback_song"
tools:text="Artist Name" />
<TextView
android:id="@+id/song_album"
android:id="@+id/playback_album"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/margin_medium"
@ -75,24 +81,45 @@
android:text="@{song.album.name}"
android:textAppearance="@style/TextAppearance.MaterialComponents.Subtitle1"
android:textColor="?android:attr/textColorSecondary"
app:layout_constraintBottom_toBottomOf="@+id/album_cover"
app:layout_constraintBottom_toBottomOf="@+id/playback_cover"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@+id/album_cover"
app:layout_constraintTop_toBottomOf="@+id/song_artist"
app:layout_constraintStart_toEndOf="@+id/playback_cover"
app:layout_constraintTop_toBottomOf="@+id/playback_artist"
tools:text="Album Name" />
<SeekBar
android:id="@+id/song_seek_bar"
android:id="@+id/playback_seek_bar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/margin_medium"
android:paddingStart="6dp"
android:paddingEnd="6dp"
android:thumbTint="?android:attr/colorPrimary"
android:splitTrack="false"
android:progressBackgroundTint="?android:attr/colorControlNormal"
android:progressTint="?android:attr/colorPrimary"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/playback_cover"
tools:progress="70" />
<ImageButton
android:id="@+id/playback_play_pause"
android:layout_width="70dp"
android:layout_height="70dp"
android:layout_marginTop="@dimen/margin_medium"
android:layout_marginBottom="160dp"
android:layout_marginBottom="@dimen/margin_medium"
android:background="@drawable/ui_circular_button"
android:contentDescription="@{playbackModel.isPlaying ? @string/description_pause : @string/description_play}"
android:foregroundTint="@color/background"
android:onClick="@{() -> playbackModel.invertPlayingStatus()}"
android:tint="@color/background"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/album_cover" />
app:layout_constraintTop_toBottomOf="@+id/playback_seek_bar"
android:backgroundTint="?android:attr/colorPrimary"
tools:src="@drawable/ic_play" />
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>

View file

@ -14,7 +14,7 @@
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/ripple"
android:background="@drawable/ui_ripple"
android:clickable="true"
android:focusable="true"
android:padding="@dimen/padding_medium">

View file

@ -14,7 +14,7 @@
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/ripple"
android:background="@drawable/ui_ripple"
android:clickable="true"
android:focusable="true"
android:padding="@dimen/padding_medium">

View file

@ -14,7 +14,7 @@
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/ripple"
android:background="@drawable/ui_ripple"
android:clickable="true"
android:focusable="true"
android:padding="@dimen/padding_medium">

View file

@ -14,7 +14,7 @@
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/ripple"
android:background="@drawable/ui_ripple"
android:clickable="true"
android:focusable="true"
android:padding="@dimen/padding_medium">

View file

@ -14,7 +14,7 @@
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/ripple"
android:background="@drawable/ui_ripple"
android:clickable="true"
android:focusable="true"
android:padding="@dimen/padding_medium">

View file

@ -14,7 +14,7 @@
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/ripple"
android:background="@drawable/ui_ripple"
android:clickable="true"
android:focusable="true"
android:padding="@dimen/padding_medium">

View file

@ -19,7 +19,7 @@
android:id="@+id/header_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/header_dividers"
android:background="@drawable/ui_header_dividers"
android:fontFamily="@font/inter_bold"
android:paddingStart="@dimen/padding_medium"
android:paddingTop="@dimen/padding_small"

View file

@ -14,7 +14,7 @@
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/ripple"
android:background="@drawable/ui_ripple"
android:clickable="true"
android:focusable="true"
android:padding="@dimen/padding_medium">

View file

@ -7,6 +7,7 @@
<dimen name="margin_small">8dp</dimen>
<dimen name="margin_smallish">10dp</dimen>
<dimen name="margin_medium">16dp</dimen>
<dimen name="margin_large">24dp</dimen>
<dimen name="status_icon_size">48dp</dimen>
@ -31,5 +32,8 @@
<dimen name="playback_progress_size">2dp</dimen>
<dimen name="controls_size">70dp</dimen>
<dimen name="controls_size_compact">36dp</dimen>
<dimen name="elevation_normal">4dp</dimen>
</resources>

View file

@ -36,6 +36,8 @@
<string name="description_sort_none">Default Sort Order</string>
<string name="description_sort_alpha_down">Sort from A to Z</string>
<string name="description_sort_alpha_up">Sort from Z to A</string>
<string name="description_play">Play</string>
<string name="description_pause">Pause</string>
<!-- Placeholder Namespace | Placeholder values -->
<string name="placeholder_genre">Unknown Genre</string>

View file

@ -5,7 +5,7 @@
<item name="android:windowBackground">@color/background</item>
<item name="android:statusBarColor">@android:color/black</item>
<item name="android:fontFamily">@font/inter</item>
<item name="android:textCursorDrawable">@drawable/cursor</item>
<item name="android:textCursorDrawable">@drawable/ui_cursor</item>
<item name="actionBarPopupTheme">@style/AppThemeOverlay.Popup</item>
</style>
@ -35,4 +35,6 @@
<item name="android:colorBackground">@color/background</item>
<item name="colorControlHighlight">@color/selection_color</item>
</style>
<style name="Theme.BottomSheet" parent="Theme.Design.BottomSheetDialog" />
</resources>

View file

@ -7,7 +7,7 @@ buildscript {
jcenter()
}
dependencies {
classpath "com.android.tools.build:gradle:4.0.1"
classpath 'com.android.tools.build:gradle:4.0.2'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
classpath "android.arch.navigation:navigation-safe-args-gradle-plugin:1.0.0"