Skip to content
This repository has been archived by the owner on Feb 28, 2022. It is now read-only.

Commit

Permalink
Close #71, #81
Browse files Browse the repository at this point in the history
Shows Window Flickering and menu navigation issue
  • Loading branch information
MGaetan89 authored Aug 21, 2016
1 parent 5ddbc58 commit 283afb1
Show file tree
Hide file tree
Showing 13 changed files with 97 additions and 63 deletions.
4 changes: 4 additions & 0 deletions app/src/main/kotlin/com/mgaetan89/showsrage/Constants.kt
Original file line number Diff line number Diff line change
Expand Up @@ -34,4 +34,8 @@ object Constants {
val ACTION_SEARCH_RESULT_SELECTED = BuildConfig.APPLICATION_ID + ".action.search_result_selected"
val ACTION_SHOW_SELECTED = BuildConfig.APPLICATION_ID + ".action.show_selected"
}

enum class Payloads {
SHOWS_STATS
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -132,6 +132,7 @@ class MainActivity : AppCompatActivity(), Callback<GenericResponse>, NavigationV
}

override fun onNavigationItemSelected(item: MenuItem): Boolean {
var backStackName: String? = null
var eventHandled = true
var fragment: Fragment? = null
val id = item.itemId
Expand Down Expand Up @@ -192,7 +193,10 @@ class MainActivity : AppCompatActivity(), Callback<GenericResponse>, NavigationV

R.id.menu_schedule -> fragment = ScheduleFragment()

R.id.menu_settings -> fragment = SettingsFragment()
R.id.menu_settings -> {
backStackName = "settings"
fragment = SettingsFragment()
}

R.id.menu_shows -> fragment = ShowsFragment()

Expand All @@ -219,9 +223,14 @@ class MainActivity : AppCompatActivity(), Callback<GenericResponse>, NavigationV

this.toolbar?.menu?.clear()

this.supportFragmentManager.beginTransaction()
.replace(R.id.content, fragment)
.commit()
val fragmentTransaction = this.supportFragmentManager.beginTransaction()
fragmentTransaction.replace(R.id.content, fragment)

if (!backStackName.isNullOrEmpty()) {
fragmentTransaction.addToBackStack(backStackName)
}

fragmentTransaction.commit()
}

