Skip to content

Commit

Permalink
refactor regarding viewBinding, update kotlin and gradle plugin
Browse files Browse the repository at this point in the history
  • Loading branch information
Marchuck authored and dturner committed Jun 19, 2020
1 parent bd3a6a3 commit 8051827
Show file tree
Hide file tree
Showing 8 changed files with 42 additions and 46 deletions.
6 changes: 6 additions & 0 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -38,9 +38,15 @@ android {
useSupportLibrary true
}
}

viewBinding {
enabled = true
}

dataBinding {
enabled = true
}

buildTypes {
release {
minifyEnabled false
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,17 +23,11 @@ import android.view.ViewGroup
import androidx.fragment.app.Fragment
import androidx.lifecycle.Observer
import androidx.lifecycle.ViewModelProviders
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.example.android.uamp.MediaItemAdapter
import com.example.android.uamp.MediaItemData
import com.example.android.uamp.R
import com.example.android.uamp.databinding.FragmentMediaitemListBinding
import com.example.android.uamp.utils.InjectorUtils
import com.example.android.uamp.viewmodels.MainActivityViewModel
import com.example.android.uamp.viewmodels.MediaItemFragmentViewModel
import kotlinx.android.synthetic.main.fragment_mediaitem_list.list
import kotlinx.android.synthetic.main.fragment_mediaitem_list.loadingSpinner
import kotlinx.android.synthetic.main.fragment_mediaitem_list.networkError

/**
* A fragment representing a list of MediaItems.
Expand All @@ -42,6 +36,7 @@ class MediaItemFragment : Fragment() {
private lateinit var mediaId: String
private lateinit var mainActivityViewModel: MainActivityViewModel
private lateinit var mediaItemFragmentViewModel: MediaItemFragmentViewModel
private lateinit var binding: FragmentMediaitemListBinding

private val listAdapter = MediaItemAdapter { clickedItem ->
mainActivityViewModel.mediaItemClicked(clickedItem)
Expand All @@ -62,7 +57,8 @@ class MediaItemFragment : Fragment() {
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
return inflater.inflate(R.layout.fragment_mediaitem_list, container, false)
binding = FragmentMediaitemListBinding.inflate(inflater, container, false)
return binding.root
}

override fun onActivityCreated(savedInstanceState: Bundle?) {
Expand All @@ -80,21 +76,18 @@ class MediaItemFragment : Fragment() {
.of(this, InjectorUtils.provideMediaItemFragmentViewModel(context, mediaId))
.get(MediaItemFragmentViewModel::class.java)
mediaItemFragmentViewModel.mediaItems.observe(this,
Observer<List<MediaItemData>> { list ->
loadingSpinner.visibility =
Observer { list ->
binding.loadingSpinner.visibility =
if (list?.isNotEmpty() == true) View.GONE else View.VISIBLE
listAdapter.submitList(list)
})
mediaItemFragmentViewModel.networkError.observe(this,
Observer<Boolean> { error ->
networkError.visibility = if (error) View.VISIBLE else View.GONE
Observer { error ->
binding.networkError.visibility = if (error) View.VISIBLE else View.GONE
})

// Set the adapter
if (list is RecyclerView) {
list.layoutManager = LinearLayoutManager(list.context)
list.adapter = listAdapter
}
binding.list.adapter = listAdapter
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,14 +21,12 @@ import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ImageButton
import android.widget.ImageView
import android.widget.TextView
import androidx.fragment.app.Fragment
import androidx.lifecycle.Observer
import androidx.lifecycle.ViewModelProviders
import com.bumptech.glide.Glide
import com.example.android.uamp.R
import com.example.android.uamp.databinding.FragmentNowplayingBinding
import com.example.android.uamp.utils.InjectorUtils
import com.example.android.uamp.viewmodels.MainActivityViewModel
import com.example.android.uamp.viewmodels.NowPlayingFragmentViewModel
Expand All @@ -40,7 +38,8 @@ import com.example.android.uamp.viewmodels.NowPlayingFragmentViewModel.NowPlayin
class NowPlayingFragment : Fragment() {
private lateinit var mainActivityViewModel: MainActivityViewModel
private lateinit var nowPlayingViewModel: NowPlayingFragmentViewModel
private lateinit var positionTextView: TextView

lateinit var binding: FragmentNowplayingBinding

companion object {
fun newInstance() = NowPlayingFragment()
Expand All @@ -50,7 +49,8 @@ class NowPlayingFragment : Fragment() {
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
return inflater.inflate(R.layout.fragment_nowplaying, container, false)
binding = FragmentNowplayingBinding.inflate(inflater, container, false)
return binding.root
}

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
Expand All @@ -72,40 +72,36 @@ class NowPlayingFragment : Fragment() {
Observer { mediaItem -> updateUI(view, mediaItem) })
nowPlayingViewModel.mediaButtonRes.observe(this,
Observer { res ->
view.findViewById<ImageView>(R.id.media_button).setImageResource(res)
binding.mediaButton.setImageResource(res)
})
nowPlayingViewModel.mediaPosition.observe(this,
Observer { pos ->
positionTextView.text =
NowPlayingMetadata.timestampToMSS(context, pos)
binding.position.text = NowPlayingMetadata.timestampToMSS(context, pos)
})

// Setup UI handlers for buttons
view.findViewById<ImageButton>(R.id.media_button).setOnClickListener {
binding.mediaButton.setOnClickListener {
nowPlayingViewModel.mediaMetadata.value?.let { mainActivityViewModel.playMediaId(it.id) }
}

// Initialize playback duration and position to zero
view.findViewById<TextView>(R.id.duration).text =
NowPlayingMetadata.timestampToMSS(context, 0L)
positionTextView = view.findViewById<TextView>(R.id.position)
.apply { text = NowPlayingMetadata.timestampToMSS(context, 0L) }
binding.duration.text = NowPlayingMetadata.timestampToMSS(context, 0L)
binding.position.text = NowPlayingMetadata.timestampToMSS(context, 0L)
}

/**
* Internal function used to update all UI elements except for the current item playback
*/
private fun updateUI(view: View, metadata: NowPlayingFragmentViewModel.NowPlayingMetadata) {
val albumArtView = view.findViewById<ImageView>(R.id.albumArt)
private fun updateUI(view: View, metadata: NowPlayingMetadata) = with(binding) {
if (metadata.albumArtUri == Uri.EMPTY) {
albumArtView.setImageResource(R.drawable.ic_album_black_24dp)
albumArt.setImageResource(R.drawable.ic_album_black_24dp)
} else {
Glide.with(view)
.load(metadata.albumArtUri)
.into(albumArtView)
.into(albumArt)
}
view.findViewById<TextView>(R.id.title).text = metadata.title
view.findViewById<TextView>(R.id.subtitle).text = metadata.subtitle
view.findViewById<TextView>(R.id.duration).text = metadata.duration
title.text = metadata.title
subtitle.text = metadata.subtitle
duration.text = metadata.duration
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,7 @@ class NowPlayingFragmentViewModel(
postValue(0L)
}
val mediaButtonRes = MutableLiveData<Int>().apply {
postValue(com.example.android.uamp.R.drawable.ic_album_black_24dp)
postValue(R.drawable.ic_album_black_24dp)
}

private var updatePosition = true
Expand Down Expand Up @@ -201,4 +201,4 @@ class NowPlayingFragmentViewModel(
}

private const val TAG = "NowPlayingFragmentVM"
private const val POSITION_UPDATE_INTERVAL_MILLIS = 100L
private const val POSITION_UPDATE_INTERVAL_MILLIS = 100L
5 changes: 3 additions & 2 deletions app/src/main/res/layout/fragment_mediaitem_list.xml
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
<?xml version="1.0" encoding="utf-8"?><!--
~ Copyright 2017 Google Inc. All rights reserved.
~
~ Licensed under the Apache License, Version 2.0 (the "License");
Expand All @@ -26,6 +25,8 @@
style="@style/MediaItemList"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
tools:context="com.example.android.uamp.fragments.MediaItemFragment"
tools:listitem="@layout/fragment_mediaitem" />

Expand Down
4 changes: 2 additions & 2 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ buildscript {
gradle_version = '3.1.4'
gson_version = '2.8.5'
junit_version = '4.12'
kotlin_version = '1.3.31'
kotlin_version = '1.3.72'
kotlin_coroutines_version = '1.1.0'
play_services_auth_version = '17.0.0'
recycler_view_version = '1.0.0'
Expand All @@ -52,7 +52,7 @@ buildscript {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.5.1'
classpath 'com.android.tools.build:gradle:4.0.0'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
classpath "com.google.android.gms:strict-version-matcher-plugin:$gms_strict_version_matcher_version"

Expand Down
2 changes: 1 addition & 1 deletion gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ android.enableJetifier=true
android.useAndroidX=true
org.gradle.jvmargs=-Xmx1536m
# Required by Robolectric.
android.enableUnitTestBinaryResources=true
#android.enableUnitTestBinaryResources=true
# When configured, Gradle will run in incubating parallel mode.
# This option should only be used with decoupled projects. More details, visit
# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
Expand Down
4 changes: 2 additions & 2 deletions gradle/wrapper/gradle-wrapper.properties
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
#Wed Oct 23 12:39:30 CEST 2019
#Thu Jun 18 22:31:29 CEST 2020
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-5.4.1-all.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-6.1.1-all.zip

0 comments on commit 8051827

Please sign in to comment.