fix crash in AccountListFragment (#1065)

* fix crash in AccountListFragment

* remove unnecessary subscribeOn
This commit is contained in:
Konrad Pozniak 2019-02-20 18:42:18 +01:00 committed by GitHub
parent e9ada19328
commit 0efd3347d2
2 changed files with 33 additions and 28 deletions

View File

@ -20,6 +20,7 @@ import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.lifecycle.Lifecycle
import androidx.recyclerview.widget.DividerItemDecoration
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
@ -39,6 +40,10 @@ import com.keylesspalace.tusky.util.ThemeUtils
import com.keylesspalace.tusky.util.hide
import com.keylesspalace.tusky.util.show
import com.keylesspalace.tusky.view.EndlessOnScrollListener
import com.uber.autodispose.android.lifecycle.AndroidLifecycleScopeProvider.from
import com.uber.autodispose.autoDisposable
import io.reactivex.Single
import io.reactivex.android.schedulers.AndroidSchedulers
import kotlinx.android.synthetic.main.fragment_account_list.*
import retrofit2.Call
import retrofit2.Callback
@ -46,6 +51,7 @@ import retrofit2.Response
import java.io.IOException
import javax.inject.Inject
class AccountListFragment : BaseFragment(), AccountActionListener, Injectable {
@Inject
@ -248,7 +254,7 @@ class AccountListFragment : BaseFragment(), AccountActionListener, Injectable {
Log.e(TAG, "Failed to $verb account id $accountId.")
}
private fun getFetchCallByListType(type: Type, fromId: String?): Call<List<Account>> {
private fun getFetchCallByListType(type: Type, fromId: String?): Single<Response<List<Account>>> {
return when (type) {
Type.FOLLOWS -> api.accountFollowing(id, fromId)
Type.FOLLOWERS -> api.accountFollowers(id, fromId)
@ -270,24 +276,22 @@ class AccountListFragment : BaseFragment(), AccountActionListener, Injectable {
recyclerView.post { adapter.setBottomLoading(true) }
}
val cb = object : Callback<List<Account>> {
override fun onResponse(call: Call<List<Account>>, response: Response<List<Account>>) {
val accountList = response.body()
if (response.isSuccessful && accountList != null) {
val linkHeader = response.headers().get("Link")
onFetchAccountsSuccess(accountList, linkHeader)
} else {
onFetchAccountsFailure(Exception(response.message()))
}
}
getFetchCallByListType(type, id)
.observeOn(AndroidSchedulers.mainThread())
.autoDisposable(from(this, Lifecycle.Event.ON_DESTROY))
.subscribe({ response ->
val accountList = response.body()
if (response.isSuccessful && accountList != null) {
val linkHeader = response.headers().get("Link")
onFetchAccountsSuccess(accountList, linkHeader)
} else {
onFetchAccountsFailure(Exception(response.message()))
}
}, {throwable ->
onFetchAccountsFailure(throwable)
})
override fun onFailure(call: Call<List<Account>>, t: Throwable) {
onFetchAccountsFailure(t as Exception)
}
}
val listCall = getFetchCallByListType(type, id)
callList.add(listCall)
listCall.enqueue(cb)
}
private fun onFetchAccountsSuccess(accounts: List<Account>, linkHeader: String?) {
@ -319,13 +323,13 @@ class AccountListFragment : BaseFragment(), AccountActionListener, Injectable {
}
}
private fun onFetchAccountsFailure(exception: Exception) {
private fun onFetchAccountsFailure(throwable: Throwable) {
fetching = false
Log.e(TAG, "Fetch failure", exception)
Log.e(TAG, "Fetch failure", throwable)
if (adapter.itemCount == 0) {
messageView.show()
if (exception is IOException) {
if (throwable is IOException) {
messageView.setup(R.drawable.elephant_offline, R.string.error_network) {
messageView.hide()
this.fetchAccounts(null)

View File

@ -38,6 +38,7 @@ import okhttp3.MultipartBody;
import okhttp3.RequestBody;
import okhttp3.ResponseBody;
import retrofit2.Call;
import retrofit2.Response;
import retrofit2.http.DELETE;
import retrofit2.http.Field;
import retrofit2.http.FormUrlEncoded;
@ -139,12 +140,12 @@ public interface MastodonApi {
Call<StatusContext> statusContext(@Path("id") String statusId);
@GET("api/v1/statuses/{id}/reblogged_by")
Call<List<Account>> statusRebloggedBy(
Single<Response<List<Account>>> statusRebloggedBy(
@Path("id") String statusId,
@Query("max_id") String maxId);
@GET("api/v1/statuses/{id}/favourited_by")
Call<List<Account>> statusFavouritedBy(
Single<Response<List<Account>>> statusFavouritedBy(
@Path("id") String statusId,
@Query("max_id") String maxId);
@ -223,12 +224,12 @@ public interface MastodonApi {
@Nullable @Query("pinned") Boolean pinned);
@GET("api/v1/accounts/{id}/followers")
Call<List<Account>> accountFollowers(
Single<Response<List<Account>>> accountFollowers(
@Path("id") String accountId,
@Query("max_id") String maxId);
@GET("api/v1/accounts/{id}/following")
Call<List<Account>> accountFollowing(
Single<Response<List<Account>>> accountFollowing(
@Path("id") String accountId,
@Query("max_id") String maxId);
@ -255,10 +256,10 @@ public interface MastodonApi {
Call<List<Relationship>> relationships(@Query("id[]") List<String> accountIds);
@GET("api/v1/blocks")
Call<List<Account>> blocks(@Query("max_id") String maxId);
Single<Response<List<Account>>> blocks(@Query("max_id") String maxId);
@GET("api/v1/mutes")
Call<List<Account>> mutes(@Query("max_id") String maxId);
Single<Response<List<Account>>> mutes(@Query("max_id") String maxId);
@GET("api/v1/favourites")
Call<List<Status>> favourites(
@ -267,7 +268,7 @@ public interface MastodonApi {
@Query("limit") Integer limit);
@GET("api/v1/follow_requests")
Call<List<Account>> followRequests(@Query("max_id") String maxId);
Single<Response<List<Account>>> followRequests(@Query("max_id") String maxId);
@POST("api/v1/follow_requests/{id}/authorize")
Call<Relationship> authorizeFollowRequest(@Path("id") String accountId);