tag, which
+ * all status contents do, so it should be trimmed. */
+ return (Spanned)trimTrailingWhitespace(HtmlCompat.fromHtml(string, HtmlCompat.FROM_HTML_MODE_LEGACY));
} else {
return new SpannedString("");
}
@@ -43,6 +46,14 @@ public class SpannedTypeAdapter implements JsonDeserializer, JsonSerial
@Override
public JsonElement serialize(Spanned src, Type typeOfSrc, JsonSerializationContext context) {
- return new JsonPrimitive(HtmlUtils.toHtml(src));
+ return new JsonPrimitive(HtmlCompat.toHtml(src, HtmlCompat.TO_HTML_PARAGRAPH_LINES_INDIVIDUAL));
+ }
+
+ private static CharSequence trimTrailingWhitespace(CharSequence s) {
+ int i = s.length();
+ do {
+ i--;
+ } while (i >= 0 && Character.isWhitespace(s.charAt(i)));
+ return s.subSequence(0, i + 1);
}
}
diff --git a/app/src/main/java/com/keylesspalace/tusky/network/MastodonApi.kt b/app/src/main/java/com/keylesspalace/tusky/network/MastodonApi.kt
index affe6a592..3f7f490a7 100644
--- a/app/src/main/java/com/keylesspalace/tusky/network/MastodonApi.kt
+++ b/app/src/main/java/com/keylesspalace/tusky/network/MastodonApi.kt
@@ -200,6 +200,16 @@ interface MastodonApi {
@Path("id") statusId: String
): Single
+ @POST("api/v1/statuses/{id}/mute")
+ fun muteConversation(
+ @Path("id") statusId: String
+ ): Single
+
+ @POST("api/v1/statuses/{id}/unmute")
+ fun unmuteConversation(
+ @Path("id") statusId: String
+ ): Single
+
@GET("api/v1/scheduled_statuses")
fun scheduledStatuses(
@Query("limit") limit: Int? = null,
@@ -383,6 +393,16 @@ interface MastodonApi {
@Path("id") accountId: String
): Call
+ @POST("api/v1/follow_requests/{id}/authorize")
+ fun authorizeFollowRequestObservable(
+ @Path("id") accountId: String
+ ): Single
+
+ @POST("api/v1/follow_requests/{id}/reject")
+ fun rejectFollowRequestObservable(
+ @Path("id") accountId: String
+ ): Single
+
@FormUrlEncoded
@POST("api/v1/apps")
fun authenticateApp(
diff --git a/app/src/main/java/com/keylesspalace/tusky/network/TimelineCases.kt b/app/src/main/java/com/keylesspalace/tusky/network/TimelineCases.kt
index ce9dc7a9b..50b086982 100644
--- a/app/src/main/java/com/keylesspalace/tusky/network/TimelineCases.kt
+++ b/app/src/main/java/com/keylesspalace/tusky/network/TimelineCases.kt
@@ -41,7 +41,7 @@ interface TimelineCases {
fun delete(id: String): Single
fun pin(status: Status, pin: Boolean)
fun voteInPoll(status: Status, choices: List): Single
-
+ fun muteConversation(status: Status, mute: Boolean): Single
}
class TimelineCasesImpl(
@@ -94,6 +94,19 @@ class TimelineCasesImpl(
}
}
+ override fun muteConversation(status: Status, mute: Boolean): Single {
+ val id = status.actionableId
+
+ val call = if (mute) {
+ mastodonApi.muteConversation(id)
+ } else {
+ mastodonApi.unmuteConversation(id)
+ }
+ return call.doAfterSuccess {
+ eventHub.dispatch(MuteConversationEvent(status.id, mute))
+ }
+ }
+
override fun mute(id: String) {
val call = mastodonApi.muteAccount(id)
call.enqueue(object : Callback {
diff --git a/app/src/main/java/com/keylesspalace/tusky/repository/TimelineRepository.kt b/app/src/main/java/com/keylesspalace/tusky/repository/TimelineRepository.kt
index 5bfb87541..ea2fbdbb2 100644
--- a/app/src/main/java/com/keylesspalace/tusky/repository/TimelineRepository.kt
+++ b/app/src/main/java/com/keylesspalace/tusky/repository/TimelineRepository.kt
@@ -1,6 +1,8 @@
package com.keylesspalace.tusky.repository
import android.text.SpannedString
+import androidx.core.text.parseAsHtml
+import androidx.core.text.toHtml
import com.google.gson.Gson
import com.google.gson.reflect.TypeToken
import com.keylesspalace.tusky.db.*
@@ -9,7 +11,6 @@ import com.keylesspalace.tusky.network.MastodonApi
import com.keylesspalace.tusky.repository.TimelineRequestMode.DISK
import com.keylesspalace.tusky.repository.TimelineRequestMode.NETWORK
import com.keylesspalace.tusky.util.Either
-import com.keylesspalace.tusky.util.HtmlConverter
import com.keylesspalace.tusky.util.dec
import com.keylesspalace.tusky.util.inc
import io.reactivex.Single
@@ -41,8 +42,7 @@ class TimelineRepositoryImpl(
private val timelineDao: TimelineDao,
private val mastodonApi: MastodonApi,
private val accountManager: AccountManager,
- private val gson: Gson,
- private val htmlConverter: HtmlConverter
+ private val gson: Gson
) : TimelineRepository {
init {
@@ -67,7 +67,7 @@ class TimelineRepositoryImpl(
val accountId = acc.id
timelineDao.insertInTransaction(
- status.toEntity(accountId, htmlConverter, gson),
+ status.toEntity(accountId, gson),
status.account.toEntity(accountId, gson),
status.reblog?.account?.toEntity(accountId, gson)
)
@@ -162,7 +162,7 @@ class TimelineRepositoryImpl(
for (status in statuses) {
timelineDao.insertInTransaction(
- status.toEntity(accountId, htmlConverter, gson),
+ status.toEntity(accountId, gson),
status.account.toEntity(accountId, gson),
status.reblog?.account?.toEntity(accountId, gson)
)
@@ -226,7 +226,7 @@ class TimelineRepositoryImpl(
inReplyToId = status.inReplyToId,
inReplyToAccountId = status.inReplyToAccountId,
reblog = null,
- content = status.content?.let(htmlConverter::fromHtml) ?: SpannedString(""),
+ content = status.content?.parseAsHtml() ?: SpannedString(""),
createdAt = Date(status.createdAt),
emojis = emojis,
reblogsCount = status.reblogsCount,
@@ -241,6 +241,7 @@ class TimelineRepositoryImpl(
mentions = mentions,
application = application,
pinned = false,
+ muted = status.muted,
poll = poll,
card = null,
quote = null
@@ -269,6 +270,7 @@ class TimelineRepositoryImpl(
mentions = arrayOf(),
application = null,
pinned = false,
+ muted = status.muted,
poll = null,
card = null,
quote = null
@@ -281,7 +283,7 @@ class TimelineRepositoryImpl(
inReplyToId = status.inReplyToId,
inReplyToAccountId = status.inReplyToAccountId,
reblog = null,
- content = status.content?.let(htmlConverter::fromHtml) ?: SpannedString(""),
+ content = status.content?.parseAsHtml() ?: SpannedString(""),
createdAt = Date(status.createdAt),
emojis = emojis,
reblogsCount = status.reblogsCount,
@@ -296,6 +298,7 @@ class TimelineRepositoryImpl(
mentions = mentions,
application = application,
pinned = false,
+ muted = status.muted,
poll = poll,
card = null,
quote = null
@@ -368,12 +371,12 @@ fun Placeholder.toEntity(timelineUserId: Long): TimelineStatusEntity {
application = null,
reblogServerId = null,
reblogAccountId = null,
- poll = null
+ poll = null,
+ muted = false
)
}
fun Status.toEntity(timelineUserId: Long,
- htmlConverter: HtmlConverter,
gson: Gson): TimelineStatusEntity {
val actionable = actionableStatus
return TimelineStatusEntity(
@@ -383,7 +386,7 @@ fun Status.toEntity(timelineUserId: Long,
authorServerId = actionable.account.id,
inReplyToId = actionable.inReplyToId,
inReplyToAccountId = actionable.inReplyToAccountId,
- content = htmlConverter.toHtml(actionable.content),
+ content = actionable.content.toHtml(),
createdAt = actionable.createdAt.time,
emojis = actionable.emojis.let(gson::toJson),
reblogsCount = actionable.reblogsCount,
@@ -396,10 +399,11 @@ fun Status.toEntity(timelineUserId: Long,
visibility = actionable.visibility,
attachments = actionable.attachments.let(gson::toJson),
mentions = actionable.mentions.let(gson::toJson),
- application = actionable.let(gson::toJson),
+ application = actionable.application.let(gson::toJson),
reblogServerId = reblog?.id,
reblogAccountId = reblog?.let { this.account.id },
- poll = actionable.poll.let(gson::toJson)
+ poll = actionable.poll.let(gson::toJson),
+ muted = actionable.muted
)
}
diff --git a/app/src/main/java/com/keylesspalace/tusky/util/CardViewMode.kt b/app/src/main/java/com/keylesspalace/tusky/util/CardViewMode.kt
new file mode 100644
index 000000000..2cf2348cd
--- /dev/null
+++ b/app/src/main/java/com/keylesspalace/tusky/util/CardViewMode.kt
@@ -0,0 +1,7 @@
+package com.keylesspalace.tusky.util
+
+enum class CardViewMode {
+ NONE,
+ FULL_WIDTH,
+ INDENTED
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/keylesspalace/tusky/util/HtmlConverter.kt b/app/src/main/java/com/keylesspalace/tusky/util/HtmlConverter.kt
deleted file mode 100644
index 72efc28c6..000000000
--- a/app/src/main/java/com/keylesspalace/tusky/util/HtmlConverter.kt
+++ /dev/null
@@ -1,22 +0,0 @@
-package com.keylesspalace.tusky.util
-
-import android.text.Spanned
-
-/**
- * Abstracting away Android-specific things.
- */
-interface HtmlConverter {
- fun fromHtml(html: String): Spanned
-
- fun toHtml(text: Spanned): String
-}
-
-internal class HtmlConverterImpl : HtmlConverter {
- override fun fromHtml(html: String): Spanned {
- return HtmlUtils.fromHtml(html)
- }
-
- override fun toHtml(text: Spanned): String {
- return HtmlUtils.toHtml(text)
- }
-}
\ No newline at end of file
diff --git a/app/src/main/java/com/keylesspalace/tusky/util/HtmlUtils.java b/app/src/main/java/com/keylesspalace/tusky/util/HtmlUtils.java
deleted file mode 100644
index cba8f2fab..000000000
--- a/app/src/main/java/com/keylesspalace/tusky/util/HtmlUtils.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/* Copyright 2017 Andrew Dawson
- *
- * This file is a part of Tusky.
- *
- * 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.
- *
- * Tusky 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 Tusky; if not,
- * see . */
-
-package com.keylesspalace.tusky.util;
-
-import android.os.Build;
-import android.text.Html;
-import android.text.Spanned;
-
-public class HtmlUtils {
- private static CharSequence trimTrailingWhitespace(CharSequence s) {
- int i = s.length();
- do {
- i--;
- } while (i >= 0 && Character.isWhitespace(s.charAt(i)));
- return s.subSequence(0, i + 1);
- }
-
- public static Spanned fromHtml(String html) {
- Spanned result;
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
- result = Html.fromHtml(html, Html.FROM_HTML_MODE_LEGACY);
- } else {
- result = Html.fromHtml(html);
- }
- /* Html.fromHtml returns trailing whitespace if the html ends in a tag, which
- * all status contents do, so it should be trimmed. */
- return (Spanned) trimTrailingWhitespace(result);
- }
-
- public static String toHtml(Spanned text) {
- String result;
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
- result = Html.toHtml(text, Html.TO_HTML_PARAGRAPH_LINES_CONSECUTIVE);
- } else {
- result = Html.toHtml(text);
- }
- return result;
- }
-}
diff --git a/app/src/main/java/com/keylesspalace/tusky/util/ListStatusAccessibilityDelegate.kt b/app/src/main/java/com/keylesspalace/tusky/util/ListStatusAccessibilityDelegate.kt
index 8373d2bc3..8594dfc60 100644
--- a/app/src/main/java/com/keylesspalace/tusky/util/ListStatusAccessibilityDelegate.kt
+++ b/app/src/main/java/com/keylesspalace/tusky/util/ListStatusAccessibilityDelegate.kt
@@ -82,6 +82,8 @@ class ListStatusAccessibilityDelegate(
}
if (status.reblogsCount > 0) info.addAction(openRebloggedByAction)
if (status.favouritesCount > 0) info.addAction(openFavsAction)
+
+ info.addAction(moreAction)
}
}
@@ -150,6 +152,9 @@ class ListStatusAccessibilityDelegate(
interrupt()
statusActionListener.onShowFavs(pos)
}
+ R.id.action_more -> {
+ statusActionListener.onMore(host, pos)
+ }
else -> return super.performAccessibilityAction(host, action, args)
}
return true
@@ -311,5 +316,10 @@ class ListStatusAccessibilityDelegate(
R.id.action_open_faved_by,
context.getString(R.string.action_open_faved_by))
+ private val moreAction = AccessibilityActionCompat(
+ R.id.action_more,
+ context.getString(R.string.action_more)
+ )
+
private data class LinkSpanInfo(val text: String, val link: String)
}
\ No newline at end of file
diff --git a/app/src/main/java/com/keylesspalace/tusky/util/NotificationHelper.java b/app/src/main/java/com/keylesspalace/tusky/util/NotificationHelper.java
index 4e0d298d7..c98e8b5ca 100644
--- a/app/src/main/java/com/keylesspalace/tusky/util/NotificationHelper.java
+++ b/app/src/main/java/com/keylesspalace/tusky/util/NotificationHelper.java
@@ -113,6 +113,7 @@ public class NotificationHelper {
**/
public static final String CHANNEL_MENTION = "CHANNEL_MENTION";
public static final String CHANNEL_FOLLOW = "CHANNEL_FOLLOW";
+ public static final String CHANNEL_FOLLOW_REQUEST = "CHANNEL_FOLLOW_REQUEST";
public static final String CHANNEL_BOOST = "CHANNEL_BOOST";
public static final String CHANNEL_FAVOURITE = "CHANNEL_FAVOURITE";
public static final String CHANNEL_POLL = "CHANNEL_POLL";
@@ -348,6 +349,7 @@ public class NotificationHelper {
String[] channelIds = new String[]{
CHANNEL_MENTION + account.getIdentifier(),
CHANNEL_FOLLOW + account.getIdentifier(),
+ CHANNEL_FOLLOW_REQUEST + account.getIdentifier(),
CHANNEL_BOOST + account.getIdentifier(),
CHANNEL_FAVOURITE + account.getIdentifier(),
CHANNEL_POLL + account.getIdentifier(),
@@ -355,6 +357,7 @@ public class NotificationHelper {
int[] channelNames = {
R.string.notification_mention_name,
R.string.notification_follow_name,
+ R.string.notification_follow_request_name,
R.string.notification_boost_name,
R.string.notification_favourite_name,
R.string.notification_poll_name
@@ -362,12 +365,13 @@ public class NotificationHelper {
int[] channelDescriptions = {
R.string.notification_mention_descriptions,
R.string.notification_follow_description,
+ R.string.notification_follow_request_description,
R.string.notification_boost_description,
R.string.notification_favourite_description,
R.string.notification_poll_description
};
- List channels = new ArrayList<>(5);
+ List channels = new ArrayList<>(6);
NotificationChannelGroup channelGroup = new NotificationChannelGroup(account.getIdentifier(), account.getFullName());
@@ -508,6 +512,8 @@ public class NotificationHelper {
return account.getNotificationsMentioned();
case FOLLOW:
return account.getNotificationsFollowed();
+ case FOLLOW_REQUEST:
+ return account.getNotificationsFollowRequested();
case REBLOG:
return account.getNotificationsReblogged();
case FAVOURITE:
@@ -525,6 +531,8 @@ public class NotificationHelper {
return CHANNEL_MENTION + account.getIdentifier();
case FOLLOW:
return CHANNEL_FOLLOW + account.getIdentifier();
+ case FOLLOW_REQUEST:
+ return CHANNEL_FOLLOW_REQUEST + account.getIdentifier();
case REBLOG:
return CHANNEL_BOOST + account.getIdentifier();
case FAVOURITE:
@@ -594,6 +602,9 @@ public class NotificationHelper {
case FOLLOW:
return String.format(context.getString(R.string.notification_follow_format),
accountName);
+ case FOLLOW_REQUEST:
+ return String.format(context.getString(R.string.notification_follow_request_format),
+ accountName);
case FAVOURITE:
return String.format(context.getString(R.string.notification_favourite_format),
accountName);
@@ -613,6 +624,7 @@ public class NotificationHelper {
private static String bodyForType(Notification notification, Context context) {
switch (notification.getType()) {
case FOLLOW:
+ case FOLLOW_REQUEST:
return "@" + notification.getAccount().getUsername();
case MENTION:
case FAVOURITE:
@@ -631,7 +643,7 @@ public class NotificationHelper {
Poll poll = notification.getStatus().getPoll();
for(PollOption option: poll.getOptions()) {
builder.append(buildDescription(option.getTitle(),
- PollViewDataKt.calculatePercent(option.getVotesCount(), poll.getVotesCount()),
+ PollViewDataKt.calculatePercent(option.getVotesCount(), poll.getVotersCount(), poll.getVotesCount()),
context));
builder.append('\n');
}
diff --git a/app/src/main/java/com/keylesspalace/tusky/util/StatusDisplayOptions.kt b/app/src/main/java/com/keylesspalace/tusky/util/StatusDisplayOptions.kt
index 143af1f82..eaaa5e19f 100644
--- a/app/src/main/java/com/keylesspalace/tusky/util/StatusDisplayOptions.kt
+++ b/app/src/main/java/com/keylesspalace/tusky/util/StatusDisplayOptions.kt
@@ -10,5 +10,9 @@ data class StatusDisplayOptions(
@get:JvmName("showBotOverlay")
val showBotOverlay: Boolean,
@get:JvmName("useBlurhash")
- val useBlurhash: Boolean
+ val useBlurhash: Boolean,
+ @get:JvmName("cardViewMode")
+ val cardViewMode: CardViewMode,
+ @get:JvmName("confirmReblogs")
+ val confirmReblogs: Boolean
)
\ No newline at end of file
diff --git a/app/src/main/java/com/keylesspalace/tusky/util/StatusViewHelper.kt b/app/src/main/java/com/keylesspalace/tusky/util/StatusViewHelper.kt
index 840e220e4..79c0c4b84 100644
--- a/app/src/main/java/com/keylesspalace/tusky/util/StatusViewHelper.kt
+++ b/app/src/main/java/com/keylesspalace/tusky/util/StatusViewHelper.kt
@@ -24,7 +24,6 @@ import android.widget.ImageView
import android.widget.TextView
import androidx.annotation.DrawableRes
import androidx.appcompat.content.res.AppCompatResources
-import androidx.core.content.ContextCompat
import com.bumptech.glide.Glide
import com.keylesspalace.tusky.R
import com.keylesspalace.tusky.entity.Attachment
@@ -172,15 +171,12 @@ class StatusViewHelper(private val itemView: View) {
sensitiveMediaWarning.visibility = View.GONE
sensitiveMediaShow.visibility = View.GONE
} else {
-
- val hiddenContentText: String = if (sensitive) {
+ sensitiveMediaWarning.text = if (sensitive) {
context.getString(R.string.status_sensitive_media_title)
} else {
context.getString(R.string.status_media_hidden_title)
}
- sensitiveMediaWarning.text = HtmlUtils.fromHtml(hiddenContentText)
-
sensitiveMediaWarning.visibility = if (showingContent) View.GONE else View.VISIBLE
sensitiveMediaShow.visibility = if (showingContent) View.VISIBLE else View.GONE
sensitiveMediaShow.setOnClickListener { v ->
@@ -275,17 +271,22 @@ class StatusViewHelper(private val itemView: View) {
private fun getPollInfoText(timestamp: Long, poll: PollViewData, pollDescription: TextView, useAbsoluteTime: Boolean): CharSequence {
val context = pollDescription.context
- val votes = NumberFormat.getNumberInstance().format(poll.votesCount.toLong())
- val votesText = context.resources.getQuantityString(R.plurals.poll_info_votes, poll.votesCount, votes)
- val pollDurationInfo: CharSequence
- if (poll.expired) {
- pollDurationInfo = context.getString(R.string.poll_info_closed)
+
+ val votesText = if(poll.votersCount == null) {
+ val votes = NumberFormat.getNumberInstance().format(poll.votesCount.toLong())
+ context.resources.getQuantityString(R.plurals.poll_info_votes, poll.votesCount, votes)
+ } else {
+ val votes = NumberFormat.getNumberInstance().format(poll.votersCount.toLong())
+ context.resources.getQuantityString(R.plurals.poll_info_people, poll.votersCount, votes)
+ }
+ val pollDurationInfo = if (poll.expired) {
+ context.getString(R.string.poll_info_closed)
} else {
if (useAbsoluteTime) {
- pollDurationInfo = context.getString(R.string.poll_info_time_absolute, getAbsoluteTime(poll.expiresAt))
+ context.getString(R.string.poll_info_time_absolute, getAbsoluteTime(poll.expiresAt))
} else {
val pollDuration = TimestampUtils.formatPollDuration(context, poll.expiresAt!!.time, timestamp)
- pollDurationInfo = context.getString(R.string.poll_info_time_relative, pollDuration)
+ context.getString(R.string.poll_info_time_relative, pollDuration)
}
}
@@ -298,7 +299,7 @@ class StatusViewHelper(private val itemView: View) {
for (i in 0 until Status.MAX_POLL_OPTIONS) {
if (i < options.size) {
- val percent = calculatePercent(options[i].votesCount, poll.votesCount)
+ val percent = calculatePercent(options[i].votesCount, poll.votersCount, poll.votesCount)
val pollOptionText = buildDescription(options[i].title, percent, pollResults[i].context)
pollResults[i].text = CustomEmojiHelper.emojifyText(pollOptionText, emojis, pollResults[i])
diff --git a/app/src/main/java/com/keylesspalace/tusky/viewdata/PollViewData.kt b/app/src/main/java/com/keylesspalace/tusky/viewdata/PollViewData.kt
index dff0c9f60..b6eefd713 100644
--- a/app/src/main/java/com/keylesspalace/tusky/viewdata/PollViewData.kt
+++ b/app/src/main/java/com/keylesspalace/tusky/viewdata/PollViewData.kt
@@ -18,10 +18,10 @@ package com.keylesspalace.tusky.viewdata
import android.content.Context
import android.text.SpannableStringBuilder
import android.text.Spanned
+import androidx.core.text.parseAsHtml
import com.keylesspalace.tusky.R
import com.keylesspalace.tusky.entity.Poll
import com.keylesspalace.tusky.entity.PollOption
-import com.keylesspalace.tusky.util.HtmlUtils
import java.util.*
import kotlin.math.roundToInt
@@ -31,6 +31,7 @@ data class PollViewData(
val expired: Boolean,
val multiple: Boolean,
val votesCount: Int,
+ val votersCount: Int?,
val options: List,
var voted: Boolean
)
@@ -41,16 +42,17 @@ data class PollOptionViewData(
var selected: Boolean
)
-fun calculatePercent(fraction: Int, total: Int): Int {
+fun calculatePercent(fraction: Int, totalVoters: Int?, totalVotes: Int): Int {
return if (fraction == 0) {
0
} else {
+ val total = totalVoters ?: totalVotes
(fraction / total.toDouble() * 100).roundToInt()
}
}
fun buildDescription(title: String, percent: Int, context: Context): Spanned {
- return SpannableStringBuilder(HtmlUtils.fromHtml(context.getString(R.string.poll_percent_format, percent)))
+ return SpannableStringBuilder(context.getString(R.string.poll_percent_format, percent).parseAsHtml())
.append(" ")
.append(title)
}
@@ -58,20 +60,21 @@ fun buildDescription(title: String, percent: Int, context: Context): Spanned {
fun Poll?.toViewData(): PollViewData? {
if (this == null) return null
return PollViewData(
- id,
- expiresAt,
- expired,
- multiple,
- votesCount,
- options.map { it.toViewData() },
- voted
+ id = id,
+ expiresAt = expiresAt,
+ expired = expired,
+ multiple = multiple,
+ votesCount = votesCount,
+ votersCount = votersCount,
+ options = options.map { it.toViewData() },
+ voted = voted
)
}
fun PollOption.toViewData(): PollOptionViewData {
return PollOptionViewData(
- title,
- votesCount,
- false
+ title = title,
+ votesCount = votesCount,
+ selected = false
)
}
\ No newline at end of file
diff --git a/app/src/main/java/com/keylesspalace/tusky/viewdata/StatusViewData.java b/app/src/main/java/com/keylesspalace/tusky/viewdata/StatusViewData.java
index a3e65346b..6b89e9e25 100644
--- a/app/src/main/java/com/keylesspalace/tusky/viewdata/StatusViewData.java
+++ b/app/src/main/java/com/keylesspalace/tusky/viewdata/StatusViewData.java
@@ -58,6 +58,7 @@ public abstract class StatusViewData {
final boolean reblogged;
final boolean favourited;
final boolean bookmarked;
+ private final boolean muted;
@Nullable
private final String spoilerText;
private final Status.Visibility visibility;
@@ -96,7 +97,7 @@ public abstract class StatusViewData {
private final Status quote;
private final boolean isNotestock;
- public Concrete(String id, Spanned content, boolean reblogged, boolean favourited, boolean bookmarked,
+ public Concrete(String id, Spanned content, boolean reblogged, boolean favourited, boolean bookmarked, boolean muted,
@Nullable String spoilerText, Status.Visibility visibility, List attachments,
@Nullable String rebloggedByUsername, @Nullable String rebloggedAvatar, boolean sensitive, boolean isExpanded,
boolean isShowingContent, String userFullName, String nickname, String avatar,
@@ -119,6 +120,7 @@ public abstract class StatusViewData {
this.reblogged = reblogged;
this.favourited = favourited;
this.bookmarked = bookmarked;
+ this.muted = muted;
this.visibility = visibility;
this.attachments = attachments;
this.rebloggedByUsername = rebloggedByUsername;
@@ -167,6 +169,10 @@ public abstract class StatusViewData {
return bookmarked;
}
+ public boolean isMuted() {
+ return muted;
+ }
+
@Nullable
public String getSpoilerText() {
return spoilerText;
@@ -419,6 +425,7 @@ public abstract class StatusViewData {
private boolean reblogged;
private boolean favourited;
private boolean bookmarked;
+ private boolean muted;
private String spoilerText;
private Status.Visibility visibility;
private List attachments;
@@ -457,6 +464,7 @@ public abstract class StatusViewData {
reblogged = viewData.reblogged;
favourited = viewData.favourited;
bookmarked = viewData.bookmarked;
+ muted = viewData.muted;
spoilerText = viewData.spoilerText;
visibility = viewData.visibility;
attachments = viewData.attachments == null ? null : new ArrayList<>(viewData.attachments);
@@ -512,6 +520,11 @@ public abstract class StatusViewData {
return this;
}
+ public Builder setMuted(boolean muted) {
+ this.muted = muted;
+ return this;
+ }
+
public Builder setSpoilerText(String spoilerText) {
this.spoilerText = spoilerText;
return this;
@@ -675,7 +688,7 @@ public abstract class StatusViewData {
if (this.accountEmojis == null) accountEmojis = Collections.emptyList();
if (this.createdAt == null) createdAt = new Date();
- return new StatusViewData.Concrete(id, content, reblogged, favourited, bookmarked, spoilerText,
+ return new StatusViewData.Concrete(id, content, reblogged, favourited, bookmarked, muted, spoilerText,
visibility, attachments, rebloggedByUsername, rebloggedAvatar, isSensitive, isExpanded,
isShowingContent, userFullName, nickname, avatar, createdAt, reblogsCount,
favouritesCount, inReplyToId, mentions, senderId, rebloggingEnabled, application,
diff --git a/app/src/main/res/layout/activity_compose.xml b/app/src/main/res/layout/activity_compose.xml
index 3d9e205e0..d287e7fa4 100644
--- a/app/src/main/res/layout/activity_compose.xml
+++ b/app/src/main/res/layout/activity_compose.xml
@@ -255,10 +255,10 @@
android:layout_height="wrap_content"
android:background="?attr/colorSurface"
android:elevation="12dp"
- android:paddingStart="16dp"
- android:paddingTop="8dp"
- android:paddingEnd="16dp"
- android:paddingBottom="52dp"
+ android:paddingStart="24dp"
+ android:paddingTop="12dp"
+ android:paddingEnd="24dp"
+ android:paddingBottom="60dp"
app:behavior_hideable="true"
app:behavior_peekHeight="0dp"
app:layout_behavior="com.google.android.material.bottomsheet.BottomSheetBehavior" />
diff --git a/app/src/main/res/layout/item_follow_request_notification.xml b/app/src/main/res/layout/item_follow_request_notification.xml
new file mode 100644
index 000000000..712c08d42
--- /dev/null
+++ b/app/src/main/res/layout/item_follow_request_notification.xml
@@ -0,0 +1,96 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/item_status.xml b/app/src/main/res/layout/item_status.xml
index 09381abdf..95fcbdcda 100644
--- a/app/src/main/res/layout/item_status.xml
+++ b/app/src/main/res/layout/item_status.xml
@@ -158,6 +158,73 @@
app:layout_constraintTop_toBottomOf="@id/status_content_warning_button"
tools:text="This is a status" />
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/item_status_detailed.xml b/app/src/main/res/layout/item_status_detailed.xml
index b93e89a08..bec8e7544 100644
--- a/app/src/main/res/layout/item_status_detailed.xml
+++ b/app/src/main/res/layout/item_status_detailed.xml
@@ -143,7 +143,7 @@
app:layout_constraintTop_toBottomOf="@id/status_content" />
+ app:layout_constraintTop_toBottomOf="@id/status_card_view">
+ tools:layout_height="wrap_content"
+ tools:layout_width="match_parent"
+ tools:parentTag="RadioGroup">
-
+
+
+ android:layout_marginBottom="4dp"
+ android:layout_weight="1"
+ android:button="@drawable/ic_lock_open_24dp"
+ android:paddingStart="10dp"
+ android:paddingEnd="0dp"
+ android:text="@string/visibility_unlisted"
+ android:textColor="?android:textColorTertiary"
+ app:buttonTint="@color/compound_button_color" />
-
-
-
-
-
+
-
-
\ No newline at end of file
diff --git a/app/src/main/res/menu/status_more.xml b/app/src/main/res/menu/status_more.xml
index 525ce90a3..c73b7e9f0 100644
--- a/app/src/main/res/menu/status_more.xml
+++ b/app/src/main/res/menu/status_more.xml
@@ -21,6 +21,9 @@
+
diff --git a/app/src/main/res/menu/status_more_for_user.xml b/app/src/main/res/menu/status_more_for_user.xml
index 9b363e492..e4f391ab2 100644
--- a/app/src/main/res/menu/status_more_for_user.xml
+++ b/app/src/main/res/menu/status_more_for_user.xml
@@ -26,6 +26,9 @@
android:id="@+id/status_unreblog_private"
android:title="@string/unreblog_private"
android:visible="false" />
+
diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml
index f523690ff..8283b3b5f 100644
--- a/app/src/main/res/values-ar/strings.xml
+++ b/app/src/main/res/values-ar/strings.xml
@@ -2,82 +2,82 @@
وقع هناك خطأ.حدث خطأ في الشبكة! يرجى التحقق من اتصالك ثم أعد المحاولة!
- لا يجب أن يترك فارغا.
- اسم النطاق غير صالح
+ لا يجب أن يترك هذا الحقل فارغا.
+ اسم النطاق الذي قمتَ بإدخاله غير صالحاخفقت المصادقة مع مثيل الخادم هذا.
- تعذر العثور على متصفح ويب قابل للإستعمال.
+ تعذر العثور على متصفح ويب صالح للإستعمال.لقد وقع هناك خطأ مجهول في التصريح.تم رفض التصريح.
- فشل الحصول على رمز الدخول.
- المنشور طويل جدا !
- يجب أن يكون حجم الملف أقل من 4 ميغابايت.
+ فشل الحصول على رمز الولوج.
+ إنّ المنشور طويل جدا!
+ يجب أن يكون حجم الملف أقل من 8 ميغابايت.يجب أن يكون حجم ملفات الفيديو أقل من 40 ميغا بايت.
- لا يمكن رفع هذا النوع من الملفات.
+ لا يمكن تحميل هذا النوع من الملفات.تعذر فتح ذاك الملف.التصريح لازم لقراءة الوسائط.التصريح لازم للإحتفاظ بالوسائط.
- لا يمكنك إرفاق كلا من الصور و الفيديوهات في نفس المنشور.
+ لا يمكنك إرفاق كلا من الصور والفيديوهات في نفس المنشور في آن واحد.اخفقت عملية الرفع.خطأ عند إرسال التبويق.
- الرئيسية
+ الرئيسيالاشعارات
- المحلية
- الفدرالية
+ المحلي
+ الفدراليالرسائل المباشرةالألسنةتبويق
- المشاركات
- يحتوي على ردود
- مدبّس
+ المنشورات
+ التبويقات والردود
+ المدبّسةالمتابَعونالمتابِعونالمفضلةالحسابات المكتومةالحسابات المحظورةطلبات المتابعة
- عدل ملفك الشخصي
+ عدل ملفك التعريفيالمسوداتالرّخص\@%s
- %s رقّي
+ شارَكَه %sمحتوى حساسوسائط مخفيةاضغط للعرض
- اعرض أكثر
+ اعرض المزيداعرض أقلتوسيعتصغيرلا شيء هنا.
- لا يوجد شيئ هنا. إسحب إلى أسفل للتحديث !
- رقّى %s تبويقك
+ لا يوجد شيء هنا. إسحب إلى أسفل للإنعاش!
+ شارَك %s تبويقكأعجِب %s بتبويقك%s يتبعكأبلغ عن @%s
- تعليقات إضافية ؟
- إجابة سريعة
- أجب
+ تعليقات إضافية؟
+ رد سريع
+ ردرقّيإزالة الترقيةتفضيلإزالة المفضلةالمزيدحرر
- التسجيل بواسطة ماستدون
+ الولوج إلى ماستدونخروج
- متأكد مِن أنك تود الخروج من الحساب %1$s ؟
+ متأكد مِن أنك تود الخروج من الحساب %1$s؟إتبع
- إلغاء التتبع
+ إلغاء المتابعةقم بحظرهإلغاء الحظرإخفاء الترقياتإظهار الترقيات
- أبلغ
+ أبلغ عنهإحذفبَوّقبوّق!
- إعادة المحاولة
+ أعد المحاولةإغلاق
- الملف الشخصي
+ الملف التعريفيالتفضيلاتتفضيلات الحسابالمفضلة
@@ -95,7 +95,7 @@
إخفاء الوسائطإفتح الدرجإحفظ
- تعديل الملف الشخصي
+ تعديل الملف التعريفيتعديلإلغاءموافقة
@@ -109,8 +109,8 @@
الروابطالإشاراتالوسوم
- عرض الترقيات
- عرض المفضلات
+ اعرض الترقيات
+ اعرض المفضلاتالوسومالإشاراتالروابط
@@ -120,23 +120,23 @@
شاركه كـ…شارك رابط التبويق مع…شارك التبويق على…
- شارك رابط التبويق مع…
- تم الإرسال !
+ شارك الوسيط مع…
+ تم إرساله!تم فك الحجب عن الحساب
- تم فك الكتم عن الحساب
- تم إرساله !
+ لم يعد الحساب مكتومًا
+ تم إرساله!تم إرسال الرد بنجاح.
- أي سيرفر ؟
- ما الجديد ؟
+ أي مثيل خادم؟
+ ما الجديد؟تحذير عن المحتوىالإسم العلنيالسيرةالبحث عن…
- لم يتم العثور على نتائج
- إجابة …
- الصورة الرمزية
- رأس الصفحة
- ماذا نعني بمثيل الخادم ؟
+ لم يتم العثور على أية نتائج
+ رد…
+ صورة الملف التعريفي
+ صورة رأس الصفحة
+ ماذا نعني بمثيل الخادم؟الإتصال جارٍ…بإمكانك إدخال عنوان أي مثيل خادوم ماستدون هنا. على سبيل المثال mastodon.social أو icosahedron.website أو social.tchncs.de أوالإطلاع على لاكتشاف المزيد !
\n
@@ -148,13 +148,13 @@
تتمة رفع الوسائطالإرسال جارٍ…تنزيل
- هل تريد رفض طلب المتابعة ؟
- هل تود إلغاء متابعة هذا الحساب ؟
+ هل تريد رفض طلب المتابعة؟
+ هل تود إلغاء متابعة هذا الحساب؟هل تريد حذف هذا التبويق؟
- عمومي : ينشر على الخيوط العمومية
- غير مدرج : لا يُعرَض على الخيوط العمومية
- لمتابعيك فقط : يُنشر إلى متابعيك فقط
- مباشر : يُنشر إلى المستخدمين المشار إليهم فقط
+ للعامة: ينشر على الخيوط العمومية
+ غير مدرج: لا يُعرَض على الخيوط العمومية
+ لمتابعيك فقط: يُنشر إلى متابعيك فقط
+ مباشر: يُنشر إلى المستخدمين المشار إليهم فقطتعديل الاشعاراتالإخطاراتالتنبيهات
@@ -163,12 +163,12 @@
إعلام بالضوءأخطرني عندمايشار إلي
- يتبعني أحد
+ يتبعني أحدهمتُرقّى منشوراتي
- أعجب أحد ما بمنشوراتي
+ يُعجَب أحد ما بمنشوراتيالمظهر
- سمة التطبيق
- الخيوط
+ حُلّة التطبيق
+ الخيوط الزمنيةعوامل التصفيةداكنةفاتحة
@@ -339,7 +339,7 @@
إظهار صاحب الترقيةافتح الوسيط #%d
- تنزيل الوسائط
+ نزّل الوسائطجارٍ تنزيل الوسائطهل تريد حذف وإعادة صياغة هذا التبويق؟
@@ -378,7 +378,7 @@
لقد انتهى استطلاع رأي قمتَ بإنشائه
-انتهت استطلاعات الرأي
+تنتهي استطلاعات الرأي%1$s" مفضلة"%1$s مفضلة
@@ -457,7 +457,7 @@
الكلمة كاملةاستطلاع رأي بالخيارات: %1$s, %2$s, %3$s, %4$s; %5$s
- هل أنت متأكد من أنك تريد حجب كافة %s ؟ سوف لن يكون باستطاعتك رؤية أي محتوى قادم من هذا النطاق بعد الآن ، لا في الخيوط الزمنية العامة ولا في إخطاراتك. سيتم إزالة متابِعيك الذين هم على هذا النطاق.
+ هل أنت متأكد من أنك تريد حجب كافة %s؟ سوف لن يكون باستطاعتك رؤية أي محتوى قادم من هذا النطاق بعد الآن ، لا في الخيوط الزمنية العامة ولا في إخطاراتك. سيتم إزالة متابِعيك الذين هم على هذا النطاق.سيتم إرسال التقرير إلى مشرفي خادمك. يمكنك تقديم تفسير عن سبب الإبلاغ عن الحساب أدناه:هذا الحساب ينتسب إلى خادم آخر. هل تريد إرسال نسخة مجهولة من التقرير إلى هناك أيضا؟
@@ -501,4 +501,6 @@
ليس لديك أية منشورات مُبرمَجة للنشر.يجب أن يكون حجم الملفات الصوتية أقل مِن 40 ميغابايت.
-
+ تُقدّر أدنى فترة لبرمجة النشر في ماستدون بـ 5 دقائق.
+
+
diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml
index 8468775f2..7397d6eb1 100644
--- a/app/src/main/res/values-ca/strings.xml
+++ b/app/src/main/res/values-ca/strings.xml
@@ -534,4 +534,7 @@
No tens cap estat planificat.
-
+Els fitxers d\'àudio han de ser més petits de 40MB.
+ No tens cap esborrany.
+ L\'interval mínim de planificació a Mastodon és de 5 minuts.
+
diff --git a/app/src/main/res/values-en-rAU/strings.xml b/app/src/main/res/values-en-rAU/strings.xml
new file mode 100644
index 000000000..a6b3daec9
--- /dev/null
+++ b/app/src/main/res/values-en-rAU/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values-eo/strings.xml b/app/src/main/res/values-eo/strings.xml
index 3db61033c..7368d6dc1 100644
--- a/app/src/main/res/values-eo/strings.xml
+++ b/app/src/main/res/values-eo/strings.xml
@@ -469,4 +469,9 @@
ListoEraro dum elserĉo de la mesaĝo %s
-
+Aŭdia dosiero devas esti malpli ol 40MB.
+ Montri buntajn transirojn por kaŝitaj aŭdovidaĵoj
+
+ Vi ne havas iun ajn malneton.
+ Vi ne havas iun ajn planitan mesaĝon.
+
diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml
index 930387376..8e0125818 100644
--- a/app/src/main/res/values-es/strings.xml
+++ b/app/src/main/res/values-es/strings.xml
@@ -4,7 +4,7 @@
¡Se ha producido un error de red! ¡Por favor, comprueba tu conexión e inténtalo de nuevo!Este campo no puede estar vacío.Nombre de dominio incorrecto
- Inicio de sesión fallido.
+ Fallo de autenticación con esta instancia.No se ha encontrado ningún navegador web.Ocurrió un error de autorización no identificado.La autorización falló.
@@ -474,9 +474,10 @@
Seleccionar listaListaLos ficheros de audio deben ser menores de 40MB.
- Mostrar degradados coloridos para el contenido multimedia oculto.
+ Mostrar degradados coloridos para el contenido multimedia ocultoNo tienes ningún borrador.No tienes ningún estado programado.
-
+Mastodon tiene un intervalo de programación mínimo de 5 minutos.
+
diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml
index 2fb2fccf0..e3b6106e3 100644
--- a/app/src/main/res/values-fr/strings.xml
+++ b/app/src/main/res/values-fr/strings.xml
@@ -39,7 +39,7 @@
BrouillonsLicences\@%s
- %s a boosté
+ %s a partagéContenu sensibleMédia cachéCliquer pour voir
@@ -49,15 +49,15 @@
ReplierRien ici.Il n’y a aucun pouet pour le moment.\nGlissez vers le bas pour actualiser !
- %s a boosté votre pouet
+ %s a partagé votre pouet%s a ajouté votre pouet à ses favoris%s vous suitSignaler @%sCommentaires additonnels ?Réponse rapideRépondre
- Booster
- Supprimer le boost
+ Partager
+ Annuler le partageFavoriSupprimer le favoriPlus
@@ -69,8 +69,8 @@
Ne plus suivreBloquerDébloquer
- Cacher les boosts
- Montrer les boosts
+ Cacher les partages
+ Montrer les partagesSignalerSupprimerPOUET
@@ -109,8 +109,8 @@
LiensMentionsHashtags
- Afficher l’auteur·rice du boost
- Afficher les boosts
+ Afficher l’auteur·rice du partage
+ Montrer les partagesMontrer les favorisHashtagsMentions
@@ -170,7 +170,7 @@
Me notifier lorsqueon me mentionneon me suit
- mes messages sont boostés
+ mes pouets sont partagésmes messages sont mis en favorisApparenceThème de l’application
@@ -187,7 +187,7 @@
LangueFiltrage des filsOnglets
- Afficher les boosts
+ Montrer les partagesAfficher les réponsesMontrer les miniatures des médiasProxy
@@ -213,7 +213,7 @@
Nouveaux abonnésNotifications pour les nouveaux abonnésPartages
- Notifications quand vos pouets sont boostés
+ Notifications quand vos pouets sont partagésFavorisNotifications quand vos pouets sont mis en favoris%s vous a mentionné
@@ -316,8 +316,8 @@
Échec du téléchargementRobot%1$s a déménagé vers :
- Booster vers l’audience originale
- Ne plus booster
+ Partager à l’audience originale
+ Annuler le partageYuito contient du code et des ressources issus des projets open source suivants :Sous licence Apache (copie ci-dessous)CC-BY 4.0
@@ -335,10 +335,10 @@
%1$s Favoris
- <b>%s</b> Boost
- <b>%s</b> Boosts
-
- Boosté par
+ %s Partage
+ %s Partages
+
+ Partagé parMis en favoris par%1$s%1$s et %2$s
@@ -371,7 +371,7 @@
FiltrerAppliquer
- Écrire un pouet
+ Rédiger un pouetÉcrireAfficher l\'indicateur de robots
@@ -486,4 +486,6 @@
Vous n’avez aucun brouillon.Vous n’avez aucun pouet planifié.
+L’intervalle minimum de planification sur Mastodon est de 5 minutes.
+
diff --git a/app/src/main/res/values-is/strings.xml b/app/src/main/res/values-is/strings.xml
index 12e3dac2d..4bbd56dc8 100644
--- a/app/src/main/res/values-is/strings.xml
+++ b/app/src/main/res/values-is/strings.xml
@@ -508,4 +508,6 @@
Þú ert ekki með neinar áætlaðar stöðufærslur.Hljóðskrár verða að vera minni en 40MB.
-
+ Mastodon er með 5 mínútna lágmarksbil fyrir áætlaðar aðgerðir.
+
+
diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml
index cbb441bdb..cc45e66b1 100644
--- a/app/src/main/res/values-ja/strings.xml
+++ b/app/src/main/res/values-ja/strings.xml
@@ -420,4 +420,10 @@
通知フィルターを表示
+ リセット
+ 音声ファイルは40MB未満にしてください。
+ ブックマーク
+ ブックマーク
+ 編集
+ ブックマーク
diff --git a/app/src/main/res/values-kab/strings.xml b/app/src/main/res/values-kab/strings.xml
index 09780b592..07b6d44e8 100644
--- a/app/src/main/res/values-kab/strings.xml
+++ b/app/src/main/res/values-kab/strings.xml
@@ -1,22 +1,22 @@
-Qqen γer Maṣṭudun
+Qqen ɣer MaṣṭudunIsmenyifenIrewwayen
- Ffeγ
- Iγewwaṛen
- Iγewwaṛen n umiḍan
- Ẓreg amaγnu
+ Ffeɣ
+ Iɣewwaṛen
+ Iɣewwaṛen n umiḍan
+ Ẓreg amaɣnuNadi
- Γef
- Umuγen
- Umuγen
- Tijewwiqt-ik aṭas i γuzzifet!
+ Ɣef
+ Umuɣen
+ Umuɣen
+ Tijewwiqt-ik aṭas i ɣuzzifet!AgejdanIccarenTijewwiqtIznanS tririyin
- Ẓreg amaγnu-ik
+ Ẓreg amaɣnu-ik\@%sZeṛ ugarZeṛ kra kan
@@ -35,13 +35,13 @@
JEWWEQ!Ɛreḍ tikkelt-nniḍenDerreɛ
- Amaγnu
+ AmaɣnuIsmenyifenLdi deg uminigBḍuSgugemIrewwayen
- Sken-ed ismenyifen
+ Sken-d ismenyifenIsmenyifen
@@ -51,11 +51,11 @@
Ur tesɛiḍ ara irewwayen.Tella-d tucḍa.
- Tilγa
+ TilɣaD acu i ttummant\?Ticraḍ
- Rnu γer ticraḍ
+ Rnu ɣer ticraḍTicraḍSgugem %sBder
@@ -64,20 +64,20 @@
SefsexAnasiw n imujiyenRnu iccer
- Nγel aseγwen
+ Nɣel aseɣwenLdi amzun d %sBḍu amzun d…
- Bḍu aseγwen n tijewwiq s…
+ Bḍu aseɣwen n tijewwiq s…Bḍu tijewwiqt d…Anta tummant\?d-acu i gellan d amaynut\?Nadi…Tiririn…
- Tugna n umaγnu
+ Tugna n umaɣnuSiderKkes tijewwiqt-a\?
- Ẓreg tilγa
+ Ẓreg tilɣaAgrudemAceɛlalAberkan
@@ -88,7 +88,7 @@
%1$s, %2$s, akked %3$s%1$s akked %2$sTusky %s
- Amaγnu n Tusky
+ Amaɣnu n TuskyTugniwinTibidyutin
@@ -109,17 +109,17 @@
SenṭeḍImiḍanen yettwasgugmen
- Imiḍanen yettusḥebsen
- Tiγula yettwaffren
+ Imiḍan yettwacekklen
+ Tiɣula yettwaffrenIsuturen n teḍfeṛt
- Taγwalt
+ TaɣwaltSfeḍImiḍanen yettwasgugmen
- Imiḍanen yettusḥebsen
- Tiγula yettwaffren
+ Imiḍanen yettwacekklen
+ Tiɣula yettwaffrenIsuturen n teḍfeṛt
- Ẓreg tilγa
- Taγwalt
+ Tilɣa
+ TaywaltKkesAzen
@@ -129,28 +129,28 @@
Rnu assenqedṬef tugnaTimeẓriwt n tijewwaqt
- Sγiwes tijewwaqt-a
+ Sɣiwes tijewwaqt-aBḍu agbur n tijewwiqt-a
- Bḍu aseγwen γer tijewwiqt
+ Bḍu aseɣwen ɣer tijewwiqtRnu amsizdegẒreg amsizdeg
- Snulfu-d umuγ
- Snifel isem n wumuγ
- Kkes umuγ-a
- Ẓreg umuγ-a
- Rnu yiwen umiḍan γer tabdert
- Kkes amiḍan seg wumuγ
+ Snulfu-d umuɣ
+ Snifel isem n wumuɣ
+ Kkes umuɣ-a
+ Ẓreg umuɣ-a
+ Rnu yiwen umiḍan ɣer wummuɣ
+ Kkes amiḍan seg wumuɣRnu isefka
- Isem n wumuγ
+ Isem n wumuɣFren tabdart
- Umuγ
+ UmuɣSizdegImiḍanenRnu yiwen wefran
- Ccetki γef @%s
- Ccetki
+ Ccetki ɣef @%s
+ Ccetki fell-asGgamiYessidired %1$s
@@ -159,16 +159,16 @@
itteqqen…Issalay…
- fukken kran n wadγaren
+ fukken kran n wadɣarenImzizdigenAkken yella yiṭijIminig
- Sken-ed tiririyin
+ Sken-d tiririyinApṛuksi HTTPTansa n upṛuksi HTTPImeḍfaṛen imaynuten
- Adγaren
+ AdɣarenYuder-ik-id %sYettwargel umiḍan
@@ -183,26 +183,26 @@
Ales tanekraTuccḍa n usider
- Igujj %1$s γer:
+ Igujj %1$s ɣer:Kkes asenṭeḍ%1$s%1$s akked %2$s%1$s, %2$s akked %3$d nniḍenAru tijewwiqt
- %1$s • %2$s
+ %1$s • %2$s
- %s wedγar
- %s n yedγaren
+ %s n wedɣar
+ %s n yedɣaren%s id yugranad ifak deg %sifuk
- Dγer
+ Dɣer
- Ifuk, tura kan, yiwen wedγar t tteki-iḍ degs
- Ifukk yiwen wedγar id snulfaḍ
+ Ifuk, tura kan, yiwen wedɣar t tteki-iḍ degs
+ Ifukk yiwen wedɣar id snulfaḍ%d n wass
@@ -214,18 +214,18 @@
%d n tasdidt
- %d n tesdidin
+ %d n tisdidinKemmel
- Uγal
+ UɣalTella-d tuccḍa deg ccetkiTucḍa n unadiAssenqed
- 5 n tasditin
- 30 n tasditin
- 1 n wesrag
- 6 n wesragen
+ 5 n tisdidin
+ 30 n tisdidin
+ 1 n usrag
+ 6 n isragen1 n wass3 n wussan7 n wussan
@@ -233,30 +233,70 @@
Ig ṭafaṛImeḍfaṛen
- Nadi γef medden i teṭafareḍ
+ Nadi ɣef medden i teṭafareḍImeḍfaṛen
- Iseγwan
+ IseɣwanTibdarinTibdarin
- Iseγwan
+ IseɣwanYettwaceyyaɛ!Yettwaceyyaɛ!Ula d yiwen n ugmuḍI yimeḍfaṛen kan
- Teγzi n weḍṛis
+ Teɣzi n weḍṛisYettwamdemmar s TuskyAsmel Web n usenfaṛ:
\n https://tusky.app
- %dasr
- %dtas
- %dtasn
+ %dsr
+ %dtsd
+ %dtsnSekles amzun d arewway\?TickiAṛubut
- Yettwarna γer ticṛad
+ Yettwarna ɣer ticṛad
+ deg %dsr
+ deg %dtsd
+ deg %dtsn
+
+ %d n tasint
+ %d n tasinin
+
+
+ Agbur amḥulfu
+ Creḍ allal n teywalt amzun d amḥulfu
+ Wennez tikkelt-nniḍen
+ Asali ur yeddi ara.
+ Tuccḍa deg tuzna n tijewwiqt.
+
+ Adigan
+ Turagin
+
+ Yebḍa-t %s
+ %s Y·Tebḍa tijewwiqt-ik·im
+ %s Y·Terna tijewwiqt-ik·im ɣer imenyafen-is
+ Tiririt taruradt
+ Bḍu
+ Kkes beṭu
+ Ffer beṭuyat
+ Sken-d beṭuyat
+ Ur sgugum ara
+ Ddeg
+ Ihacṭagen
+ Sken-d beṭuyat
+ Ihacṭagen
+ Aseqdac nni ur yettwasgugem ara tura
+ %s ur yettwaffer ara
+
+ Assisen
+ Tugna n yiɣef n umaɣnu
+
+ Ur ilaq ara ad yili d ilem.
+ Cekkel
+ Kkes tacekkalt
+ Tettwakkes tacekkalt ɣef umiḍan-nni
diff --git a/app/src/main/res/values-no-rNB/strings.xml b/app/src/main/res/values-no-rNB/strings.xml
index cec156444..03f0461b9 100644
--- a/app/src/main/res/values-no-rNB/strings.xml
+++ b/app/src/main/res/values-no-rNB/strings.xml
@@ -520,4 +520,6 @@
Du har ikke lagret noen kladder.Lydfiler må være mindre enn 40MB.
-
+ Mastodon har et minimums planleggingsinterval på 5 minutter.
+
+
diff --git a/app/src/main/res/values-oc/strings.xml b/app/src/main/res/values-oc/strings.xml
index 59df430d1..bec28c053 100644
--- a/app/src/main/res/values-oc/strings.xml
+++ b/app/src/main/res/values-oc/strings.xml
@@ -491,4 +491,5 @@
Avètz pas cap de borrolhon.Avètz pas cap de tut planificat.
-
+L’interval minimum de planificacion sus Mastodon e de 5 minutas.
+
diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml
index cd58f02ee..2a4b4312b 100644
--- a/app/src/main/res/values-pl/strings.xml
+++ b/app/src/main/res/values-pl/strings.xml
@@ -498,4 +498,6 @@
Nie masz żadnych szkiców.Nie masz żadnych zaplanowanych wpisów.
+Mastodon umożliwia wysłanie minimalnie 5 minut od zaplanowania.
+
diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml
index 0153420ab..83326c81c 100644
--- a/app/src/main/res/values-pt-rBR/strings.xml
+++ b/app/src/main/res/values-pt-rBR/strings.xml
@@ -486,4 +486,5 @@
Áudios devem ser menores que 40MB.Sem rascunhos.
+ Mastodon possui um intervalo mínimo de 5 minutos para agendar.
diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml
index 067b92192..d04357f5a 100644
--- a/app/src/main/res/values-ru/strings.xml
+++ b/app/src/main/res/values-ru/strings.xml
@@ -546,4 +546,13 @@
Добавлено в закладкиВыбрать списокСписок
-
+ Аудиофайлы должны быть меньше 40МБ.
+ Показывать цветные градиенты для скрытых медиа
+
+ Ошибка поиска поста %s
+
+ У вас нет черновиков.
+ У вас нет запланированных постов.
+ Минимальный интервал планирования в Mastodon составляет 5 минут.
+
+
diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml
index 15c485a07..816c9cba1 100644
--- a/app/src/main/res/values-sv/strings.xml
+++ b/app/src/main/res/values-sv/strings.xml
@@ -20,7 +20,7 @@
Uppladdningen misslyckades.Kunde inte skicka toot.Hem
- Notifikationer
+ AviseringarLokaltFedereratDirekta meddelanden
@@ -158,15 +158,15 @@
Olistad: Visa inte i offentliga tidslinjerEnbart-följare: Ses enbart av följareDirekt: Skicka endast till nämnda användare
- Notifikationer
- Notifikationer
+ Aviseringar
+ AviseringarAlarmMeddela med ljudMeddela med vibrationNotifieringar med LEDMeddela mig näromnämnd
- följande
+ nya följaremina inlägg är knuffademina inlägg är favoriseradeUtseende
@@ -177,7 +177,7 @@
LjustSvartAutomatiskt vid solnedgång
- Använd systemdesign
+ Använd system-temaWebbläsareAnvänd Chrome-anpassade flikarDölj skriv-knappen vid skrollning
@@ -206,13 +206,13 @@
StorStörstaNya omnämnanden
- Notifieringar om nya omnämnanden
+ Aviseringar om nya omnämnandenNya följare
- Notifieringar om nya följare
+ Aviseringar på nya följareKnuffar
- Notifieringar när dina toots blir knuffade
+ Aviseringar när dina toots blir knuffadeFavoriter
- Notifieringar när dina toots blir markerade som favoriter
+ Aviseringar när dina toots blir markerade som favoriter%s omnämnde dig%1$s, %2$s, %3$s och %4$d andra%1$s, %2$s, och %3$s
@@ -239,7 +239,7 @@
Dela länk till tootBilderVideo
- Följarförfrågad
+ Följarförfråganom %dyom %dd
@@ -272,9 +272,9 @@
Kunde inte byta namn på listaKunde inte radera listaSkapa en lista
- Byt namn
- Ta bort
- Ändra
+ Byt namn på listan
+ Ta bort listan
+ Redigera listaSök efter personer du följerLägg till konto i listanTa bort kontot från listan
@@ -287,7 +287,7 @@
Kräver att du manuellt godkänner följareSpara utkast?Skickar toot…
- Fel vid sändning av toot
+ Kunde inte skicka tootSkickar tootSändning avbrutenEn kopia av tooten har sparats i dina utkast
@@ -298,14 +298,14 @@
SystemstandardDu behöver ladda ned dessa emojis förstUtför sökning…
- Expandera/Dölj alla status
+ Expandera/Dölj alla statusarÖppna tootOmstart av appen krävsDu måste starta om Yuito för att tillämpa ändringarnaSenareStarta omStandard-emojis för din enhet
- Emojis baserade på The Blob emojis kända från Android 4.4–7.1
+ Emojis baserade på The Blob emojis från Android 4.4–7.1Mastodon\'s standard emojisNedladdning misslyckadRobot
@@ -373,9 +373,9 @@
Visa robotindikator
- Är du säker på att du vill rensa dina notifieringar permanent\?
+ Är du säker på att du vill rensa dina aviseringar permanent\?
-Radera och skriv nytt
+Radera och skriv på nyttRadera och skriv ny toot\? %1$s • %2$s
@@ -384,15 +384,15 @@
%s röster%s kvar
- avslutas %s
+ avslutas vid %sstängdRösta
-omröstning är avslutad
+omröstningar har avslutatsOmröstningar
- Notifieringar när omröstningar har avslutats
+ Aviseringar när omröstningar har avslutatsEn omröstning där du har röstat är avslutad
@@ -424,9 +424,9 @@
Dolda domänerDolda domänerTysta %s
- %s inte tystnad längre
+ %s inte tystad längre
- Är du säker på att du vill blockera allt från %s\? Du kommer inte kunna se något innehåll från denna domän i publika tidslinje eller i dina notifieringar. Dina följare på domänen kommer inte att bli borttagna.
+ Är du säker på att du vill blockera allt från %s\? Du kommer inte kunna se något innehåll från denna domän i publika tidslinjer eller i dina notifieringar. Dina följare på domänen kommer inte att bli borttagna.Dölj hela domänenGoogle\'s nuvarande emojis
@@ -443,7 +443,7 @@
Visa notifikationsfilterHelt ord
- När nyckelordet eller frasen är alfanumerisk enbart, blir den enbart appliceras om den matchar hela ordet
+ När nyckelordet eller frasen enbart är alfanumerisk, appliceras den om den matchar hela ordetExpandera alltid toots med innehållsvarningarKontonSökning misslyckades
@@ -482,4 +482,5 @@
Ljudfiler måste vara mindre än 40MB.Du har inga utkast.
+ Mastodon har ett minimalt schemaläggningsintervall på 5 minuter.
diff --git a/app/src/main/res/values-zh-rHK/strings.xml b/app/src/main/res/values-zh-rHK/strings.xml
index ce8569d2e..f9b1c1e21 100644
--- a/app/src/main/res/values-zh-rHK/strings.xml
+++ b/app/src/main/res/values-zh-rHK/strings.xml
@@ -161,7 +161,7 @@
正在連線…
- 請輸入你帳號所在的 Mastodon 站點的域名或地址
+ "請輸入你帳號所在的 Mastodon 站點的域名或地址 "
diff --git a/app/src/main/res/values-zh-rMO/strings.xml b/app/src/main/res/values-zh-rMO/strings.xml
index ce8569d2e..f9b1c1e21 100644
--- a/app/src/main/res/values-zh-rMO/strings.xml
+++ b/app/src/main/res/values-zh-rMO/strings.xml
@@ -161,7 +161,7 @@
正在連線…
- 請輸入你帳號所在的 Mastodon 站點的域名或地址
+ "請輸入你帳號所在的 Mastodon 站點的域名或地址 "
diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml
index 05f0fd1c4..c5e348725 100644
--- a/app/src/main/res/values-zh-rTW/strings.xml
+++ b/app/src/main/res/values-zh-rTW/strings.xml
@@ -161,7 +161,7 @@
正在連線…
- 請輸入你帳號所在的 Mastodon 站點的域名或地址
+ "請輸入你帳號所在的 Mastodon 站點的域名或地址 "正在完成上傳…
diff --git a/app/src/main/res/values/actions.xml b/app/src/main/res/values/actions.xml
index a3a3168f7..0d78f2d17 100644
--- a/app/src/main/res/values/actions.xml
+++ b/app/src/main/res/values/actions.xml
@@ -22,4 +22,5 @@
+
\ No newline at end of file
diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml
index daa6252ad..bbffc0a91 100644
--- a/app/src/main/res/values/dimens.xml
+++ b/app/src/main/res/values/dimens.xml
@@ -7,7 +7,6 @@
8dp0dp120dp
- 8dp14dp16dp36dp
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 140c22fa2..7548f8b4c 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -65,6 +65,7 @@
%s boosted your toot%s favorited your toot%s followed you
+ %s requested to follow youReport @%sAdditional comments?
@@ -113,6 +114,8 @@
MuteUnmuteMute %s
+ Mute conversation
+ Unmute conversationMentionHide mediaOpen drawer
@@ -205,6 +208,8 @@
Delete and re-draft this toot?Are you sure you want to block all of %s? You will not see content from that domain in any public timelines or in your notifications. Your followers from that domain will be removed.Hide entire domain
+ Block @%s?
+ Mute @%s?Public: Post to public timelinesUnlisted: Do not show in public timelines
@@ -221,6 +226,7 @@
Notify me whenmentionedfollowed
+ follow requestedmy posts are boostedmy posts are favoritedpolls have ended
@@ -284,6 +290,8 @@
Notifications about new mentionsNew FollowersNotifications about new followers
+ Follow Requests
+ Notifications about follow requestsBoostsNotifications when your toots get boostedFavorites
@@ -516,6 +524,10 @@
%s vote%s votes
+
+ %s person
+ %s people
+ %s leftends at %sclosed
@@ -576,5 +588,7 @@
You don\'t have any drafts.You don\'t have any scheduled statuses.Mastodon has a minimum scheduling interval of 5 minutes.
+ Show link previews in timelines
+ Show confirmation dialog before boosting
diff --git a/app/src/main/res/xml/notification_preferences.xml b/app/src/main/res/xml/notification_preferences.xml
index 8bd044147..fa03f8d1b 100644
--- a/app/src/main/res/xml/notification_preferences.xml
+++ b/app/src/main/res/xml/notification_preferences.xml
@@ -27,6 +27,12 @@
android:title="@string/pref_title_notification_filter_follows"
app:iconSpaceReserved="false" />
+
+
+
+
+
+
diff --git a/app/src/test/java/com/keylesspalace/tusky/BottomSheetActivityTest.kt b/app/src/test/java/com/keylesspalace/tusky/BottomSheetActivityTest.kt
index 5c92667ec..86d0925f3 100644
--- a/app/src/test/java/com/keylesspalace/tusky/BottomSheetActivityTest.kt
+++ b/app/src/test/java/com/keylesspalace/tusky/BottomSheetActivityTest.kt
@@ -88,6 +88,7 @@ class BottomSheetActivityTest {
arrayOf(),
null,
pinned = false,
+ muted = false,
poll = null,
card = null
)
diff --git a/app/src/test/java/com/keylesspalace/tusky/ComposeActivityTest.kt b/app/src/test/java/com/keylesspalace/tusky/ComposeActivityTest.kt
index ac2e955a5..9fa693215 100644
--- a/app/src/test/java/com/keylesspalace/tusky/ComposeActivityTest.kt
+++ b/app/src/test/java/com/keylesspalace/tusky/ComposeActivityTest.kt
@@ -68,6 +68,7 @@ class ComposeActivityTest {
notificationsEnabled = true,
notificationsMentioned = true,
notificationsFollowed = true,
+ notificationsFollowRequested = false,
notificationsReblogged = true,
notificationsFavorited = true,
notificationSound = true,
diff --git a/app/src/test/java/com/keylesspalace/tusky/FilterTest.kt b/app/src/test/java/com/keylesspalace/tusky/FilterTest.kt
index 965eda674..12f7bab54 100644
--- a/app/src/test/java/com/keylesspalace/tusky/FilterTest.kt
+++ b/app/src/test/java/com/keylesspalace/tusky/FilterTest.kt
@@ -11,6 +11,7 @@ import com.keylesspalace.tusky.fragment.SFragment
import com.keylesspalace.tusky.network.MastodonApi
import com.nhaarman.mockitokotlin2.mock
import okhttp3.Request
+import okio.Timeout
import org.junit.Assert.assertFalse
import org.junit.Assert.assertTrue
import org.junit.Before
@@ -99,6 +100,10 @@ class FilterTest {
)
)
}
+
+ override fun timeout(): Timeout {
+ throw Error("not implemented")
+ }
})
activity.mastodonApi = apiMock
@@ -214,6 +219,7 @@ class FilterTest {
mentions = emptyArray(),
application = null,
pinned = false,
+ muted = false,
poll = if (pollOptions != null) {
Poll(
id = "1234",
@@ -221,6 +227,7 @@ class FilterTest {
expired = false,
multiple = false,
votesCount = 0,
+ votersCount = 0,
options = pollOptions.map {
PollOption(it, 0)
},
diff --git a/app/src/test/java/com/keylesspalace/tusky/TuskyApplication.kt b/app/src/test/java/com/keylesspalace/tusky/TuskyApplication.kt
index aaa2b349e..7f82e2495 100644
--- a/app/src/test/java/com/keylesspalace/tusky/TuskyApplication.kt
+++ b/app/src/test/java/com/keylesspalace/tusky/TuskyApplication.kt
@@ -18,13 +18,9 @@ package com.keylesspalace.tusky
import android.app.Application
import android.content.Context
import android.content.res.Configuration
-import android.util.Log
import androidx.emoji.text.EmojiCompat
import com.keylesspalace.tusky.util.LocaleManager
-import dagger.android.DispatchingAndroidInjector
-import dagger.android.HasAndroidInjector
import de.c1710.filemojicompat.FileEmojiCompatConfig
-import javax.inject.Inject
// override TuskyApplication for Robolectric tests, only initialize the necessary stuff
class TuskyApplication : Application() {
diff --git a/app/src/test/java/com/keylesspalace/tusky/fragment/TimelineRepositoryTest.kt b/app/src/test/java/com/keylesspalace/tusky/fragment/TimelineRepositoryTest.kt
index ab929c61b..1200c1eb2 100644
--- a/app/src/test/java/com/keylesspalace/tusky/fragment/TimelineRepositoryTest.kt
+++ b/app/src/test/java/com/keylesspalace/tusky/fragment/TimelineRepositoryTest.kt
@@ -1,6 +1,8 @@
package com.keylesspalace.tusky.fragment
-import android.text.Spanned
+import android.text.SpannableString
+import android.text.SpannedString
+import androidx.test.ext.junit.runners.AndroidJUnit4
import com.google.gson.Gson
import com.keylesspalace.tusky.SpanUtilsTest
import com.keylesspalace.tusky.db.AccountEntity
@@ -12,7 +14,6 @@ import com.keylesspalace.tusky.entity.Status
import com.keylesspalace.tusky.network.MastodonApi
import com.keylesspalace.tusky.repository.*
import com.keylesspalace.tusky.util.Either
-import com.keylesspalace.tusky.util.HtmlConverter
import com.nhaarman.mockitokotlin2.isNull
import com.nhaarman.mockitokotlin2.verify
import com.nhaarman.mockitokotlin2.verifyNoMoreInteractions
@@ -24,14 +25,18 @@ import io.reactivex.schedulers.TestScheduler
import org.junit.Assert.assertEquals
import org.junit.Before
import org.junit.Test
+import org.junit.runner.RunWith
import org.mockito.ArgumentMatchers.any
import org.mockito.ArgumentMatchers.anyInt
import org.mockito.Mock
import org.mockito.MockitoAnnotations
+import org.robolectric.annotation.Config
import java.util.*
import java.util.concurrent.TimeUnit
import kotlin.collections.ArrayList
+@Config(sdk = [28])
+@RunWith(AndroidJUnit4::class)
class TimelineRepositoryTest {
@Mock
lateinit var timelineDao: TimelineDao
@@ -56,15 +61,6 @@ class TimelineRepositoryTest {
domain = "domain.com",
isActive = true
)
- private val htmlConverter = object : HtmlConverter {
- override fun fromHtml(html: String): Spanned {
- return SpanUtilsTest.FakeSpannable(html)
- }
-
- override fun toHtml(text: Spanned): String {
- return text.toString()
- }
- }
@Before
fun setup() {
@@ -74,8 +70,7 @@ class TimelineRepositoryTest {
gson = Gson()
testScheduler = TestScheduler()
RxJavaPlugins.setIoSchedulerHandler { testScheduler }
- subject = TimelineRepositoryImpl(timelineDao, mastodonApi, accountManager, gson,
- htmlConverter)
+ subject = TimelineRepositoryImpl(timelineDao, mastodonApi, accountManager, gson)
}
@Test
@@ -97,7 +92,7 @@ class TimelineRepositoryTest {
verify(timelineDao).insertStatusIfNotThere(Placeholder("1").toEntity(account.id))
for (status in statuses) {
verify(timelineDao).insertInTransaction(
- status.toEntity(account.id, htmlConverter, gson),
+ status.toEntity(account.id, gson),
status.account.toEntity(account.id, gson),
null
)
@@ -129,7 +124,7 @@ class TimelineRepositoryTest {
// We assume for now that overlapped one is inserted but it's not that important
for (status in response) {
verify(timelineDao).insertInTransaction(
- status.toEntity(account.id, htmlConverter, gson),
+ status.toEntity(account.id, gson),
status.account.toEntity(account.id, gson),
null
)
@@ -159,7 +154,7 @@ class TimelineRepositoryTest {
verify(timelineDao).deleteRange(account.id, response.last().id, response.first().id)
for (status in response) {
verify(timelineDao).insertInTransaction(
- status.toEntity(account.id, htmlConverter, gson),
+ status.toEntity(account.id, gson),
status.account.toEntity(account.id, gson),
null
)
@@ -201,7 +196,7 @@ class TimelineRepositoryTest {
// We assume for now that overlapped one is inserted but it's not that important
for (status in response) {
verify(timelineDao).insertInTransaction(
- status.toEntity(account.id, htmlConverter, gson),
+ status.toEntity(account.id, gson),
status.account.toEntity(account.id, gson),
null
)
@@ -246,7 +241,7 @@ class TimelineRepositoryTest {
for (status in response) {
verify(timelineDao).insertInTransaction(
- status.toEntity(account.id, htmlConverter, gson),
+ status.toEntity(account.id, gson),
status.account.toEntity(account.id, gson),
null
)
@@ -263,7 +258,7 @@ class TimelineRepositoryTest {
val status = makeStatus("2")
val dbStatus = makeStatus("1")
val dbResult = TimelineStatusWithAccount()
- dbResult.status = dbStatus.toEntity(account.id, htmlConverter, gson)
+ dbResult.status = dbStatus.toEntity(account.id, gson)
dbResult.account = status.account.toEntity(account.id, gson)
whenever(mastodonApi.homeTimelineSingle(any(), any(), any()))
@@ -297,7 +292,7 @@ class TimelineRepositoryTest {
return Status(
id = id,
account = account,
- content = SpanUtilsTest.FakeSpannable("hello$id"),
+ content = SpannableString("hello$id"),
createdAt = Date(),
emojis = listOf(),
reblogsCount = 3,
@@ -314,6 +309,7 @@ class TimelineRepositoryTest {
inReplyToAccountId = null,
inReplyToId = null,
pinned = false,
+ muted = false,
reblog = null,
url = "http://example.com/statuses/$id",
poll = null,
@@ -328,7 +324,7 @@ class TimelineRepositoryTest {
localUsername = "test$id",
username = "test$id@example.com",
displayName = "Example Account $id",
- note = SpanUtilsTest.FakeSpannable("Note! $id"),
+ note = SpannableString("Note! $id"),
url = "https://example.com/@test$id",
avatar = "avatar$id",
header = "Header$id",
diff --git a/build.gradle b/build.gradle
index 17952bd8d..cb3ee21f3 100644
--- a/build.gradle
+++ b/build.gradle
@@ -1,11 +1,11 @@
buildscript {
- ext.kotlin_version = '1.3.61'
+ ext.kotlin_version = '1.3.71'
repositories {
google()
jcenter()
}
dependencies {
- classpath 'com.android.tools.build:gradle:3.5.3'
+ classpath 'com.android.tools.build:gradle:3.6.2'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
}
}
diff --git a/fastlane/metadata/android/ca/short_description.txt b/fastlane/metadata/android/ca/short_description.txt
index c24acd732..151f74e27 100644
--- a/fastlane/metadata/android/ca/short_description.txt
+++ b/fastlane/metadata/android/ca/short_description.txt
@@ -1 +1 @@
-Un client per a diversos comptes per a la xarxa social Mastodont
+Un client multicomptes per a la xarxa social Mastodont
diff --git a/fastlane/metadata/android/de/changelogs/68.txt b/fastlane/metadata/android/de/changelogs/68.txt
new file mode 100644
index 000000000..dee85857a
--- /dev/null
+++ b/fastlane/metadata/android/de/changelogs/68.txt
@@ -0,0 +1,3 @@
+Tusky v9.1
+
+Dieses Release stellt die Kompatibilität mit Mastodon 3 sicher und verbessert Geschwindigkeit und Stabilität der App.
diff --git a/fastlane/metadata/android/de/changelogs/70.txt b/fastlane/metadata/android/de/changelogs/70.txt
index d674795ad..749d0a9e8 100644
--- a/fastlane/metadata/android/de/changelogs/70.txt
+++ b/fastlane/metadata/android/de/changelogs/70.txt
@@ -5,4 +5,4 @@ Tusky v10.0
- Du kannst jetzt Listen auf dem Hauptbildschirm anzeigen.
- Du kannst jetzt Audio-Anhänge versenden.
-Und viele andere Verbesserungen und Fehlerkorrekturen!
\ No newline at end of file
+Und viele andere Verbesserungen und Fehlerkorrekturen!
diff --git a/fastlane/metadata/android/fa/changelogs/70.txt b/fastlane/metadata/android/fa/changelogs/70.txt
new file mode 100644
index 000000000..f124dd4f7
--- /dev/null
+++ b/fastlane/metadata/android/fa/changelogs/70.txt
@@ -0,0 +1,8 @@
+تاسکی نگارش ۱۰.۰
+
+- اکنون میتوانید بوقها را نشان کرده و نشانکهایتان را فهرست کنید.
+- اکنون میتوانید بوقها را زمانبندی کنید. توجّه داشته باشید که زمان گزیدهتان باید لااقل ۵ دقیقه بعد باشد.
+- اکنون میتوانید فهرستها را به صفحهٔ اصلی بیفزایید.
+- اکنون میتوانید پیوستهای صوتی بفرستید.
+
+و بسیاری از بهبودها و رفع اشکالهای ریز!
diff --git a/fastlane/metadata/android/is/changelogs/70.txt b/fastlane/metadata/android/is/changelogs/70.txt
new file mode 100644
index 000000000..1525eefdd
--- /dev/null
+++ b/fastlane/metadata/android/is/changelogs/70.txt
@@ -0,0 +1,8 @@
+Tusky v10.0
+
+- Þú getur núna bákamerkt stöðufærslur og gert lista með bókamerkjunum þínum í Tusky.
+- Þú getur núna sett tíst á áætlun í Tusky. Athugaðu að tíminn sem þú velur þarf að vera í það minnsta efti 5 mínútur.
+- Þú getur núna bætt listum á aðalskjáinn.
+- Þú getur núna sent in hljóðskrár sem viðhengi í Tusky.
+
+Auk hellings af smærri lagfæringum og bætingum!
diff --git a/fastlane/metadata/android/ja/changelogs/70.txt b/fastlane/metadata/android/ja/changelogs/70.txt
new file mode 100644
index 000000000..f7e42126f
--- /dev/null
+++ b/fastlane/metadata/android/ja/changelogs/70.txt
@@ -0,0 +1,8 @@
+Tusky v10.0
+
+- Tuskyでブックマークの登録、表示が行えるようになりました。
+- You can now schedule toots with Tusky. Note that the time you select has to be at least 5 minutes in the future.
+- You can now add lists to the main screen.
+- Tuskyで音声ファイルを投稿出来るようになりました。
+
+その他、多くの細かな改善とバグの修正を行いました!
diff --git a/fastlane/metadata/android/ja/full_description.txt b/fastlane/metadata/android/ja/full_description.txt
new file mode 100644
index 000000000..353726c18
--- /dev/null
+++ b/fastlane/metadata/android/ja/full_description.txt
@@ -0,0 +1,12 @@
+Tuskyは、自由でオープンソースのソーシャルネットワークサーバーであるMastodon用の動作の高速なクライアントです。
+
+• マテリアルデザイン
+• ほとんどのMastodon APIに対応
+• マルチアカウント対応
+• 時刻に基づいて自動変更可能なダークテーマとライトテーマ
+• 下書き - トゥートを作成し、保存しておく
+• 異なる絵文字形式を選択可能
+• すべての画面サイズに最適化
+• 完全にオープンソース - Googleサービスのような自由でない依存関係はありません
+
+Mastodonの詳細についてはこちらをご覧ください:https://joinmastodon.org/
diff --git a/fastlane/metadata/android/kab/short_description.txt b/fastlane/metadata/android/kab/short_description.txt
new file mode 100644
index 000000000..b770c5940
--- /dev/null
+++ b/fastlane/metadata/android/kab/short_description.txt
@@ -0,0 +1 @@
+Asnas isefraken aget-imiḍanen n uẓeṭṭa n tmetti Mastodon
diff --git a/fastlane/metadata/android/kab/title.txt b/fastlane/metadata/android/kab/title.txt
new file mode 100644
index 000000000..0238ffc0a
--- /dev/null
+++ b/fastlane/metadata/android/kab/title.txt
@@ -0,0 +1 @@
+Tusky
diff --git a/fastlane/metadata/android/pl/changelogs/70.txt b/fastlane/metadata/android/pl/changelogs/70.txt
new file mode 100644
index 000000000..a1723c287
--- /dev/null
+++ b/fastlane/metadata/android/pl/changelogs/70.txt
@@ -0,0 +1,8 @@
+Tusky v10.0
+
+- Dodano wsparcie dla zakładek. Możesz teraz dodawać wpisy do zakładek i przeglądać zakładki w Tusky.
+- Możesz teraz zaplanować wpisy w Tusky. (Uwaga: wybrany czas do wysłania zaplanowanego wpisu musi wynosić przynajmniej 5 minut)
+- Możesz teraz dodawać listy do ekranu głównego.
+- Możesz teraz załączać pliki audio do wpisów.
+
+Plus wiele innych małych ulepszeń i poprawek!
diff --git a/fastlane/metadata/android/ru/changelogs/70.txt b/fastlane/metadata/android/ru/changelogs/70.txt
new file mode 100644
index 000000000..7b67dc66a
--- /dev/null
+++ b/fastlane/metadata/android/ru/changelogs/70.txt
@@ -0,0 +1,8 @@
+Tusky v10.0
+
+- Теперь вы можете добавлять статусы в закладки и просматривать списки закладок в Tusky.
+- Теперь вы можете отправлять отложенные посты из Tusky. Учтите, что время отправки должно быть не менее, чем на пять минут позже текущего.
+- Теперь вы можете добавлять списки на главный экран.
+- Теперь вы можете публиковать аудио-вложения из Tusky.
+
+И множество других мелких улучшений и исправлений!
diff --git a/fastlane/metadata/android/sv/changelogs/70.txt b/fastlane/metadata/android/sv/changelogs/70.txt
new file mode 100644
index 000000000..eb2428746
--- /dev/null
+++ b/fastlane/metadata/android/sv/changelogs/70.txt
@@ -0,0 +1,8 @@
+Tusky v10.0
+
+- You can now bookmark statuses & list your bookmarks in Tusky.
+- You can now schedule toots with Tusky. Note that the time you select has to be at least 5 minutes in the future.
+- You can now add lists to the main screen.
+- You can now post audio attachments with Tusky.
+
+And a lot of other small improvements and bug fixes!
diff --git a/gradle.properties b/gradle.properties
index 19fcf92b1..ff715c0e9 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -15,7 +15,6 @@ org.gradle.jvmargs=-Xmx4096m
# use parallel execution
org.gradle.parallel=true
-android.enableUnitTestBinaryResources=true
android.enableR8.fullMode=true
android.enableJetifier=true
android.useAndroidX=true
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
index 4e1cc9db6..6623300be 100644
--- a/gradle/wrapper/gradle-wrapper.properties
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -1,5 +1,5 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-6.1.1-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-6.3-all.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
diff --git a/gradlew.bat b/gradlew.bat
index 24467a141..9109989e3 100644
--- a/gradlew.bat
+++ b/gradlew.bat
@@ -29,6 +29,9 @@ if "%DIRNAME%" == "" set DIRNAME=.
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%
+@rem Resolve any "." and ".." in APP_HOME to make it shorter.
+for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
+
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"