Skip to content

Commit 558ab6f

Browse files
authored
Migrate to View Binding and update dependencies (#432)
1 parent cf12779 commit 558ab6f

17 files changed

+353
-182
lines changed

test-app/r2-testapp/build.gradle

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -55,9 +55,11 @@ android {
5555
}
5656
kotlinOptions {
5757
jvmTarget = "1.8"
58+
freeCompilerArgs += "-Xopt-in=kotlin.RequiresOptIn"
5859
}
5960
buildFeatures {
6061
dataBinding = true
62+
viewBinding = true
6163
}
6264
buildTypes {
6365
release {
@@ -110,19 +112,20 @@ dependencies {
110112
implementation "com.github.readium:r2-lcp-kotlin:$READIUM_VERSION"
111113
}
112114

113-
implementation "androidx.activity:activity-ktx:1.3.0-alpha02"
114-
implementation "androidx.appcompat:appcompat:1.3.0-beta01"
115+
implementation 'androidx.core:core-ktx:1.5.0'
116+
implementation "androidx.activity:activity-ktx:1.2.3"
117+
implementation "androidx.appcompat:appcompat:1.3.0"
115118
implementation "androidx.browser:browser:1.3.0"
116119
implementation "androidx.cardview:cardview:1.0.0"
117120
implementation "androidx.constraintlayout:constraintlayout:2.0.4"
118-
implementation "androidx.fragment:fragment-ktx:1.3.0"
119-
implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.3.0"
120-
implementation "androidx.lifecycle:lifecycle-runtime-ktx:2.3.0"
121-
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.0"
122-
implementation 'androidx.navigation:navigation-fragment-ktx:2.3.4'
123-
implementation 'androidx.navigation:navigation-ui-ktx:2.3.4'
124-
implementation "androidx.paging:paging-runtime-ktx:3.0.0-rc01"
125-
implementation "androidx.recyclerview:recyclerview:1.1.0"
121+
implementation "androidx.fragment:fragment-ktx:1.3.4"
122+
implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.3.1"
123+
implementation "androidx.lifecycle:lifecycle-runtime-ktx:2.3.1"
124+
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1"
125+
implementation 'androidx.navigation:navigation-fragment-ktx:2.3.5'
126+
implementation 'androidx.navigation:navigation-ui-ktx:2.3.5'
127+
implementation "androidx.paging:paging-runtime-ktx:3.0.0"
128+
implementation "androidx.recyclerview:recyclerview:1.2.1"
126129
implementation "androidx.viewpager2:viewpager2:1.0.0"
127130
implementation "androidx.webkit:webkit:1.4.0"
128131
//noinspection GradleDependency
@@ -138,14 +141,14 @@ dependencies {
138141
// AM NOTE: needs to stay this version for now (June 24,2020)
139142
//noinspection GradleDependency
140143
implementation "com.squareup.picasso:picasso:2.5.2"
141-
implementation "joda-time:joda-time:2.10.5"
142-
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.4.2"
144+
implementation "joda-time:joda-time:2.10.10"
145+
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.4.3"
143146
// AM NOTE: needs to stay this version for now (June 24,2020)
144147
//noinspection GradleDependency
145148
implementation 'org.jsoup:jsoup:1.13.1'
146149

147150
// Room database
148-
final room_version = '2.2.6'
151+
final room_version = '2.3.0'
149152
implementation "androidx.room:room-runtime:$room_version"
150153
implementation "androidx.room:room-ktx:$room_version"
151154
kapt "androidx.room:room-compiler:$room_version"

test-app/r2-testapp/src/main/java/org/readium/r2/testapp/audiobook/AudioNavigatorFragment.kt

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,9 @@ package org.readium.r2.testapp.audiobook
88

99
import android.app.ProgressDialog
1010
import android.os.Bundle
11+
import android.view.LayoutInflater
1112
import android.view.View
12-
import android.widget.ImageView
13+
import android.view.ViewGroup
1314
import androidx.fragment.app.Fragment
1415
import androidx.fragment.app.FragmentFactory
1516
import androidx.lifecycle.lifecycleScope
@@ -21,18 +22,22 @@ import org.readium.r2.shared.publication.Locator
2122
import org.readium.r2.shared.publication.Publication
2223
import org.readium.r2.shared.publication.services.cover
2324
import org.readium.r2.testapp.R
25+
import org.readium.r2.testapp.databinding.FragmentAudiobookBinding
2426
import org.readium.r2.testapp.utils.createFragmentFactory
2527

2628
class AudioNavigatorFragment(
2729
val publication: Publication,
2830
private var initialLocator: Locator? = null,
2931
internal val listener: Listener? = null
30-
) : Fragment(R.layout.fragment_audiobook), Navigator {
32+
) : Fragment(), Navigator {
3133

3234
interface Listener : Navigator.Listener
3335

3436
private lateinit var activity: AudiobookActivity
3537

38+
private var _binding: FragmentAudiobookBinding? = null
39+
private val binding get() = _binding!!
40+
3641
override fun onCreate(savedInstanceState: Bundle?) {
3742
super.onCreate(savedInstanceState)
3843

@@ -41,6 +46,15 @@ class AudioNavigatorFragment(
4146
}
4247
}
4348

49+
override fun onCreateView(
50+
inflater: LayoutInflater,
51+
container: ViewGroup?,
52+
savedInstanceState: Bundle?
53+
): View {
54+
_binding = FragmentAudiobookBinding.inflate(inflater, container, false)
55+
return binding.root
56+
}
57+
4458
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
4559
super.onViewCreated(view, savedInstanceState)
4660

@@ -49,7 +63,7 @@ class AudioNavigatorFragment(
4963
// Setting cover
5064
viewLifecycleOwner.lifecycleScope.launch {
5165
publication.cover()?.let {
52-
view.findViewById<ImageView>(R.id.imageView).setImageBitmap(it)
66+
binding.imageView.setImageBitmap(it)
5367
}
5468
}
5569

@@ -59,6 +73,7 @@ class AudioNavigatorFragment(
5973

6074
override fun onDestroyView() {
6175
super.onDestroyView()
76+
_binding = null
6277
activity.mediaPlayer.progress!!.dismiss()
6378
}
6479

test-app/r2-testapp/src/main/java/org/readium/r2/testapp/catalogs/CatalogFeedListFragment.kt

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,9 @@ import androidx.fragment.app.viewModels
2121
import androidx.recyclerview.widget.LinearLayoutManager
2222
import androidx.recyclerview.widget.RecyclerView
2323
import com.google.android.material.dialog.MaterialAlertDialogBuilder
24-
import com.google.android.material.floatingactionbutton.FloatingActionButton
2524
import com.google.android.material.snackbar.Snackbar
2625
import org.readium.r2.testapp.R
26+
import org.readium.r2.testapp.databinding.FragmentCatalogFeedListBinding
2727
import org.readium.r2.testapp.domain.model.Catalog
2828

2929

@@ -32,13 +32,17 @@ class CatalogFeedListFragment : Fragment() {
3232
private val catalogFeedListViewModel: CatalogFeedListViewModel by viewModels()
3333
private lateinit var catalogsAdapter: CatalogFeedListAdapter
3434

35+
private var _binding: FragmentCatalogFeedListBinding? = null
36+
private val binding get() = _binding!!
37+
3538
override fun onCreateView(
3639
inflater: LayoutInflater,
3740
container: ViewGroup?,
3841
savedInstanceState: Bundle?
39-
): View? {
42+
): View {
4043
catalogFeedListViewModel.eventChannel.receive(this) { handleEvent(it) }
41-
return inflater.inflate(R.layout.fragment_catalog_feed_list, container, false)
44+
_binding = FragmentCatalogFeedListBinding.inflate(inflater, container, false)
45+
return binding.root
4246
}
4347

4448
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
@@ -49,7 +53,7 @@ class CatalogFeedListFragment : Fragment() {
4953

5054
catalogsAdapter = CatalogFeedListAdapter(onLongClick = { catalog -> onLongClick(catalog) })
5155

52-
view.findViewById<RecyclerView>(R.id.catalogFeed_list).apply {
56+
binding.catalogFeedList.apply {
5357
setHasFixedSize(true)
5458
layoutManager = LinearLayoutManager(requireContext())
5559
adapter = catalogsAdapter
@@ -92,7 +96,7 @@ class CatalogFeedListFragment : Fragment() {
9296
catalogFeedListViewModel.insertCatalog(sEBCatalog)
9397
}
9498

95-
view.findViewById<FloatingActionButton>(R.id.catalogFeed_addCatalogFab).setOnClickListener {
99+
binding.catalogFeedAddCatalogFab.setOnClickListener {
96100
val alertDialog = MaterialAlertDialogBuilder(requireContext())
97101
.setTitle(getString(R.string.add_catalog))
98102
.setView(R.layout.add_catalog_dialog)
@@ -121,6 +125,11 @@ class CatalogFeedListFragment : Fragment() {
121125
}
122126
}
123127

128+
override fun onDestroyView() {
129+
_binding = null
130+
super.onDestroyView()
131+
}
132+
124133
private fun handleEvent(event: CatalogFeedListViewModel.Event) {
125134
val message =
126135
when (event) {

test-app/r2-testapp/src/main/java/org/readium/r2/testapp/catalogs/CatalogFragment.kt

Lines changed: 20 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ import android.os.Bundle
1010
import android.view.*
1111
import android.widget.Button
1212
import android.widget.LinearLayout
13-
import android.widget.ProgressBar
1413
import android.widget.TextView
1514
import androidx.core.os.bundleOf
1615
import androidx.core.view.setPadding
@@ -25,6 +24,7 @@ import org.readium.r2.testapp.MainActivity
2524
import org.readium.r2.testapp.R
2625
import org.readium.r2.testapp.bookshelf.BookshelfFragment
2726
import org.readium.r2.testapp.catalogs.CatalogFeedListAdapter.Companion.CATALOGFEED
27+
import org.readium.r2.testapp.databinding.FragmentCatalogBinding
2828
import org.readium.r2.testapp.domain.model.Catalog
2929
import org.readium.r2.testapp.opds.GridAutoFitLayoutManager
3030

@@ -34,29 +34,30 @@ class CatalogFragment : Fragment() {
3434
private val catalogViewModel: CatalogViewModel by viewModels()
3535
private lateinit var catalogListAdapter: CatalogListAdapter
3636
private lateinit var catalog: Catalog
37-
private lateinit var progressBar: ProgressBar
3837
private var showFacetMenu = false
3938
private lateinit var facets: MutableList<Facet>
4039

40+
private var _binding: FragmentCatalogBinding? = null
41+
private val binding get() = _binding!!
42+
4143
// FIXME the entire way this fragment is built feels like a hack. Need a cleaner UI
4244
override fun onCreateView(
4345
inflater: LayoutInflater, container: ViewGroup?,
4446
savedInstanceState: Bundle?
45-
): View? {
47+
): View {
4648

4749
catalogViewModel.eventChannel.receive(this) { handleEvent(it) }
4850
catalog = arguments?.get(CATALOGFEED) as Catalog
49-
return inflater.inflate(R.layout.fragment_catalog, container, false)
51+
_binding = FragmentCatalogBinding.inflate(inflater, container, false)
52+
return binding.root
5053
}
5154

5255
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
5356
super.onViewCreated(view, savedInstanceState)
5457
catalogListAdapter = CatalogListAdapter()
55-
progressBar = view.findViewById(R.id.catalog_ProgressBar)
5658
setHasOptionsMenu(true)
57-
val catalogLayout = view.findViewById<LinearLayout>(R.id.catalog_LinearLayout)
5859

59-
view.findViewById<RecyclerView>(R.id.catalog_DetailList).apply {
60+
binding.catalogDetailList.apply {
6061
layoutManager = GridAutoFitLayoutManager(requireContext(), 120)
6162
adapter = catalogListAdapter
6263
addItemDecoration(
@@ -70,7 +71,7 @@ class CatalogFragment : Fragment() {
7071

7172
// TODO this feels hacky, I don't want to parse the file if it has not changed
7273
if (catalogViewModel.parseData.value == null) {
73-
progressBar.visibility = View.VISIBLE
74+
binding.catalogProgressBar.visibility = View.VISIBLE
7475
catalogViewModel.parseCatalog(catalog)
7576
}
7677
catalogViewModel.parseData.observe(viewLifecycleOwner, { result ->
@@ -101,7 +102,7 @@ class CatalogFragment : Fragment() {
101102
.navigate(R.id.action_navigation_catalog_self, bundle)
102103
}
103104
}
104-
catalogLayout.addView(button, index)
105+
binding.catalogLinearLayout.addView(button, index)
105106
}
106107

107108
if (result.feed!!.publications.isNotEmpty()) {
@@ -157,8 +158,8 @@ class CatalogFragment : Fragment() {
157158
submitList(group.publications)
158159
}
159160
}
160-
catalogLayout.addView(linearLayout)
161-
catalogLayout.addView(publicationRecyclerView)
161+
binding.catalogLinearLayout.addView(linearLayout)
162+
binding.catalogLinearLayout.addView(publicationRecyclerView)
162163
}
163164
if (group.navigation.isNotEmpty()) {
164165
for (navigation in group.navigation) {
@@ -180,20 +181,25 @@ class CatalogFragment : Fragment() {
180181
.navigate(R.id.action_navigation_catalog_self, bundle)
181182
}
182183
}
183-
catalogLayout.addView(button)
184+
binding.catalogLinearLayout.addView(button)
184185
}
185186
}
186187
}
187-
progressBar.visibility = View.GONE
188+
binding.catalogProgressBar.visibility = View.GONE
188189
})
189190
}
190191

192+
override fun onDestroyView() {
193+
_binding = null
194+
super.onDestroyView()
195+
}
196+
191197
private fun handleEvent(event: CatalogViewModel.Event.FeedEvent) {
192198
val message =
193199
when (event) {
194200
is CatalogViewModel.Event.FeedEvent.CatalogParseFailed -> getString(R.string.failed_parsing_catalog)
195201
}
196-
progressBar.visibility = View.GONE
202+
binding.catalogProgressBar.visibility = View.GONE
197203
Snackbar.make(
198204
requireView(),
199205
message,

0 commit comments

Comments
 (0)