supports mastodon user timeline and favorites loader

This commit is contained in:
Mariotaku Lee 2017-04-19 18:59:39 +08:00
parent c9ea5b2890
commit 059c38b6bf
No known key found for this signature in database
GPG Key ID: 15C10F89D7C33535
27 changed files with 208 additions and 56 deletions

View File

@ -21,9 +21,24 @@
package org.mariotaku.microblog.library.mastodon.api;
import org.mariotaku.microblog.library.MicroBlogException;
import org.mariotaku.microblog.library.mastodon.model.Status;
import org.mariotaku.microblog.library.twitter.model.Paging;
import org.mariotaku.restfu.annotation.method.GET;
import org.mariotaku.restfu.annotation.param.Query;
import java.util.List;
/**
* Created by mariotaku on 2017/4/17.
*/
public interface FavouriteResources {
/**
* @return An array of {@link Status} favourited by the authenticated user.
*/
@GET("/v1/favourites")
List<Status> getFavourites(@Query Paging paging) throws MicroBlogException;
}

View File

@ -0,0 +1,70 @@
/*
* Twidere - Twitter client for Android
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.mariotaku.twidere.model.account;
import android.os.Parcel;
import android.os.Parcelable;
import com.bluelinelabs.logansquare.annotation.JsonField;
import com.bluelinelabs.logansquare.annotation.JsonObject;
import com.hannesdorfmann.parcelableplease.annotation.ParcelablePlease;
/**
* Created by mariotaku on 2017/4/19.
*/
@ParcelablePlease
@JsonObject
public class MastodonAccountExtras implements AccountExtras, Parcelable {
@JsonField(name = "status_text_limit")
int statusTextLimit = 500;
public int getStatusTextLimit() {
return statusTextLimit;
}
public void setStatusTextLimit(int statusTextLimit) {
this.statusTextLimit = statusTextLimit;
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
MastodonAccountExtrasParcelablePlease.writeToParcel(this, dest, flags);
}
public static final Creator<MastodonAccountExtras> CREATOR = new Creator<MastodonAccountExtras>() {
public MastodonAccountExtras createFromParcel(Parcel source) {
MastodonAccountExtras target = new MastodonAccountExtras();
MastodonAccountExtrasParcelablePlease.readFromParcel(target, source);
return target;
}
public MastodonAccountExtras[] newArray(int size) {
return new MastodonAccountExtras[size];
}
};
}

View File

