diff --git a/twidere.component.common/src/main/java/org/mariotaku/microblog/library/mastodon/api/FavouriteResources.java b/twidere.component.common/src/main/java/org/mariotaku/microblog/library/mastodon/api/FavouriteResources.java index 07a8dec0a..dadd7446a 100644 --- a/twidere.component.common/src/main/java/org/mariotaku/microblog/library/mastodon/api/FavouriteResources.java +++ b/twidere.component.common/src/main/java/org/mariotaku/microblog/library/mastodon/api/FavouriteResources.java @@ -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 getFavourites(@Query Paging paging) throws MicroBlogException; + } diff --git a/twidere.component.common/src/main/java/org/mariotaku/twidere/model/account/MastodonAccountExtras.java b/twidere.component.common/src/main/java/org/mariotaku/twidere/model/account/MastodonAccountExtras.java new file mode 100644 index 000000000..a74cf5745 --- /dev/null +++ b/twidere.component.common/src/main/java/org/mariotaku/twidere/model/account/MastodonAccountExtras.java @@ -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 CREATOR = new Creator() { + public MastodonAccountExtras createFromParcel(Parcel source) { + MastodonAccountExtras target = new MastodonAccountExtras(); + MastodonAccountExtrasParcelablePlease.readFromParcel(target, source); + return target; + } + + public MastodonAccountExtras[] newArray(int size) { + return new MastodonAccountExtras[size]; + } + }; +} diff --git a/twidere.component.common/src/main/java/org/mariotaku/twidere/util/model/AccountDetailsUtils.java b/twidere.component.common/src/main/java/org/mariotaku/twidere/util/model/AccountDetailsUtils.java index aadedae91..bea47b8ec 100644 --- a/twidere.component.common/src/main/java/org/mariotaku/twidere/util/model/AccountDetailsUtils.java +++ b/twidere.component.common/src/main/java/org/mariotaku/twidere/util/model/AccountDetailsUtils.java @@ -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; diff --git a/twidere/src/androidTest/kotlin/org/mariotaku/twidere/model/util/ParcelableStatusUtilsTest.kt b/twidere/src/androidTest/kotlin/org/mariotaku/twidere/model/util/ParcelableStatusUtilsTest.kt index 32269e742..489a70550 100644 --- a/twidere/src/androidTest/kotlin/org/mariotaku/twidere/model/util/ParcelableStatusUtilsTest.kt +++ b/twidere/src/androidTest/kotlin/org/mariotaku/twidere/model/util/ParcelableStatusUtilsTest.kt @@ -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) diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/activity/SignInActivity.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/activity/SignInActivity.kt index 6fcb50d7f..b1c735dae 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/activity/SignInActivity.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/activity/SignInActivity.kt @@ -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 { 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 { + 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 { + 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? diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/extension/model/AccountDetailsExtensions.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/extension/model/AccountDetailsExtensions.kt index 242459292..5d12408f1 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/extension/model/AccountDetailsExtensions.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/extension/model/AccountDetailsExtensions.kt @@ -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 } diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/extension/model/AccountExtensions.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/extension/model/AccountExtensions.kt index 129000a8a..dc8fa1207 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/extension/model/AccountExtensions.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/extension/model/AccountExtensions.kt @@ -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 diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/extension/model/UserKeyExtensions.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/extension/model/UserKeyExtensions.kt new file mode 100644 index 000000000..25b924f69 --- /dev/null +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/extension/model/UserKeyExtensions.kt @@ -0,0 +1,30 @@ +/* + * Twidere - Twitter client for Android + * + * Copyright (C) 2012-2017 Mariotaku Lee + * + * 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 . + */ + +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 diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/extension/model/api/mastodon/ApplicationExtensions.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/extension/model/api/mastodon/ApplicationExtensions.kt index 529eeee09..833c5c1bc 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/extension/model/api/mastodon/ApplicationExtensions.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/extension/model/api/mastodon/ApplicationExtensions.kt @@ -25,4 +25,7 @@ import org.mariotaku.twidere.util.HtmlEscapeHelper /** * Created by mariotaku on 2017/4/19. */ -val Application.sourceHtml get() = "${HtmlEscapeHelper.escape(name)}" \ No newline at end of file +val Application.sourceHtml: String get() { + if (website == null) return HtmlEscapeHelper.escape(name) + return "${HtmlEscapeHelper.escape(name)}" +} \ No newline at end of file diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/AbsMediaStatusesFragment.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/AbsMediaStatusesFragment.kt index 7adb61699..b91998345 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/AbsMediaStatusesFragment.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/AbsMediaStatusesFragment.kt @@ -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?>, data: List?, 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) { diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/ParcelableStatusesFragment.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/ParcelableStatusesFragment.kt index 1e6de06cd..dd1fe38c3 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/ParcelableStatusesFragment.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/ParcelableStatusesFragment.kt @@ -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) ?: diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/UserFragment.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/UserFragment.kt index 228482f4e..79b9c60a7 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/UserFragment.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/UserFragment.kt @@ -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 -> { diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/loader/RequestStatusesLoader.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/loader/AbsRequestStatusesLoader.kt similarity index 99% rename from twidere/src/main/kotlin/org/mariotaku/twidere/loader/RequestStatusesLoader.kt rename to twidere/src/main/kotlin/org/mariotaku/twidere/loader/AbsRequestStatusesLoader.kt index a94faa7be..bef96aade 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/loader/RequestStatusesLoader.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/loader/AbsRequestStatusesLoader.kt @@ -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?, diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/loader/MicroBlogAPIUsersLoader.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/loader/AbsRequestUsersLoader.kt similarity index 98% rename from twidere/src/main/kotlin/org/mariotaku/twidere/loader/MicroBlogAPIUsersLoader.kt rename to twidere/src/main/kotlin/org/mariotaku/twidere/loader/AbsRequestUsersLoader.kt index 3b52ea6b8..92ad6716c 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/loader/MicroBlogAPIUsersLoader.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/loader/AbsRequestUsersLoader.kt @@ -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?, diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/loader/ConversationLoader.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/loader/ConversationLoader.kt index 9ef5d19ac..c28a258ca 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/loader/ConversationLoader.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/loader/ConversationLoader.kt @@ -48,7 +48,7 @@ class ConversationLoader( adapterData: List?, 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) diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/loader/CursorSupportUsersLoader.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/loader/CursorSupportUsersLoader.kt index 6756c97ee..e0754e870 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/loader/CursorSupportUsersLoader.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/loader/CursorSupportUsersLoader.kt @@ -37,7 +37,7 @@ abstract class CursorSupportUsersLoader( accountKey: UserKey?, data: List?, fromUser: Boolean -) : MicroBlogAPIUsersLoader(context, accountKey, data, fromUser), ICursorSupportLoader { +) : AbsRequestUsersLoader(context, accountKey, data, fromUser), ICursorSupportLoader { var page = -1 override var cursor: Long = 0 diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/loader/GroupTimelineLoader.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/loader/GroupTimelineLoader.kt index 932dab8fa..30f5f50b9 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/loader/GroupTimelineLoader.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/loader/GroupTimelineLoader.kt @@ -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?, - savedStatusesArgs: Array?, - 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?, savedStatusesArgs: Array?, + 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 { + if (account.type != AccountType.STATUSNET) throw MicroBlogException("Not supported") return getMicroBlogStatuses(account, paging).map { it.toParcelable(account.key, account.type, profileImageSize) } diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/loader/MediaStatusesSearchLoader.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/loader/MediaStatusesSearchLoader.kt index c76e3bace..9bd575c13 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/loader/MediaStatusesSearchLoader.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/loader/MediaStatusesSearchLoader.kt @@ -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) diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/loader/MediaTimelineLoader.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/loader/MediaTimelineLoader.kt index 78186b2b4..eef856bdb 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/loader/MediaTimelineLoader.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/loader/MediaTimelineLoader.kt @@ -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 diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/loader/ParcelableUserLoader.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/loader/ParcelableUserLoader.kt index a15e26bb3..bc9128ac8 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/loader/ParcelableUserLoader.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/loader/ParcelableUserLoader.kt @@ -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 { diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/loader/PublicTimelineLoader.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/loader/PublicTimelineLoader.kt index 302e3d6a9..d27ee4f0c 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/loader/PublicTimelineLoader.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/loader/PublicTimelineLoader.kt @@ -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) diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/loader/TweetSearchLoader.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/loader/TweetSearchLoader.kt index c0d30342f..77674081e 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/loader/TweetSearchLoader.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/loader/TweetSearchLoader.kt @@ -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) diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/loader/UserFavoritesLoader.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/loader/UserFavoritesLoader.kt index 328e7c8e6..333035fd7 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/loader/UserFavoritesLoader.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/loader/UserFavoritesLoader.kt @@ -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 { + 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 { + 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) } + } } diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/loader/UserListTimelineLoader.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/loader/UserListTimelineLoader.kt index 136b322a7..2b135253f 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/loader/UserListTimelineLoader.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/loader/UserListTimelineLoader.kt @@ -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) diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/loader/UserSearchLoader.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/loader/UserSearchLoader.kt index a6736c679..ce7945629 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/loader/UserSearchLoader.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/loader/UserSearchLoader.kt @@ -36,7 +36,7 @@ open class UserSearchLoader( val page: Int, data: List?, fromUser: Boolean -) : MicroBlogAPIUsersLoader(context, accountKey, data, fromUser) { +) : AbsRequestUsersLoader(context, accountKey, data, fromUser) { @Throws(MicroBlogException::class) override fun getUsers(twitter: MicroBlog, details: AccountDetails): List { diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/loader/UserTimelineLoader.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/loader/UserTimelineLoader.kt index 3e724a9ce..6194e4b62 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/loader/UserTimelineLoader.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/loader/UserTimelineLoader.kt @@ -69,7 +69,7 @@ class UserTimelineLoader( loadingMore: Boolean, val pinnedStatusIds: Array?, 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>() diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/util/dagger/GeneralComponent.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/util/dagger/GeneralComponent.kt index faed6ebb1..66cb9353b 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/util/dagger/GeneralComponent.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/util/dagger/GeneralComponent.kt @@ -101,7 +101,7 @@ interface GeneralComponent { fun inject(provider: CacheProvider) - fun inject(loader: RequestStatusesLoader) + fun inject(loader: AbsRequestStatusesLoader) fun inject(activity: MediaViewerActivity)