Remove string-based quote feature
This commit is contained in:
parent
4d33e477a7
commit
3a912cf7a9
|
@ -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(),
|
||||
|
|
|
@ -255,7 +255,8 @@ public class NotificationsAdapter extends RecyclerView.Adapter {
|
|||
statusDisplayOptions.showBotOverlay(),
|
||||
statusDisplayOptions.useBlurhash(),
|
||||
CardViewMode.NONE,
|
||||
statusDisplayOptions.confirmReblogs()
|
||||
statusDisplayOptions.confirmReblogs(),
|
||||
statusDisplayOptions.quoteEnabled()
|
||||
);
|
||||
}
|
||||
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -65,7 +65,8 @@ public final class TimelineAdapter extends RecyclerView.Adapter {
|
|||
statusDisplayOptions.showBotOverlay(),
|
||||
statusDisplayOptions.useBlurhash(),
|
||||
statusDisplayOptions.cardViewMode(),
|
||||
statusDisplayOptions.confirmReblogs()
|
||||
statusDisplayOptions.confirmReblogs(),
|
||||
statusDisplayOptions.quoteEnabled()
|
||||
);
|
||||
}
|
||||
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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")
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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(),
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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
|
||||
)
|
|
@ -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"
|
||||
|
|
Loading…
Reference in New Issue