@ -23,6 +23,7 @@ package org.mariotaku.twidere.util.model;
import org.mariotaku.twidere.annotation.AccountType;
import org.mariotaku.twidere.model.account.AccountExtras;
import org.mariotaku.twidere.model.account.MastodonAccountExtras;
import org.mariotaku.twidere.model.account.StatusNetAccountExtras;
import org.mariotaku.twidere.model.account.TwitterAccountExtras;
import org.mariotaku.twidere.model.account.cred.BasicCredentials;
@ -72,6 +73,9 @@ public class AccountDetailsUtils {
case AccountType.STATUSNET: {
return JsonSerializer.parse(json, StatusNetAccountExtras.class);
}
case AccountType.MASTODON: {
return JsonSerializer.parse(json, MastodonAccountExtras.class);
}
}
} catch (IOException e) {
return null;

View File

@ -6,6 +6,8 @@ import org.junit.Assert
import org.junit.Test
import org.junit.runner.RunWith
import org.mariotaku.microblog.library.twitter.model.Status
import org.mariotaku.twidere.annotation.AccountType
import org.mariotaku.twidere.extension.model.api.toParcelable
import org.mariotaku.twidere.model.UserKey
import org.mariotaku.twidere.test.R
import org.mariotaku.twidere.util.JsonSerializer
@ -24,14 +26,12 @@ class ParcelableStatusUtilsTest {
val context = InstrumentationRegistry.getContext()
val status_8754050 = context.resources.openRawResource(R.raw.status_8754050).use {
val status = JsonSerializer.parse(it, Status::class.java)
return@use ParcelableStatusUtils.fromStatus(status, UserKey("1234567", "gnusocial.de"),
"statusnet", false)
return@use status.toParcelable(UserKey("1234567", "gnusocial.de"), AccountType.STATUSNET)
}
val status_9171447 = context.resources.openRawResource(R.raw.status_9171447).use {
val status = JsonSerializer.parse(it, Status::class.java)
return@use ParcelableStatusUtils.fromStatus(status, UserKey("1234567", "gnusocial.de"),
"statusnet", false)
return@use status.toParcelable(UserKey("1234567", "gnusocial.de"), AccountType.STATUSNET)
}
Assert.assertEquals(status_8754050.text_unescaped, expectedStatusText)

View File

@ -90,6 +90,7 @@ import org.mariotaku.twidere.model.ParcelableUser
import org.mariotaku.twidere.model.SingleResponse
import org.mariotaku.twidere.model.UserKey
import org.mariotaku.twidere.model.account.AccountExtras
import org.mariotaku.twidere.model.account.MastodonAccountExtras
import org.mariotaku.twidere.model.account.StatusNetAccountExtras
import org.mariotaku.twidere.model.account.TwitterAccountExtras
import org.mariotaku.twidere.model.account.cred.*
@ -934,7 +935,7 @@ class SignInActivity : BaseActivity(), OnClickListener, TextWatcher,
credentials.access_token = token.accessToken
return SignInResponse(account != null, Credentials.Type.OAUTH2, credentials, user,
color, AccountType.MASTODON, null)
color, AccountType.MASTODON, getMastodonAccountExtras(mastodon))
}
}
@ -1272,10 +1273,10 @@ class SignInActivity : BaseActivity(), OnClickListener, TextWatcher,
internal fun detectAccountType(twitter: MicroBlog, user: User, type: String?): Pair<String, AccountExtras?> {
when (type) {
AccountType.STATUSNET -> {
return getStatusNetAccountType(twitter)
return Pair(type, getStatusNetAccountExtras(twitter))
}
AccountType.TWITTER -> {
return getTwitterAccountType(twitter)
return Pair(type, getTwitterAccountExtras(twitter))
}
AccountType.FANFOU -> {
return Pair(AccountType.FANFOU, null)
@ -1289,7 +1290,7 @@ class SignInActivity : BaseActivity(), OnClickListener, TextWatcher,
return Pair(AccountType.TWITTER, null)
}
private fun getStatusNetAccountType(twitter: MicroBlog): Pair<String, StatusNetAccountExtras> {
private fun getStatusNetAccountExtras(twitter: MicroBlog): StatusNetAccountExtras {
// Get StatusNet specific resource
val config = twitter.statusNetConfig
val extras = StatusNetAccountExtras()
@ -1297,10 +1298,10 @@ class SignInActivity : BaseActivity(), OnClickListener, TextWatcher,
if (site != null) {
extras.textLimit = site.textLimit
}
return Pair(AccountType.STATUSNET, extras)
return extras
}
private fun getTwitterAccountType(twitter: MicroBlog): Pair<String, TwitterAccountExtras> {
private fun getTwitterAccountExtras(twitter: MicroBlog): TwitterAccountExtras {
val extras = TwitterAccountExtras()
try {
// Get Twitter official only resource
@ -1311,7 +1312,11 @@ class SignInActivity : BaseActivity(), OnClickListener, TextWatcher,
} catch (e: MicroBlogException) {
// Ignore
}
return Pair(AccountType.TWITTER, extras)
return extras
}
private fun getMastodonAccountExtras(mastodon: Mastodon): MastodonAccountExtras {
return MastodonAccountExtras()
}
private val CustomAPIConfig.signUpUrlOrDefault: String?

View File

@ -5,6 +5,7 @@ import com.twitter.Validator
import org.mariotaku.twidere.annotation.AccountType
import org.mariotaku.twidere.model.AccountDetails
import org.mariotaku.twidere.model.account.AccountExtras
import org.mariotaku.twidere.model.account.MastodonAccountExtras
import org.mariotaku.twidere.model.account.StatusNetAccountExtras
import org.mariotaku.twidere.model.account.TwitterAccountExtras
import org.mariotaku.twidere.model.account.cred.Credentials
@ -68,6 +69,12 @@ val AccountDetails.textLimit: Int get() {
return extras.textLimit
}
}
AccountType.MASTODON -> {
val extras = this.extras as? MastodonAccountExtras
if (extras != null) {
return extras.statusTextLimit
}
}
}
return Validator.MAX_TWEET_LENGTH
}

View File

@ -15,6 +15,7 @@ import org.mariotaku.twidere.annotation.AccountType
import org.mariotaku.twidere.model.ParcelableUser
import org.mariotaku.twidere.model.UserKey
import org.mariotaku.twidere.model.account.AccountExtras
import org.mariotaku.twidere.model.account.MastodonAccountExtras
import org.mariotaku.twidere.model.account.StatusNetAccountExtras
import org.mariotaku.twidere.model.account.TwitterAccountExtras
import org.mariotaku.twidere.model.account.cred.*
@ -23,6 +24,7 @@ import org.mariotaku.twidere.model.util.AccountUtils.ACCOUNT_USER_DATA_KEYS
import org.mariotaku.twidere.util.JsonSerializer
import org.mariotaku.twidere.util.ParseUtils
import org.mariotaku.twidere.util.TwitterContentUtils
import org.mariotaku.twidere.util.model.AccountDetailsUtils
import java.io.IOException
import java.util.concurrent.Callable
import java.util.concurrent.Executors
@ -76,15 +78,7 @@ fun Account.getPosition(am: AccountManager): Int {
fun Account.getAccountExtras(am: AccountManager): AccountExtras? {
val json = AccountDataQueue.getUserData(am, this, ACCOUNT_USER_DATA_EXTRAS) ?: return null
when (getAccountType(am)) {
AccountType.TWITTER -> {
return JsonSerializer.parse(json, TwitterAccountExtras::class.java)
}
AccountType.STATUSNET -> {
return JsonSerializer.parse(json, StatusNetAccountExtras::class.java)
}
}
return null
return AccountDetailsUtils.parseAccountExtras(json, getAccountType(am))
}
@AccountType

View File

@ -0,0 +1,30 @@
/*
* Twidere - Twitter client for Android
*
* Copyright (C) 2012-2017 Mariotaku Lee <mariotaku.lee@gmail.com>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.mariotaku.twidere.extension.model
import org.mariotaku.twidere.model.UserKey
/**
* Created by mariotaku on 2017/4/19.
*/
private const val mastodonPlaceholderId = "#mastodon*placeholder#"
val UserKey.isMastodonPlaceholder get() = mastodonPlaceholderId == id && host != null

View File

@ -25,4 +25,7 @@ import org.mariotaku.twidere.util.HtmlEscapeHelper
/**
* Created by mariotaku on 2017/4/19.
*/
val Application.sourceHtml get() = "<a href='${HtmlEscapeHelper.escape(website)}'>${HtmlEscapeHelper.escape(name)}</a>"
val Application.sourceHtml: String get() {
if (website == null) return HtmlEscapeHelper.escape(name)
return "<a href='${HtmlEscapeHelper.escape(website)}'>${HtmlEscapeHelper.escape(name)}</a>"
}

View File

@ -31,7 +31,7 @@ import org.mariotaku.twidere.adapter.iface.ILoadMoreSupportAdapter
import org.mariotaku.twidere.constant.IntentConstants.EXTRA_FROM_USER
import org.mariotaku.twidere.extension.reachingEnd
import org.mariotaku.twidere.extension.reachingStart
import org.mariotaku.twidere.loader.RequestStatusesLoader
import org.mariotaku.twidere.loader.AbsRequestStatusesLoader
import org.mariotaku.twidere.loader.iface.IExtendedLoader
import org.mariotaku.twidere.model.ParcelableStatus
import org.mariotaku.twidere.util.IntentUtils
@ -136,7 +136,7 @@ abstract class AbsMediaStatusesFragment : AbsContentRecyclerViewFragment<Stagger
protected open fun hasMoreData(loader: Loader<List<ParcelableStatus>?>,
data: List<ParcelableStatus>?, changed: Boolean): Boolean {
if (loader !is RequestStatusesLoader) return false
if (loader !is AbsRequestStatusesLoader) return false
val maxId = loader.maxId?.takeIf(String::isNotEmpty)
val sinceId = loader.sinceId?.takeIf(String::isNotEmpty)
if (sinceId == null && maxId != null) {

View File

@ -30,7 +30,7 @@ import org.mariotaku.twidere.R
import org.mariotaku.twidere.adapter.ListParcelableStatusesAdapter
import org.mariotaku.twidere.adapter.iface.ILoadMoreSupportAdapter
import org.mariotaku.twidere.constant.IntentConstants.*
import org.mariotaku.twidere.loader.RequestStatusesLoader
import org.mariotaku.twidere.loader.AbsRequestStatusesLoader
import org.mariotaku.twidere.model.BaseRefreshTaskParam
import org.mariotaku.twidere.model.ParcelableStatus
import org.mariotaku.twidere.model.RefreshTaskParam
@ -132,7 +132,7 @@ abstract class ParcelableStatusesFragment : AbsStatusesFragment() {
setLoadMoreIndicatorPosition(ILoadMoreSupportAdapter.NONE)
if (adapter.itemCount > 0) {
showContent()
} else if (loader is RequestStatusesLoader) {
} else if (loader is AbsRequestStatusesLoader) {
val e = loader.exception
if (e != null) {
showError(R.drawable.ic_info_error_generic, Utils.getErrorMessage(context, e) ?:

View File

@ -1136,13 +1136,18 @@ class UserFragment : BaseFragment(), OnClickListener, OnLinkClickListener,
}
}
TAB_TYPE_FAVORITES -> {
if (preferences[iWantMyStarsBackKey]) {
if (user.favorites_count < 0) {
if (preferences[iWantMyStarsBackKey]) {
actionBar.setSubtitle(R.string.title_favorites)
} else {
actionBar.setSubtitle(R.string.title_likes)
}
} else if (preferences[iWantMyStarsBackKey]) {
actionBar.subtitle = resources.getQuantityString(R.plurals.N_favorites,
user.favorites_count.toInt(), user.favorites_count)
} else {
actionBar.subtitle = resources.getQuantityString(R.plurals.N_likes,
user.favorites_count.toInt(), user.favorites_count)
}
}
else -> {

View File

@ -48,7 +48,7 @@ import java.util.concurrent.CopyOnWriteArrayList
import java.util.concurrent.atomic.AtomicReference
import javax.inject.Inject
abstract class RequestStatusesLoader(
abstract class AbsRequestStatusesLoader(
context: Context,
val accountKey: UserKey?,
val sinceId: String?,

View File

@ -36,7 +36,7 @@ import org.mariotaku.twidere.model.util.AccountUtils
import org.mariotaku.twidere.model.util.ParcelableUserUtils
import java.util.*
abstract class MicroBlogAPIUsersLoader(
abstract class AbsRequestUsersLoader(
context: Context,
val accountKey: UserKey?,
data: List<ParcelableUser>?,

View File

@ -48,7 +48,7 @@ class ConversationLoader(
adapterData: List<ParcelableStatus>?,
fromUser: Boolean,
loadingMore: Boolean
) : RequestStatusesLoader(context, status.account_key, sinceId, maxId, -1, adapterData, null,
) : AbsRequestStatusesLoader(context, status.account_key, sinceId, maxId, -1, adapterData, null,
-1, fromUser, loadingMore) {
private val status = ParcelUtils.clone(status)

View File

@ -37,7 +37,7 @@ abstract class CursorSupportUsersLoader(
accountKey: UserKey?,
data: List<ParcelableUser>?,
fromUser: Boolean
) : MicroBlogAPIUsersLoader(context, accountKey, data, fromUser), ICursorSupportLoader {
) : AbsRequestUsersLoader(context, accountKey, data, fromUser), ICursorSupportLoader {
var page = -1
override var cursor: Long = 0

View File

@ -26,6 +26,7 @@ import org.mariotaku.microblog.library.MicroBlog
import org.mariotaku.microblog.library.MicroBlogException
import org.mariotaku.microblog.library.twitter.model.Paging
import org.mariotaku.microblog.library.twitter.model.Status
import org.mariotaku.twidere.annotation.AccountType
import org.mariotaku.twidere.extension.model.api.toParcelable
import org.mariotaku.twidere.extension.model.newMicroBlogInstance
import org.mariotaku.twidere.model.AccountDetails
@ -33,23 +34,16 @@ import org.mariotaku.twidere.model.ParcelableStatus
import org.mariotaku.twidere.model.UserKey
import org.mariotaku.twidere.util.InternalTwitterContentUtils
class GroupTimelineLoader(
context: Context,
accountKey: UserKey?,
private val groupId: String?,
private val groupName: String?,
sinceId: String?,
maxId: String?,
adapterData: List<ParcelableStatus>?,
savedStatusesArgs: Array<String>?,
tabPosition: Int,
fromUser: Boolean,
loadingMore: Boolean
) : RequestStatusesLoader(context, accountKey, sinceId, maxId, -1, adapterData, savedStatusesArgs,
tabPosition, fromUser, loadingMore) {
class GroupTimelineLoader(context: Context, accountKey: UserKey?, private val groupId: String?,
private val groupName: String?, sinceId: String?, maxId: String?,
adapterData: List<ParcelableStatus>?, savedStatusesArgs: Array<String>?,
tabPosition: Int, fromUser: Boolean, loadingMore: Boolean) : AbsRequestStatusesLoader(context,
accountKey, sinceId, maxId, -1, adapterData, savedStatusesArgs, tabPosition, fromUser,
loadingMore) {
@Throws(MicroBlogException::class)
override fun getStatuses(account: AccountDetails, paging: Paging): List<ParcelableStatus> {
if (account.type != AccountType.STATUSNET) throw MicroBlogException("Not supported")
return getMicroBlogStatuses(account, paging).map {
it.toParcelable(account.key, account.type, profileImageSize)
}

View File

@ -51,7 +51,7 @@ open class MediaStatusesSearchLoader(
fromUser: Boolean,
override val isGapEnabled: Boolean,
loadingMore: Boolean
) : RequestStatusesLoader(context, accountKey, sinceId, maxId, page, adapterData, savedStatusesArgs,
) : AbsRequestStatusesLoader(context, accountKey, sinceId, maxId, page, adapterData, savedStatusesArgs,
tabPosition, fromUser, loadingMore) {
@Throws(MicroBlogException::class)

View File

@ -50,7 +50,7 @@ class MediaTimelineLoader(
tabPosition: Int,
fromUser: Boolean,
loadingMore: Boolean
) : RequestStatusesLoader(context, accountKey, sinceId, maxId, -1, data, savedStatusesArgs,
) : AbsRequestStatusesLoader(context, accountKey, sinceId, maxId, -1, data, savedStatusesArgs,
tabPosition, fromUser, loadingMore) {
private var user: User? = null

View File

@ -38,6 +38,7 @@ import org.mariotaku.twidere.TwidereConstants.*
import org.mariotaku.twidere.annotation.AccountType
import org.mariotaku.twidere.annotation.Referral
import org.mariotaku.twidere.extension.model.api.mastodon.toParcelable
import org.mariotaku.twidere.extension.model.isMastodonPlaceholder
import org.mariotaku.twidere.extension.model.newMicroBlogInstance
import org.mariotaku.twidere.model.AccountDetails
import org.mariotaku.twidere.model.ParcelableUser
@ -158,8 +159,14 @@ class ParcelableUserLoader(
private fun showMastodonUser(details: AccountDetails): ParcelableUser {
val mastodon = details.newMicroBlogInstance(context, Mastodon::class.java)
if (userKey != null) return mastodon.getAccount(userKey.id).toParcelable(details.key)
throw MicroBlogException("No user id")
if (userKey == null) throw MicroBlogException("Invalid user id")
if (!userKey.isMastodonPlaceholder) {
return mastodon.getAccount(userKey.id).toParcelable(details.key)
}
if (screenName == null) throw MicroBlogException("Screen name required")
val resultItem = mastodon.searchAccounts("$screenName@${userKey.host}").firstOrNull() ?:
throw MicroBlogException("User not found")
return resultItem.toParcelable(details.key)
}
private fun showMicroBlogUser(details: AccountDetails): ParcelableUser {

View File

@ -43,7 +43,7 @@ class PublicTimelineLoader(
tabPosition: Int,
fromUser: Boolean,
loadingMore: Boolean
) : RequestStatusesLoader(context, accountKey, sinceId, maxId, -1, adapterData, savedStatusesArgs,
) : AbsRequestStatusesLoader(context, accountKey, sinceId, maxId, -1, adapterData, savedStatusesArgs,
tabPosition, fromUser, loadingMore) {
@Throws(MicroBlogException::class)

View File

@ -50,7 +50,7 @@ open class TweetSearchLoader(
fromUser: Boolean,
override val isGapEnabled: Boolean,
loadingMore: Boolean
) : RequestStatusesLoader(context, accountKey, sinceId, maxId, page, adapterData, savedStatusesArgs,
) : AbsRequestStatusesLoader(context, accountKey, sinceId, maxId, page, adapterData, savedStatusesArgs,
tabPosition, fromUser, loadingMore) {
@Throws(MicroBlogException::class)

View File

@ -24,10 +24,12 @@ import android.database.sqlite.SQLiteDatabase
import android.support.annotation.WorkerThread
import org.mariotaku.microblog.library.MicroBlog
import org.mariotaku.microblog.library.MicroBlogException
import org.mariotaku.microblog.library.mastodon.Mastodon
import org.mariotaku.microblog.library.twitter.model.Paging
import org.mariotaku.microblog.library.twitter.model.ResponseList
import org.mariotaku.microblog.library.twitter.model.Status
import org.mariotaku.twidere.annotation.AccountType
import org.mariotaku.twidere.extension.model.api.mastodon.toParcelable
import org.mariotaku.twidere.extension.model.api.toParcelable
import org.mariotaku.twidere.extension.model.newMicroBlogInstance
import org.mariotaku.twidere.model.AccountDetails
@ -48,11 +50,16 @@ class UserFavoritesLoader(
tabPosition: Int,
fromUser: Boolean,
loadingMore: Boolean
) : RequestStatusesLoader(context, accountKey, sinceId, maxId, page, data, savedStatusesArgs,
) : AbsRequestStatusesLoader(context, accountKey, sinceId, maxId, page, data, savedStatusesArgs,
tabPosition, fromUser, loadingMore) {
@Throws(MicroBlogException::class)
override fun getStatuses(account: AccountDetails, paging: Paging): List<ParcelableStatus> {
when (account.type) {
AccountType.MASTODON -> {
return getMastodonStatuses(account, paging)
}
}
return getMicroBlogStatuses(account, paging).map {
it.toParcelable(account.key, account.type, profileImageSize)
}
@ -86,4 +93,15 @@ class UserFavoritesLoader(
}
throw MicroBlogException("Null user")
}
private fun getMastodonStatuses(account: AccountDetails, paging: Paging): List<ParcelableStatus> {
if (userKey != null && userKey != account.key) {
throw MicroBlogException("Only current account favorites is supported")
}
if (screenName != null && !screenName.equals(account.user?.screen_name, ignoreCase = true)) {
throw MicroBlogException("Only current account favorites is supported")
}
val mastodon = account.newMicroBlogInstance(context, Mastodon::class.java)
return mastodon.getFavourites(paging).map { it.toParcelable(account.key) }
}
}

View File

@ -48,7 +48,7 @@ class UserListTimelineLoader(
tabPosition: Int,
fromUser: Boolean,
loadingMore: Boolean
) : RequestStatusesLoader(context, accountKey, sinceId, maxId, -1, adapterData, savedStatusesArgs,
) : AbsRequestStatusesLoader(context, accountKey, sinceId, maxId, -1, adapterData, savedStatusesArgs,
tabPosition, fromUser, loadingMore) {
@Throws(MicroBlogException::class)

View File

@ -36,7 +36,7 @@ open class UserSearchLoader(
val page: Int,
data: List<ParcelableUser>?,
fromUser: Boolean
) : MicroBlogAPIUsersLoader(context, accountKey, data, fromUser) {
) : AbsRequestUsersLoader(context, accountKey, data, fromUser) {
@Throws(MicroBlogException::class)
override fun getUsers(twitter: MicroBlog, details: AccountDetails): List<User> {

View File

@ -69,7 +69,7 @@ class UserTimelineLoader(
loadingMore: Boolean,
val pinnedStatusIds: Array<String>?,
val timelineFilter: UserTimelineFilter? = null
) : RequestStatusesLoader(context, accountKey, sinceId, maxId, -1, data, savedStatusesArgs,
) : AbsRequestStatusesLoader(context, accountKey, sinceId, maxId, -1, data, savedStatusesArgs,
tabPosition, fromUser, loadingMore) {
private val pinnedStatusesRef = AtomicReference<List<ParcelableStatus>>()

View File

@ -101,7 +101,7 @@ interface GeneralComponent {
fun inject(provider: CacheProvider)
fun inject(loader: RequestStatusesLoader)
fun inject(loader: AbsRequestStatusesLoader)
fun inject(activity: MediaViewerActivity)