Remove string-based quote feature

This commit is contained in:
kyori19 2020-05-16 17:47:53 +09:00
parent 4d33e477a7
commit 3a912cf7a9
17 changed files with 94 additions and 36 deletions

View File

@ -171,7 +171,8 @@ public final class SavedTootActivity extends BaseActivity implements SavedTootAd
/*mentionedUsernames*/null,
item.getInReplyToId(),
/*quoteId*/null,
/*quoteUrl*/null,
/*quoteStatusAuthor*/null,
/*quoteStatusContent*/null,
/*replyVisibility*/null,
item.getVisibility(),
item.getContentWarning(),

View File

@ -255,7 +255,8 @@ public class NotificationsAdapter extends RecyclerView.Adapter {
statusDisplayOptions.showBotOverlay(),
statusDisplayOptions.useBlurhash(),
CardViewMode.NONE,
statusDisplayOptions.confirmReblogs()
statusDisplayOptions.confirmReblogs(),
statusDisplayOptions.quoteEnabled()
);
}

View File

@ -754,6 +754,10 @@ public abstract class StatusBaseViewHolder extends RecyclerView.ViewHolder {
favouriteButton.setClickable(!isNotestock);
if (quoteButton != null) {
if (!statusDisplayOptions.quoteEnabled()) {
quoteButton.setVisibility(View.GONE);
}
quoteButton.setOnClickListener(view -> {
int position = getAdapterPosition();
if (position != RecyclerView.NO_POSITION) {

View File

@ -65,7 +65,8 @@ public final class TimelineAdapter extends RecyclerView.Adapter {
statusDisplayOptions.showBotOverlay(),
statusDisplayOptions.useBlurhash(),
statusDisplayOptions.cardViewMode(),
statusDisplayOptions.confirmReblogs()
statusDisplayOptions.confirmReblogs(),
statusDisplayOptions.quoteEnabled()
);
}

View File

@ -160,7 +160,7 @@ class ComposeActivity : BaseActivity(),
this.composeOptions = intent.getParcelableExtra<ComposeOptions?>(COMPOSE_OPTIONS_EXTRA)
viewModel.setup(composeOptions)
setupReplyViews(composeOptions?.replyingStatusAuthor)
setupQuoteView(composeOptions?.quoteUrl)
setupQuoteView(composeOptions?.quoteStatusAuthor)
val tootText = composeOptions?.tootText
if (!tootText.isNullOrEmpty()) {
composeEditField.setText(tootText)
@ -301,11 +301,31 @@ class ComposeActivity : BaseActivity(),
composeOptions?.replyingStatusContent?.let { composeReplyContentView.text = it }
}
private fun setupQuoteView(quoteUrl: String?) {
if (quoteUrl != null) {
private fun setupQuoteView(quoteStatusAuthor: String?) {
if (quoteStatusAuthor != null) {
composeQuoteView.show()
composeQuoteView.text = getString(R.string.quote_to, quoteUrl)
composeQuoteView.text = getString(R.string.quote_to, quoteStatusAuthor)
val arrowDownIcon = IconicsDrawable(this, GoogleMaterial.Icon.gmd_arrow_drop_down).apply { sizeDp = 12 }
ThemeUtils.setDrawableTint(this, arrowDownIcon, android.R.attr.textColorTertiary)
composeQuoteView.setCompoundDrawablesRelativeWithIntrinsicBounds(null, null, arrowDownIcon, null)
composeQuoteView.setOnClickListener {
TransitionManager.beginDelayedTransition(composeQuoteContentView.parent as ViewGroup)
if (composeQuoteContentView.isVisible) {
composeQuoteContentView.hide()
composeQuoteView.setCompoundDrawablesRelativeWithIntrinsicBounds(null, null, arrowDownIcon, null)
} else {
composeQuoteContentView.show()
val arrowUpIcon = IconicsDrawable(this, GoogleMaterial.Icon.gmd_arrow_drop_up).apply { sizeDp = 12 }
ThemeUtils.setDrawableTint(this, arrowUpIcon, android.R.attr.textColorTertiary)
composeReplyView.setCompoundDrawablesRelativeWithIntrinsicBounds(null, null, arrowUpIcon, null)
}
}
}
composeOptions?.quoteStatusContent?.let { composeQuoteContentView.text = it }
}
private fun setupContentWarningField(startingContentWarning: String?) {
@ -1083,7 +1103,8 @@ class ComposeActivity : BaseActivity(),
var mentionedUsernames: Set<String>? = null,
var inReplyToId: String? = null,
var quoteId: String? = null,
var quoteUrl: String? = null,
var quoteStatusAuthor: String? = null,
var quoteStatusContent: String? = null,
var replyVisibility: Status.Visibility? = null,
var visibility: Status.Visibility? = null,
var contentWarning: String? = null,

View File

@ -61,7 +61,8 @@ class ComposeViewModel
private var startingContentWarning: String = ""
private var inReplyToId: String? = null
private var quoteId: String? = null
private var quoteUrl: String? = null
private var quoteStatusAuthor: String? = null
private var quoteStatusContent: String? = null
private var startingVisibility: Status.Visibility = Status.Visibility.UNKNOWN
private var contentWarningStateChanged: Boolean = false
@ -268,14 +269,8 @@ class ComposeViewModel
mediaDescriptions.add(item.description ?: "")
}
var text = content
if (domain !in CAN_USE_QUOTE_ID && quoteId != null) {
text += "\n~~~~~~~~~~\n[$quoteUrl]"
quoteId = null
}
val tootToSend = TootToSend(
text,
content,
spoilerText,
statusVisibility.value!!.serverString(),
mediaUris.isNotEmpty() && (markMediaAsSensitive.value!! || showContentWarning.value!!),
@ -394,7 +389,8 @@ class ComposeViewModel
inReplyToId = composeOptions?.inReplyToId
quoteId = composeOptions?.quoteId
quoteUrl = composeOptions?.quoteUrl
quoteStatusAuthor = composeOptions?.quoteStatusAuthor
quoteStatusContent = composeOptions?.quoteStatusContent
val contentWarning = composeOptions?.contentWarning
if (contentWarning != null) {
@ -485,7 +481,7 @@ const val DEFAULT_CHARACTER_LIMIT = 500
private const val DEFAULT_MAX_OPTION_COUNT = 4
private const val DEFAULT_MAX_OPTION_LENGTH = 25
private val CAN_USE_QUOTE_ID = arrayOf("odakyu.app", "itabashi.0j0.jp", "biwakodon.com", "dtp-mstdn.jp", "nitiasa.com",
val CAN_USE_QUOTE_ID = arrayOf("odakyu.app", "itabashi.0j0.jp", "biwakodon.com", "dtp-mstdn.jp", "nitiasa.com",
"comm.cx", "fedibird.com", "qoto.org", "kurage.cc", "m.eula.dev", "otogamer.me", "sgp.hostdon.ne.jp",
"pomdon.work", "obapom.work")

View File

@ -30,6 +30,7 @@ import androidx.recyclerview.widget.SimpleItemAnimator
import com.keylesspalace.tusky.AccountActivity
import com.keylesspalace.tusky.R
import com.keylesspalace.tusky.ViewTagActivity
import com.keylesspalace.tusky.components.compose.CAN_USE_QUOTE_ID
import com.keylesspalace.tusky.db.AppDatabase
import com.keylesspalace.tusky.di.Injectable
import com.keylesspalace.tusky.di.ViewModelFactory
@ -67,7 +68,8 @@ class ConversationsFragment : SFragment(), StatusActionListener, Injectable, Res
showBotOverlay = preferences.getBoolean("showBotOverlay", true),
useBlurhash = preferences.getBoolean("useBlurhash", true),
cardViewMode = CardViewMode.NONE,
confirmReblogs = preferences.getBoolean("confirmReblogs", true)
confirmReblogs = preferences.getBoolean("confirmReblogs", true),
quoteEnabled = accountManager.activeAccount?.domain in CAN_USE_QUOTE_ID
)
adapter = ConversationAdapter(statusDisplayOptions, this, ::onTopLoaded, viewModel::retry)

View File

@ -34,6 +34,7 @@ import com.keylesspalace.tusky.AccountActivity
import com.keylesspalace.tusky.R
import com.keylesspalace.tusky.ViewMediaActivity
import com.keylesspalace.tusky.ViewTagActivity
import com.keylesspalace.tusky.components.compose.CAN_USE_QUOTE_ID
import com.keylesspalace.tusky.components.report.ReportViewModel
import com.keylesspalace.tusky.components.report.Screen
import com.keylesspalace.tusky.components.report.adapter.AdapterHandler
@ -118,7 +119,8 @@ class ReportStatusesFragment : Fragment(), Injectable, AdapterHandler {
showBotOverlay = false,
useBlurhash = preferences.getBoolean("useBlurhash", true),
cardViewMode = CardViewMode.NONE,
confirmReblogs = preferences.getBoolean("confirmReblogs", true)
confirmReblogs = preferences.getBoolean("confirmReblogs", true),
quoteEnabled = accountManager.activeAccount?.domain in CAN_USE_QUOTE_ID
)
adapter = StatusesAdapter(statusDisplayOptions,

View File

@ -4,6 +4,7 @@ import android.util.Log
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.paging.PagedList
import com.keylesspalace.tusky.components.compose.CAN_USE_QUOTE_ID
import com.keylesspalace.tusky.components.search.adapter.SearchNotestockRepository
import com.keylesspalace.tusky.components.search.adapter.SearchRepository
import com.keylesspalace.tusky.db.AccountEntity
@ -37,6 +38,7 @@ class SearchViewModel @Inject constructor(
val mediaPreviewEnabled = activeAccount?.mediaPreviewEnabled ?: false
val alwaysShowSensitiveMedia = activeAccount?.alwaysShowSensitiveMedia ?: false
val alwaysOpenSpoiler = activeAccount?.alwaysOpenSpoiler ?: false
val quoteEnabled = activeAccount?.domain in CAN_USE_QUOTE_ID
private val statusesRepository = SearchRepository<Pair<Status, StatusViewData.Concrete>>(mastodonApi)
private val accountsRepository = SearchRepository<Account>(mastodonApi)

View File

@ -68,7 +68,8 @@ class SearchNotestockFragment : SearchFragment<Pair<Status, StatusViewData.Concr
showBotOverlay = preferences.getBoolean("showBotOverlay", true),
useBlurhash = preferences.getBoolean("useBlurhash", true),
cardViewMode = CardViewMode.NONE,
confirmReblogs = preferences.getBoolean("confirmReblogs", false)
confirmReblogs = preferences.getBoolean("confirmReblogs", false),
quoteEnabled = viewModel.quoteEnabled
)
searchRecyclerView.addItemDecoration(DividerItemDecoration(searchRecyclerView.context, DividerItemDecoration.VERTICAL))
@ -214,7 +215,8 @@ class SearchNotestockFragment : SearchFragment<Pair<Status, StatusViewData.Concr
val intent = ComposeActivity.startIntent(requireContext(), ComposeOptions(
quoteId = status.actionableId,
quoteUrl = actionableStatus.url,
quoteStatusAuthor = actionableStatus.account.localUsername,
quoteStatusContent = actionableStatus.content.toString(),
replyVisibility = actionableStatus.visibility,
contentWarning = actionableStatus.spoilerText,
mentionedUsernames = mentionedUsernames

View File

@ -83,7 +83,8 @@ class SearchStatusesFragment : SearchFragment<Pair<Status, StatusViewData.Concre
showBotOverlay = preferences.getBoolean("showBotOverlay", true),
useBlurhash = preferences.getBoolean("useBlurhash", true),
cardViewMode = CardViewMode.NONE,
confirmReblogs = preferences.getBoolean("confirmReblogs", true)
confirmReblogs = preferences.getBoolean("confirmReblogs", true),
quoteEnabled = viewModel.quoteEnabled
)
searchRecyclerView.addItemDecoration(DividerItemDecoration(searchRecyclerView.context, DividerItemDecoration.VERTICAL))
@ -235,7 +236,8 @@ class SearchStatusesFragment : SearchFragment<Pair<Status, StatusViewData.Concre
val intent = ComposeActivity.startIntent(requireContext(), ComposeOptions(
quoteId = status.actionableId,
quoteUrl = actionableStatus.url,
quoteStatusAuthor = actionableStatus.account.localUsername,
quoteStatusContent = actionableStatus.content.toString(),
replyVisibility = actionableStatus.visibility,
contentWarning = actionableStatus.spoilerText,
mentionedUsernames = mentionedUsernames

View File

@ -60,6 +60,7 @@ import com.keylesspalace.tusky.appstore.EventHub;
import com.keylesspalace.tusky.appstore.FavoriteEvent;
import com.keylesspalace.tusky.appstore.PreferenceChangedEvent;
import com.keylesspalace.tusky.appstore.ReblogEvent;
import com.keylesspalace.tusky.components.compose.ComposeViewModelKt;
import com.keylesspalace.tusky.db.AccountEntity;
import com.keylesspalace.tusky.db.AccountManager;
import com.keylesspalace.tusky.di.Injectable;
@ -88,6 +89,7 @@ import com.keylesspalace.tusky.viewdata.StatusViewData;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashSet;
import java.util.Iterator;
@ -251,7 +253,8 @@ public class NotificationsFragment extends SFragment implements
preferences.getBoolean("showBotOverlay", true),
preferences.getBoolean("useBlurhash", true),
CardViewMode.NONE,
preferences.getBoolean("confirmReblogs", true)
preferences.getBoolean("confirmReblogs", true),
Arrays.asList(ComposeViewModelKt.getCAN_USE_QUOTE_ID()).contains(accountManager.getActiveAccount().getDomain())
);
adapter = new NotificationsAdapter(accountManager.getActiveAccount().getAccountId(),

View File

@ -174,7 +174,6 @@ public abstract class SFragment extends BaseFragment implements Injectable {
String id = status.getActionableId();
Status actionableStatus = status.getActionableStatus();
Status.Visibility visibility = actionableStatus.getVisibility();
String url = actionableStatus.getUrl();
Status.Mention[] mentions = actionableStatus.getMentions();
Set<String> mentionedUsernames = new LinkedHashSet<>();
mentionedUsernames.add(actionableStatus.getAccount().getUsername());
@ -187,12 +186,10 @@ public abstract class SFragment extends BaseFragment implements Injectable {
mentionedUsernames.add(mention.getUsername());
}
mentionedUsernames.remove(loggedInUsername);
if (status.getReblog() != null) {
url = status.getReblog().getUrl();
}
ComposeOptions composeOptions = new ComposeOptions();
composeOptions.setQuoteId(id);
composeOptions.setQuoteUrl(url);
composeOptions.setQuoteStatusAuthor(actionableStatus.getAccount().getLocalUsername());
composeOptions.setQuoteStatusContent(actionableStatus.getContent().toString());
composeOptions.setReplyVisibility(visibility);
composeOptions.setMentionedUsernames(mentionedUsernames);

View File

@ -65,6 +65,7 @@ import com.keylesspalace.tusky.appstore.StatusComposedEvent;
import com.keylesspalace.tusky.appstore.StatusDeletedEvent;
import com.keylesspalace.tusky.appstore.StreamUpdateEvent;
import com.keylesspalace.tusky.appstore.UnfollowEvent;
import com.keylesspalace.tusky.components.compose.ComposeViewModelKt;
import com.keylesspalace.tusky.db.AccountEntity;
import com.keylesspalace.tusky.db.AccountManager;
import com.keylesspalace.tusky.di.Injectable;
@ -101,7 +102,6 @@ import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
import java.util.Objects;
import java.util.concurrent.TimeUnit;
import javax.inject.Inject;
@ -251,7 +251,8 @@ public class TimelineFragment extends SFragment implements
preferences.getBoolean("showCardsInTimelines", false) ?
CardViewMode.INDENTED :
CardViewMode.NONE,
preferences.getBoolean("confirmReblogs", true)
preferences.getBoolean("confirmReblogs", true),
Arrays.asList(ComposeViewModelKt.getCAN_USE_QUOTE_ID()).contains(accountManager.getActiveAccount().getDomain())
);
adapter = new TimelineAdapter(dataSource, statusDisplayOptions, this);

View File

@ -51,6 +51,7 @@ import com.keylesspalace.tusky.appstore.FavoriteEvent;
import com.keylesspalace.tusky.appstore.ReblogEvent;
import com.keylesspalace.tusky.appstore.StatusComposedEvent;
import com.keylesspalace.tusky.appstore.StatusDeletedEvent;
import com.keylesspalace.tusky.components.compose.ComposeViewModelKt;
import com.keylesspalace.tusky.di.Injectable;
import com.keylesspalace.tusky.entity.Filter;
import com.keylesspalace.tusky.entity.Poll;
@ -68,6 +69,7 @@ import com.keylesspalace.tusky.view.ConversationLineItemDecoration;
import com.keylesspalace.tusky.viewdata.StatusViewData;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;
@ -136,7 +138,8 @@ public final class ViewThreadFragment extends SFragment implements
preferences.getBoolean("showCardsInTimelines", false) ?
CardViewMode.INDENTED :
CardViewMode.NONE,
preferences.getBoolean("confirmReblogs", true)
preferences.getBoolean("confirmReblogs", true),
Arrays.asList(ComposeViewModelKt.getCAN_USE_QUOTE_ID()).contains(accountManager.getActiveAccount().getDomain())
);
adapter = new ThreadAdapter(statusDisplayOptions, this);
}

View File

@ -14,5 +14,7 @@ data class StatusDisplayOptions(
@get:JvmName("cardViewMode")
val cardViewMode: CardViewMode,
@get:JvmName("confirmReblogs")
val confirmReblogs: Boolean
val confirmReblogs: Boolean,
@get:JvmName("quoteEnabled")
val quoteEnabled: Boolean
)

View File

@ -92,13 +92,31 @@
android:id="@+id/composeQuoteView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="6dp"
android:layout_marginLeft="16dp"
android:layout_marginRight="16dp"
android:layout_marginBottom="6dp"
android:drawablePadding="6dp"
android:textSize="?attr/status_text_small"
android:textStyle="bold"
android:visibility="gone" />
android:visibility="gone"
tools:text="Quote @username"
tools:visibility="visible" />
<androidx.emoji.widget.EmojiTextView
android:id="@+id/composeQuoteContentView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="2dp"
android:background="?attr/colorBackgroundAccent"
android:lineSpacingMultiplier="1.1"
android:paddingLeft="16dp"
android:paddingTop="4dp"
android:paddingRight="16dp"
android:paddingBottom="4dp"
android:textSize="?attr/status_text_small"
android:visibility="gone"
tools:text="Post content which may be preeettyy long, so please, make sure there's enough room for everything, okay? Not kidding. I wish Eugen answered me more often, sigh."
tools:visibility="visible" />
<LinearLayout
android:id="@+id/composeContentWarningBar"