Skip to content

Commit

Permalink
Merge pull request #201 from Automattic/update/podcasts-rearrange-crash
Browse files Browse the repository at this point in the history
Catch rearranging podcasts / folders crash
  • Loading branch information
ashiagr authored Aug 3, 2022
2 parents 5c6c672 + 671a9bf commit e845192
Show file tree
Hide file tree
Showing 4 changed files with 32 additions and 16 deletions.
2 changes: 2 additions & 0 deletions RELEASE-NOTES.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@

* Bug Fixes:
* Fix OPML import.
* Fix podcasts and folders rearrange crash.
([#200](https://github.com/Automattic/pocket-casts-android/issues/200)).

### 7.20.1

Expand Down
2 changes: 1 addition & 1 deletion dependencies.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ project.ext {
applicationId = 'au.com.shiftyjelly.pocketcasts'

versionCode = getVersionCode()
versionName = '7.20.1' + getVersionNameSuffix()
versionName = '7.20.2' + getVersionNameSuffix()

// Android
minSdkVersion = 23
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ import io.reactivex.rxkotlin.Observables
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import timber.log.Timber
import java.util.Collections
import java.util.Optional
import javax.inject.Inject
Expand Down Expand Up @@ -179,24 +180,30 @@ class PodcastsViewModel

val refreshObservable: LiveData<RefreshState> = LiveDataReactiveStreams.fromPublisher(settings.refreshStateObservable.toFlowable(BackpressureStrategy.LATEST))

var adapterState: MutableList<FolderItem> = mutableListOf()
private var adapterState: MutableList<FolderItem> = mutableListOf()

/**
* User rearranges the grid with a drag
*/
fun moveFolderItem(fromPosition: Int, toPosition: Int): List<FolderItem> {
if (adapterState.isEmpty() || toPosition >= adapterState.size) {
if (adapterState.isEmpty()) {
return adapterState
}

if (fromPosition < toPosition) {
for (index in fromPosition until toPosition) {
Collections.swap(adapterState, index, index + 1)
}
} else {
for (index in fromPosition downTo toPosition + 1) {
Collections.swap(adapterState, index, index - 1)
try {
if (fromPosition < toPosition) {
for (index in fromPosition until toPosition) {
Collections.swap(adapterState, index, index + 1)
}
} else {
for (index in fromPosition downTo toPosition + 1) {
Collections.swap(adapterState, index, index - 1)
}
}
} catch (ex: IndexOutOfBoundsException) {
Timber.e("Move folder item failed.", ex)
}

return adapterState.toList()
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package au.com.shiftyjelly.pocketcasts.views.adapter

import android.content.Context
import androidx.recyclerview.widget.ItemTouchHelper
import androidx.recyclerview.widget.RecyclerView

class PodcastTouchCallback(val adapter: ItemTouchHelperAdapter, val context: Context) : ItemTouchHelper.Callback() {

Expand All @@ -17,22 +18,28 @@ class PodcastTouchCallback(val adapter: ItemTouchHelperAdapter, val context: Con
fun onItemClear()
}

override fun getMovementFlags(recyclerView: androidx.recyclerview.widget.RecyclerView, viewHolder: androidx.recyclerview.widget.RecyclerView.ViewHolder): Int {
override fun getMovementFlags(recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder): Int {
val dragFlags = ItemTouchHelper.UP or ItemTouchHelper.DOWN or ItemTouchHelper.LEFT or ItemTouchHelper.RIGHT or ItemTouchHelper.START or ItemTouchHelper.END
val swipeFlags = 0
return ItemTouchHelper.SimpleCallback.makeMovementFlags(dragFlags, swipeFlags)
}

override fun onMove(recyclerView: androidx.recyclerview.widget.RecyclerView, viewHolder: androidx.recyclerview.widget.RecyclerView.ViewHolder, target: androidx.recyclerview.widget.RecyclerView.ViewHolder): Boolean {
adapter.onPodcastMove(viewHolder.bindingAdapterPosition, target.bindingAdapterPosition)
override fun onMove(recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder, target: RecyclerView.ViewHolder): Boolean {
val position = viewHolder.bindingAdapterPosition
val targetPosition = target.bindingAdapterPosition
if (position == RecyclerView.NO_POSITION || targetPosition == RecyclerView.NO_POSITION) {
return false
}

adapter.onPodcastMove(position, targetPosition)
isMoving = true
return true
}

override fun onSwiped(viewHolder: androidx.recyclerview.widget.RecyclerView.ViewHolder, direction: Int) {
override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) {
}

override fun onSelectedChanged(viewHolder: androidx.recyclerview.widget.RecyclerView.ViewHolder?, actionState: Int) {
override fun onSelectedChanged(viewHolder: RecyclerView.ViewHolder?, actionState: Int) {
if (viewHolder is ItemTouchHelperViewHolder) {
when (actionState) {
ItemTouchHelper.ACTION_STATE_DRAG -> viewHolder.onItemDrag()
Expand All @@ -42,7 +49,7 @@ class PodcastTouchCallback(val adapter: ItemTouchHelperAdapter, val context: Con
super.onSelectedChanged(viewHolder, actionState)
}

override fun clearView(recyclerView: androidx.recyclerview.widget.RecyclerView, viewHolder: androidx.recyclerview.widget.RecyclerView.ViewHolder) {
override fun clearView(recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder) {
super.clearView(recyclerView, viewHolder)

if (viewHolder is ItemTouchHelperViewHolder) {
Expand Down

0 comments on commit e845192

Please sign in to comment.