return eventHandled
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,12 @@ class ShowsAdapter(val shows: List<Show>, val itemLayoutResource: Int, val ignor
override fun onBindViewHolder(holder: ViewHolder?, position: Int) {
val show = this.shows[position]

holder?.bind(ShowPresenter(show))
holder?.binding?.let {
val presenter = ShowPresenter(show)

it.setShow(presenter)
it.setStats(presenter.getShowStat())
}

if (holder?.nextEpisodeDate != null && show.isValid) {
val nextEpisodeAirDate = show.nextEpisodeAirDate
Expand All @@ -49,15 +54,31 @@ class ShowsAdapter(val shows: List<Show>, val itemLayoutResource: Int, val ignor
}
}

override fun onBindViewHolder(holder: ViewHolder?, position: Int, payloads: MutableList<Any>?) {
if (payloads?.isEmpty() ?: true) {
this.onBindViewHolder(holder, position)

return
}

if (payloads!!.contains(Constants.Payloads.SHOWS_STATS)) {
holder?.binding?.let {
val show = this.shows[position]

it.setStats(ShowPresenter(show).getShowStat())
}
}
}

override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): ViewHolder? {
val view = LayoutInflater.from(parent?.context).inflate(R.layout.adapter_shows_list, parent, false)

return ViewHolder(view)
}

inner class ViewHolder(view: View) : RecyclerView.ViewHolder(view), View.OnClickListener {
val binding: AdapterShowsListBinding
val nextEpisodeDate: TextView?
private val binding: AdapterShowsListBinding

init {
view.setOnClickListener(this)
Expand All @@ -73,10 +94,6 @@ class ShowsAdapter(val shows: List<Show>, val itemLayoutResource: Int, val ignor
this.nextEpisodeDate = this.binding.stub.root.findViewById(R.id.show_next_episode_date) as TextView?
}

fun bind(show: ShowPresenter) {
this.binding.setShow(show)
}

override fun onClick(view: View?) {
val context = view?.context ?: return

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import android.support.v4.content.ContextCompat
import android.support.v4.graphics.drawable.DrawableCompat
import android.widget.ImageView
import android.widget.TextView
import com.mgaetan89.showsrage.R
import com.mgaetan89.showsrage.helper.ImageLoader

@BindingAdapter("android:backgroundTint")
Expand All @@ -19,7 +20,13 @@ fun setBackgroundTint(textView: TextView, @ColorRes tint: Int) {

@BindingAdapter("imageUrl", "circle")
fun setImageUrl(imageView: ImageView, imageUrl: String?, circle: Boolean) {
ImageLoader.load(imageView, imageUrl, circle)
val currentUrl = imageView.getTag(R.id.image_view_url)

if (currentUrl == null || !currentUrl.equals(imageUrl)) {
ImageLoader.load(imageView, imageUrl, circle)

imageView.setTag(R.id.image_view_url, imageUrl)
}
}

@BindingAdapter("selected")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,7 @@ class ShowsSectionFragment : Fragment(), RealmChangeListener<RealmResults<Show>>

this.adapter = ShowsAdapter(this.filteredShows, showsListLayout, ignoreArticles)

this.recyclerView!!.adapter = adapter
this.recyclerView!!.adapter = this.adapter
this.recyclerView!!.layoutManager = GridLayoutManager(this.context, columnCount)

fastScroller?.let {
Expand Down Expand Up @@ -183,10 +183,12 @@ class ShowsSectionFragment : Fragment(), RealmChangeListener<RealmResults<Show>>
})
}

fragment.filteredShows.clear()
fragment.filteredShows.addAll(filteredShows)
fragment.updateLayout()
fragment.adapter?.notifyDataSetChanged()
if (filteredShows != fragment.filteredShows) {
fragment.filteredShows.clear()
fragment.filteredShows.addAll(filteredShows)
fragment.updateLayout()
fragment.adapter?.notifyDataSetChanged()
}
}

companion object {
Expand Down Expand Up @@ -264,6 +266,8 @@ class ShowsSectionFragment : Fragment(), RealmChangeListener<RealmResults<Show>>

filteredShows.filter { it.isValid && it.indexerId == indexerId }.forEach {
it.stat = realmStat ?: it.stat

fragment.adapter?.notifyItemChanged(filteredShows.indexOf(it), Constants.Payloads.SHOWS_STATS)
}

if (shows?.isValid ?: false) {
Expand All @@ -272,9 +276,6 @@ class ShowsSectionFragment : Fragment(), RealmChangeListener<RealmResults<Show>>
}
}
}

fragment.updateLayout()
fragment.adapter?.notifyDataSetChanged()
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ object ImageLoader {
val glide = Glide.with(context)
.load(url)
.asBitmap()
.approximate()
.diskCacheStrategy(DiskCacheStrategy.ALL)

if (circleTransform) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,6 @@ import com.mgaetan89.showsrage.network.SickRageApi
open class ShowPresenter(val show: Show?) {
fun getBannerUrl() = if (this.isShowValid()) SickRageApi.instance.getBannerUrl(this.show!!.tvDbId, Indexer.TVDB) else ""

fun getDownloaded() = this.getShowStat()?.downloaded ?: 0

fun getEpisodesCount() = this.getShowStat()?.episodesCount ?: 0

fun getNetwork() = if (this.isShowValid()) this.show!!.network else ""

fun getPosterUrl() = if (this.isShowValid()) SickRageApi.instance.getPosterUrl(this.show!!.tvDbId, Indexer.TVDB) else ""
Expand All @@ -21,11 +17,7 @@ open class ShowPresenter(val show: Show?) {

fun getShowName() = if (this.isShowValid()) this.show!!.showName else ""

fun getSnatched() = this.getShowStat()?.snatched ?: 0

fun isPaused() = if (this.isShowValid()) this.show!!.paused == 1 else false

internal open fun getShowStat(): RealmShowStat? {
fun getShowStat(): RealmShowStat? {
if (!this.isShowValid()) {
return null
}
Expand All @@ -37,5 +29,8 @@ open class ShowPresenter(val show: Show?) {
return this.show.stat
}


fun isPaused() = if (this.isShowValid()) this.show!!.paused == 1 else false

internal open fun isShowValid() = this.show != null && this.show.isValid
}
7 changes: 6 additions & 1 deletion app/src/main/res/layout-sw600dp/adapter_shows_list.xml
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,10 @@
<variable
name="show"
type="com.mgaetan89.showsrage.presenter.ShowPresenter" />

<variable
name="stats"
type="com.mgaetan89.showsrage.model.RealmShowStat" />
</data>

<android.support.v7.widget.CardView
Expand All @@ -19,6 +23,7 @@
android:id="@+id/stub"
android:layout_width="match_parent"
android:layout_height="wrap_content"
bind:show="@{show}" />
bind:show="@{show}"
bind:stats="@{stats}" />
</android.support.v7.widget.CardView>
</layout>
7 changes: 6 additions & 1 deletion app/src/main/res/layout/adapter_shows_list.xml
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,10 @@
<variable
name="show"
type="com.mgaetan89.showsrage.presenter.ShowPresenter" />

<variable
name="stats"
type="com.mgaetan89.showsrage.model.RealmShowStat" />
</data>

<FrameLayout
Expand All @@ -17,6 +21,7 @@
android:id="@+id/stub"
android:layout_width="match_parent"
android:layout_height="wrap_content"
bind:show="@{show}" />
bind:show="@{show}"
bind:stats="@{stats}" />
</FrameLayout>
</layout>
10 changes: 7 additions & 3 deletions app/src/main/res/layout/adapter_shows_list_content_banner.xml
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,10 @@
<variable
name="show"
type="com.mgaetan89.showsrage.presenter.ShowPresenter" />

<variable
name="stats"
type="com.mgaetan89.showsrage.model.RealmShowStat" />
</data>

<FrameLayout
Expand Down Expand Up @@ -40,9 +44,9 @@
android:layout_height="4dp"
android:layout_gravity="bottom"
android:layout_marginBottom="-2dp"
android:max="@{show.episodesCount}"
android:progress="@{show.downloaded}"
android:secondaryProgress="@{show.downloaded + show.snatched}"
android:max="@{stats.episodesCount}"
android:progress="@{stats.downloaded}"
android:secondaryProgress="@{stats.downloaded + stats.snatched}"
tools:progress="33"
tools:secondaryProgress="66" />
</FrameLayout>
Expand Down
10 changes: 7 additions & 3 deletions app/src/main/res/layout/adapter_shows_list_content_poster.xml
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,10 @@
<variable
name="show"
type="com.mgaetan89.showsrage.presenter.ShowPresenter" />

<variable
name="stats"
type="com.mgaetan89.showsrage.model.RealmShowStat" />
</data>

<FrameLayout
Expand Down Expand Up @@ -94,9 +98,9 @@
android:layout_height="4dp"
android:layout_gravity="bottom"
android:layout_marginBottom="-2dp"
android:max="@{show.episodesCount}"
android:progress="@{show.downloaded}"
android:secondaryProgress="@{show.downloaded + show.snatched}"
android:max="@{stats.episodesCount}"
android:progress="@{stats.downloaded}"
android:secondaryProgress="@{stats.downloaded + stats.snatched}"
tools:progress="33"
tools:secondaryProgress="66" />
</FrameLayout>
Expand Down
4 changes: 4 additions & 0 deletions app/src/main/res/values/ids.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<item name="image_view_url" type="id" />
</resources>
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package com.mgaetan89.showsrage.presenter

import com.google.gson.Gson
import com.mgaetan89.showsrage.model.RealmShowStat
import com.mgaetan89.showsrage.model.Show
import com.mgaetan89.showsrage.network.SickRageApi
import org.assertj.core.api.Assertions.assertThat
Expand All @@ -14,34 +13,22 @@ import org.mockito.Mockito.spy

@RunWith(Parameterized::class)
class ShowPresenterTest(
val show: Show?, val showStat: RealmShowStat?, val bannerUrl: String, val downloaded: Int,
val episodesCount: Int, val network: String, val paused: Boolean, val posterUrl: String, val quality: String,
val showName: String, val snatched: Int
val show: Show?, val bannerUrl: String, val network: String, val paused: Boolean, val posterUrl: String,
val quality: String, val showName: String
) {
private lateinit var presenter: ShowPresenter

@Before
fun before() {
this.presenter = spy(ShowPresenter(this.show))
doReturn(this.show != null).`when`(this.presenter).isShowValid()
doReturn(this.showStat).`when`(this.presenter).getShowStat()
}

@Test
fun getBannerUrl() {
assertThat(this.presenter.getBannerUrl()).isEqualTo(this.bannerUrl)
}

@Test
fun getDownloaded() {
assertThat(this.presenter.getDownloaded()).isEqualTo(this.downloaded)
}

@Test
fun getEpisodesCount() {
assertThat(this.presenter.getEpisodesCount()).isEqualTo(this.episodesCount)
}

@Test
fun getNetwork() {
assertThat(this.presenter.getNetwork()).isEqualTo(this.network)
Expand All @@ -62,11 +49,6 @@ class ShowPresenterTest(
assertThat(this.presenter.getShowName()).isEqualTo(this.showName)
}

@Test
fun getSnatched() {
assertThat(this.presenter.getSnatched()).isEqualTo(this.snatched)
}

@Test
fun isPaused() {
assertThat(this.presenter.isPaused()).isEqualTo(this.paused)
Expand All @@ -79,18 +61,14 @@ class ShowPresenterTest(
val gson = SickRageApi.gson

return listOf(
arrayOf(null, null, "", 0, 0, "", false, "", "", "", 0),
arrayOf(getShow(gson, "ABC", 0, "HD", "Show 1", 123), getShowStat(gson, 10, 20, 5), "?cmd=show.getbanner&tvdbid=123", 10, 20, "ABC", false, "?cmd=show.getposter&tvdbid=123", "HD", "Show 1", 5),
arrayOf(getShow(gson, "CBS", 1, "HD1080p", "Show 2", 456), getShowStat(gson, 20, 30, 10), "?cmd=show.getbanner&tvdbid=456", 20, 30, "CBS", true, "?cmd=show.getposter&tvdbid=456", "HD1080p", "Show 2", 10)
arrayOf(null, "", "", false, "", "", ""),
arrayOf(getShow(gson, "ABC", 0, "HD", "Show 1", 123), "?cmd=show.getbanner&tvdbid=123", "ABC", false, "?cmd=show.getposter&tvdbid=123", "HD", "Show 1"),
arrayOf(getShow(gson, "CBS", 1, "HD1080p", "Show 2", 456), "?cmd=show.getbanner&tvdbid=456", "CBS", true, "?cmd=show.getposter&tvdbid=456", "HD1080p", "Show 2")
)
}

private fun getShow(gson: Gson, network: String, paused: Int, quality: String, showName: String, tvDbId: Int): Show {
return gson.fromJson("{network: \"$network\", paused: $paused, quality: \"$quality\", show_name: \"$showName\", tvdbid: $tvDbId}", Show::class.java)
}

private fun getShowStat(gson: Gson, downloaded: Int, episodesCount: Int, snatched: Int): RealmShowStat {
return gson.fromJson("{downloaded: $downloaded, episodesCount: $episodesCount, snatched: $snatched}", RealmShowStat::class.java)
}
}
}

0 comments on commit 283afb1

Please sign in to comment.