diff --git a/app/build.gradle b/app/build.gradle index 7af3d95d..7e44e9c5 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -20,8 +20,8 @@ android { applicationId APP_ID minSdkVersion 21 targetSdkVersion 29 - versionCode 68 - versionName "9.1" + versionCode 69 + versionName "10.0 beta 1" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" vectorDrawables.useSupportLibrary = true @@ -66,6 +66,9 @@ android { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } + androidExtensions { + experimental = true + } testOptions { unitTests { returnDefaultValues = true @@ -98,7 +101,7 @@ project.tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).all { ext.lifecycleVersion = "2.1.0" ext.roomVersion = '2.2.3' ext.retrofitVersion = '2.6.0' -ext.okhttpVersion = '4.2.2' +ext.okhttpVersion = '4.3.1' ext.glideVersion = '4.10.0' ext.daggerVersion = '2.25.3' diff --git a/app/src/main/java/com/keylesspalace/tusky/AccountActivity.kt b/app/src/main/java/com/keylesspalace/tusky/AccountActivity.kt index ab16de29..baf1d63e 100644 --- a/app/src/main/java/com/keylesspalace/tusky/AccountActivity.kt +++ b/app/src/main/java/com/keylesspalace/tusky/AccountActivity.kt @@ -464,7 +464,7 @@ class AccountActivity : BottomSheetActivity(), ActionButtonActivity, HasAndroidI loadAvatar(movedAccount.avatar, accountMovedAvatar, avatarRadius, animateAvatar) - accountMovedText.text = getString(R.string.account_moved_description, movedAccount.displayName) + accountMovedText.text = getString(R.string.account_moved_description, movedAccount.name) // this is necessary because API 19 can't handle vector compound drawables val movedIcon = ContextCompat.getDrawable(this, R.drawable.ic_briefcase)?.mutate() diff --git a/app/src/main/java/com/keylesspalace/tusky/EmojiPreference.java b/app/src/main/java/com/keylesspalace/tusky/EmojiPreference.java index a884736c..cdf09002 100644 --- a/app/src/main/java/com/keylesspalace/tusky/EmojiPreference.java +++ b/app/src/main/java/com/keylesspalace/tusky/EmojiPreference.java @@ -1,14 +1,10 @@ package com.keylesspalace.tusky; import android.app.AlarmManager; -import androidx.appcompat.app.AlertDialog; import android.app.PendingIntent; import android.content.Context; import android.content.Intent; import android.os.Build; - -import androidx.preference.Preference; -import androidx.preference.PreferenceManager; import android.util.AttributeSet; import android.util.Log; import android.view.LayoutInflater; @@ -20,6 +16,10 @@ import android.widget.RadioButton; import android.widget.TextView; import android.widget.Toast; +import androidx.appcompat.app.AlertDialog; +import androidx.preference.Preference; +import androidx.preference.PreferenceManager; + import com.keylesspalace.tusky.util.EmojiCompatFont; import java.util.ArrayList; @@ -44,7 +44,6 @@ public class EmojiPreference extends Preference { private boolean updated, currentNeedsUpdate; - public EmojiPreference(Context context, AttributeSet attrs) { super(context, attrs); @@ -63,7 +62,7 @@ public class EmojiPreference extends Preference { View view = LayoutInflater.from(getContext()).inflate(R.layout.dialog_emojicompat, null); - for(int i = 0; i < viewIds.length; i++) { + for (int i = 0; i < viewIds.length; i++) { setupItem(view.findViewById(viewIds[i]), FONTS[i]); } @@ -96,13 +95,13 @@ public class EmojiPreference extends Preference { // Set actions download.setOnClickListener((downloadButton) -> - startDownload(font, container)); + startDownload(font, container)); cancel.setOnClickListener((cancelButton) -> - cancelDownload(font, container)); + cancelDownload(font, container)); radio.setOnClickListener((radioButton) -> - select(font, (RadioButton) radioButton)); + select(font, (RadioButton) radioButton)); container.setOnClickListener((containterView) -> select(font, @@ -111,11 +110,11 @@ public class EmojiPreference extends Preference { } private void startDownload(EmojiCompatFont font, View container) { - ImageButton download = container.findViewById(R.id.emojicompat_download); - TextView caption = container.findViewById(R.id.emojicompat_caption); + ImageButton download = container.findViewById(R.id.emojicompat_download); + TextView caption = container.findViewById(R.id.emojicompat_caption); ProgressBar progressBar = container.findViewById(R.id.emojicompat_progress); - ImageButton cancel = container.findViewById(R.id.emojicompat_download_cancel); + ImageButton cancel = container.findViewById(R.id.emojicompat_download_cancel); // Switch to downloading style download.setVisibility(View.GONE); @@ -136,8 +135,7 @@ public class EmojiPreference extends Preference { progress *= progressBar.getMax(); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { progressBar.setProgress((int) progress, true); - } - else { + } else { progressBar.setProgress((int) progress); } } @@ -167,14 +165,15 @@ public class EmojiPreference extends Preference { /** * Select a font both visually and logically - * @param font The font to be selected + * + * @param font The font to be selected * @param radio The radio button associated with it's visual item */ private void select(EmojiCompatFont font, RadioButton radio) { selected = font; // Uncheck all the other buttons - for(RadioButton other : radioButtons) { - if(other != radio) { + for (RadioButton other : radioButtons) { + if (other != radio) { other.setChecked(false); } } @@ -183,31 +182,31 @@ public class EmojiPreference extends Preference { /** * Called when a "consistent" state is reached, i.e. it's not downloading the font - * @param font The font to be displayed + * + * @param font The font to be displayed * @param container The ConstraintLayout containing the item */ private void updateItem(EmojiCompatFont font, View container) { // Assignments - ImageButton download = container.findViewById(R.id.emojicompat_download); - TextView caption = container.findViewById(R.id.emojicompat_caption); + ImageButton download = container.findViewById(R.id.emojicompat_download); + TextView caption = container.findViewById(R.id.emojicompat_caption); ProgressBar progress = container.findViewById(R.id.emojicompat_progress); - ImageButton cancel = container.findViewById(R.id.emojicompat_download_cancel); + ImageButton cancel = container.findViewById(R.id.emojicompat_download_cancel); - RadioButton radio = container.findViewById(R.id.emojicompat_radio); + RadioButton radio = container.findViewById(R.id.emojicompat_radio); // There's no download going on progress.setVisibility(View.GONE); cancel.setVisibility(View.GONE); caption.setVisibility(View.VISIBLE); - if(font.isDownloaded(getContext())) { + if (font.isDownloaded(getContext())) { // Make it selectable download.setVisibility(View.GONE); radio.setVisibility(View.VISIBLE); container.setClickable(true); - } - else { + } else { // Make it downloadable download.setVisibility(View.VISIBLE); radio.setVisibility(View.GONE); @@ -215,14 +214,13 @@ public class EmojiPreference extends Preference { } // Select it if necessary - if(font == selected) { + if (font == selected) { radio.setChecked(true); // Update available if (!font.isDownloaded(getContext())) { currentNeedsUpdate = true; } - } - else { + } else { radio.setChecked(false); } } @@ -248,33 +246,33 @@ public class EmojiPreference extends Preference { * That means, the selected font can be saved (if the user hit OK) */ private void onDialogOk() { - saveSelectedFont(); + saveSelectedFont(); if (selected != original || updated) { - new AlertDialog.Builder(getContext()) - .setTitle(R.string.restart_required) - .setMessage(R.string.restart_emoji) - .setNegativeButton(R.string.later, null) - .setPositiveButton(R.string.restart, ((dialog, which) -> { - // Restart the app - // From https://stackoverflow.com/a/17166729/5070653 - Intent launchIntent = new Intent(getContext(), SplashActivity.class); - PendingIntent mPendingIntent = PendingIntent.getActivity( - getContext(), - // This is the codepoint of the party face emoji :D - 0x1f973, - launchIntent, - PendingIntent.FLAG_CANCEL_CURRENT); - AlarmManager mgr = - (AlarmManager) getContext().getSystemService(Context.ALARM_SERVICE); - if (mgr != null) { - mgr.set( - AlarmManager.RTC, - System.currentTimeMillis() + 100, - mPendingIntent); - } - System.exit(0); - })).show(); - } + new AlertDialog.Builder(getContext()) + .setTitle(R.string.restart_required) + .setMessage(R.string.restart_emoji) + .setNegativeButton(R.string.later, null) + .setPositiveButton(R.string.restart, ((dialog, which) -> { + // Restart the app + // From https://stackoverflow.com/a/17166729/5070653 + Intent launchIntent = new Intent(getContext(), SplashActivity.class); + PendingIntent mPendingIntent = PendingIntent.getActivity( + getContext(), + // This is the codepoint of the party face emoji :D + 0x1f973, + launchIntent, + PendingIntent.FLAG_CANCEL_CURRENT); + AlarmManager mgr = + (AlarmManager) getContext().getSystemService(Context.ALARM_SERVICE); + if (mgr != null) { + mgr.set( + AlarmManager.RTC, + System.currentTimeMillis() + 100, + mPendingIntent); + } + System.exit(0); + })).show(); + } } diff --git a/app/src/main/java/com/keylesspalace/tusky/adapter/StatusBaseViewHolder.java b/app/src/main/java/com/keylesspalace/tusky/adapter/StatusBaseViewHolder.java index 6f809637..2450a80a 100644 --- a/app/src/main/java/com/keylesspalace/tusky/adapter/StatusBaseViewHolder.java +++ b/app/src/main/java/com/keylesspalace/tusky/adapter/StatusBaseViewHolder.java @@ -73,6 +73,7 @@ public abstract class StatusBaseViewHolder extends RecyclerView.ViewHolder { private TextView sensitiveMediaWarning; private View sensitiveMediaShow; protected TextView[] mediaLabels; + protected CharSequence[] mediaDescriptions; private MaterialButton contentWarningButton; private ImageView avatarInset; @@ -133,6 +134,7 @@ public abstract class StatusBaseViewHolder extends RecyclerView.ViewHolder { itemView.findViewById(R.id.status_media_label_2), itemView.findViewById(R.id.status_media_label_3) }; + mediaDescriptions = new CharSequence[mediaLabels.length]; contentWarningDescription = itemView.findViewById(R.id.status_content_warning_description); contentWarningButton = itemView.findViewById(R.id.status_content_warning_button); avatarInset = itemView.findViewById(R.id.status_avatar_inset); @@ -181,11 +183,8 @@ public abstract class StatusBaseViewHolder extends RecyclerView.ViewHolder { @Nullable PollViewData poll, @NonNull StatusDisplayOptions statusDisplayOptions, final StatusActionListener listener) { - if (TextUtils.isEmpty(spoilerText)) { - contentWarningDescription.setVisibility(View.GONE); - contentWarningButton.setVisibility(View.GONE); - this.setTextVisible(true, content, mentions, emojis, poll, statusDisplayOptions, listener); - } else { + boolean sensitive = !TextUtils.isEmpty(spoilerText); + if (sensitive) { CharSequence emojiSpoiler = CustomEmojiHelper.emojifyString(spoilerText, emojis, contentWarningDescription); contentWarningDescription.setText(emojiSpoiler); contentWarningDescription.setVisibility(View.VISIBLE); @@ -198,9 +197,13 @@ public abstract class StatusBaseViewHolder extends RecyclerView.ViewHolder { } setContentWarningButtonText(!expanded); - this.setTextVisible(!expanded, content, mentions, emojis, poll, statusDisplayOptions, listener); + this.setTextVisible(sensitive, !expanded, content, mentions, emojis, poll, statusDisplayOptions, listener); }); - this.setTextVisible(expanded, content, mentions, emojis, poll, statusDisplayOptions, listener); + this.setTextVisible(sensitive, expanded, content, mentions, emojis, poll, statusDisplayOptions, listener); + } else { + contentWarningDescription.setVisibility(View.GONE); + contentWarningButton.setVisibility(View.GONE); + this.setTextVisible(sensitive, true, content, mentions, emojis, poll, statusDisplayOptions, listener); } } @@ -212,7 +215,8 @@ public abstract class StatusBaseViewHolder extends RecyclerView.ViewHolder { } } - private void setTextVisible(boolean expanded, + private void setTextVisible(boolean sensitive, + boolean expanded, Spanned content, Status.Mention[] mentions, List emojis, @@ -222,6 +226,9 @@ public abstract class StatusBaseViewHolder extends RecyclerView.ViewHolder { if (expanded) { Spanned emojifiedText = CustomEmojiHelper.emojifyText(content, emojis, this.content); LinkHelper.setClickableText(this.content, emojifiedText, mentions, listener); + for (int i = 0; i < mediaLabels.length; ++i) { + updateMediaLabel(i, sensitive, expanded); + } if (poll != null) { setupPoll(poll, emojis, statusDisplayOptions, listener); } else { @@ -519,6 +526,14 @@ public abstract class StatusBaseViewHolder extends RecyclerView.ViewHolder { } } + private void updateMediaLabel(int index, boolean sensitive, boolean showingContent) { + Context context = itemView.getContext(); + CharSequence label = (sensitive && !showingContent) ? + context.getString(R.string.status_sensitive_media_title) : + mediaDescriptions[index]; + mediaLabels[index].setText(label); + } + protected void setMediaLabel(List attachments, boolean sensitive, final StatusActionListener listener, boolean showingContent) { Context context = itemView.getContext(); @@ -527,12 +542,8 @@ public abstract class StatusBaseViewHolder extends RecyclerView.ViewHolder { if (i < attachments.size()) { Attachment attachment = attachments.get(i); mediaLabel.setVisibility(View.VISIBLE); - - if (sensitive && !showingContent) { - mediaLabel.setText(R.string.status_sensitive_media_title); - } else { - mediaLabel.setText(getAttachmentDescription(context, attachment)); - } + mediaDescriptions[i] = getAttachmentDescription(context, attachment); + updateMediaLabel(i, sensitive, showingContent); // Set the icon next to the label. int drawableId = getLabelIcon(attachments.get(0).getType()); diff --git a/app/src/main/java/com/keylesspalace/tusky/components/compose/ComposeViewModel.kt b/app/src/main/java/com/keylesspalace/tusky/components/compose/ComposeViewModel.kt index fb692232..63d04ef1 100644 --- a/app/src/main/java/com/keylesspalace/tusky/components/compose/ComposeViewModel.kt +++ b/app/src/main/java/com/keylesspalace/tusky/components/compose/ComposeViewModel.kt @@ -61,8 +61,8 @@ class ComposeViewModel private var startingContentWarning: String = "" private var inReplyToId: String? = null private var startingVisibility: Status.Visibility = Status.Visibility.UNKNOWN - private val instance: MutableLiveData = MutableLiveData() - private val nodeinfo: MutableLiveData = MutableLiveData() + private val instance: MutableLiveData = MutableLiveData(null) + private val nodeinfo: MutableLiveData = MutableLiveData(null) public var markdownMode: Boolean = false public var hasNoAttachmentLimits = false diff --git a/app/src/main/java/com/keylesspalace/tusky/components/compose/dialog/CaptionDialog.kt b/app/src/main/java/com/keylesspalace/tusky/components/compose/dialog/CaptionDialog.kt index d594601c..f10fb444 100644 --- a/app/src/main/java/com/keylesspalace/tusky/components/compose/dialog/CaptionDialog.kt +++ b/app/src/main/java/com/keylesspalace/tusky/components/compose/dialog/CaptionDialog.kt @@ -50,7 +50,10 @@ fun T.makeCaptionDialog(existingDescription: String?, dialogLayout.setPadding(padding, padding, padding, padding) dialogLayout.orientation = LinearLayout.VERTICAL - val imageView = PhotoView(this) + val imageView = PhotoView(this).apply { + // If it seems a lot, try opening an image of A4 format or similar + maximumScale = 6.0f + } val displayMetrics = DisplayMetrics() windowManager.defaultDisplay.getMetrics(displayMetrics) diff --git a/app/src/main/java/com/keylesspalace/tusky/components/conversation/ConversationEntity.kt b/app/src/main/java/com/keylesspalace/tusky/components/conversation/ConversationEntity.kt index a59df12b..7c4ed108 100644 --- a/app/src/main/java/com/keylesspalace/tusky/components/conversation/ConversationEntity.kt +++ b/app/src/main/java/com/keylesspalace/tusky/components/conversation/ConversationEntity.kt @@ -166,7 +166,7 @@ fun Account.toEntity() = ConversationAccountEntity( id, username, - displayName, + displayName.orEmpty(), avatar, emojis ?: emptyList() ) diff --git a/app/src/main/java/com/keylesspalace/tusky/components/conversation/ConversationsViewModel.kt b/app/src/main/java/com/keylesspalace/tusky/components/conversation/ConversationsViewModel.kt index 0205ddec..c6fa84b4 100644 --- a/app/src/main/java/com/keylesspalace/tusky/components/conversation/ConversationsViewModel.kt +++ b/app/src/main/java/com/keylesspalace/tusky/components/conversation/ConversationsViewModel.kt @@ -74,6 +74,7 @@ class ConversationsViewModel @Inject constructor( } .subscribeOn(Schedulers.io()) .doOnError { t -> Log.w("ConversationViewModel", "Failed to bookmark conversation", t) } + .onErrorReturnItem(0) .subscribe() .autoDispose() } @@ -127,7 +128,7 @@ class ConversationsViewModel @Inject constructor( } fun remove(position: Int) { - conversations.value?.getOrNull(position)?.let { conversation -> + conversations.value?.getOrNull(position)?.let { refresh() } } diff --git a/app/src/main/java/com/keylesspalace/tusky/components/search/adapter/SearchDataSource.kt b/app/src/main/java/com/keylesspalace/tusky/components/search/adapter/SearchDataSource.kt index f02038db..2b706288 100644 --- a/app/src/main/java/com/keylesspalace/tusky/components/search/adapter/SearchDataSource.kt +++ b/app/src/main/java/com/keylesspalace/tusky/components/search/adapter/SearchDataSource.kt @@ -62,7 +62,7 @@ class SearchDataSource( resolve = true, limit = params.requestedLoadSize, offset = 0, - following =false) + following = false) .subscribe( { data -> val res = parser(data) @@ -84,24 +84,30 @@ class SearchDataSource( override fun loadRange(params: LoadRangeParams, callback: LoadRangeCallback) { networkState.postValue(NetworkState.LOADING) retry = null - if(source.exhausted) { + if (source.exhausted) { return callback.onResult(emptyList()) } - mastodonApi.searchObservable(searchType.apiParameter, searchRequest, true, params.loadSize, params.startPosition, false) + mastodonApi.searchObservable( + query = searchRequest, + type = searchType.apiParameter, + resolve = true, + limit = params.loadSize, + offset = params.startPosition, + following = false) .subscribe( { data -> // Working around Mastodon bug where exact match is returned no matter - // which offset is requested (so if we seach for a full username, it's + // which offset is requested (so if we search for a full username, it's // infinite) // see https://github.com/tootsuite/mastodon/issues/11365 - val res = if (data.accounts.size == 1 - && data.accounts[0].username - .equals(searchRequest, ignoreCase = true)) { + // see https://github.com/tootsuite/mastodon/issues/13083 + val res = if ((data.accounts.size == 1 && data.accounts[0].username.equals(searchRequest, ignoreCase = true)) + || (data.statuses.size == 1 && data.statuses[0].url.equals(searchRequest))) { listOf() } else { parser(data) } - if(res.isEmpty()) { + if (res.isEmpty()) { source.exhausted = true } callback.onResult(res) diff --git a/app/src/main/java/com/keylesspalace/tusky/entity/Account.kt b/app/src/main/java/com/keylesspalace/tusky/entity/Account.kt index a8b2d74b..dbb17901 100644 --- a/app/src/main/java/com/keylesspalace/tusky/entity/Account.kt +++ b/app/src/main/java/com/keylesspalace/tusky/entity/Account.kt @@ -31,7 +31,7 @@ data class Account( val id: String, @SerializedName("username") val localUsername: String, @SerializedName("acct") val username: String, - @SerializedName("display_name") val displayName: String, + @SerializedName("display_name") val displayName: String?, // should never be null per Api definition, but some servers break the contract val note: @WriteWith() Spanned, val url: String, val avatar: String, @@ -49,7 +49,7 @@ data class Account( ) : Parcelable { val name: String - get() = if (displayName.isEmpty()) { + get() = if (displayName.isNullOrEmpty()) { localUsername } else displayName diff --git a/app/src/main/java/com/keylesspalace/tusky/fragment/ViewThreadFragment.java b/app/src/main/java/com/keylesspalace/tusky/fragment/ViewThreadFragment.java index 09661d11..7aab7ded 100644 --- a/app/src/main/java/com/keylesspalace/tusky/fragment/ViewThreadFragment.java +++ b/app/src/main/java/com/keylesspalace/tusky/fragment/ViewThreadFragment.java @@ -332,7 +332,7 @@ public final class ViewThreadFragment extends SFragment implements .setIsExpanded(expanded) .createStatusViewData(); statuses.setPairedItem(position, newViewData); - adapter.setItem(position, newViewData, false); + adapter.setItem(position, newViewData, true); updateRevealIcon(); } 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 3a338fe2..9487591e 100644 --- a/app/src/main/java/com/keylesspalace/tusky/network/MastodonApi.kt +++ b/app/src/main/java/com/keylesspalace/tusky/network/MastodonApi.kt @@ -458,16 +458,19 @@ interface MastodonApi { @Query("limit") limit: Int ): Single> - @DELETE("api/v1/lists/{listId}/accounts") + @FormUrlEncoded + // @DELETE doesn't support fields + @HTTP(method = "DELETE", path = "api/v1/lists/{listId}/accounts", hasBody = true) fun deleteAccountFromList( @Path("listId") listId: String, - @Query("account_ids[]") accountIds: List + @Field("account_ids[]") accountIds: List ): Completable + @FormUrlEncoded @POST("api/v1/lists/{listId}/accounts") fun addCountToList( @Path("listId") listId: String, - @Query("account_ids[]") accountIds: List + @Field("account_ids[]") accountIds: List ): Completable @GET("/api/v1/conversations") 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 264caf12..23d794f8 100644 --- a/app/src/main/java/com/keylesspalace/tusky/repository/TimelineRepository.kt +++ b/app/src/main/java/com/keylesspalace/tusky/repository/TimelineRepository.kt @@ -299,7 +299,7 @@ fun Account.toEntity(accountId: Long, gson: Gson): TimelineAccountEntity { timelineUserId = accountId, localUsername = localUsername, username = username, - displayName = displayName, + displayName = displayName.orEmpty(), url = url, avatar = avatar, emojis = gson.toJson(emojis), diff --git a/app/src/main/java/com/keylesspalace/tusky/util/EmojiCompatFont.java b/app/src/main/java/com/keylesspalace/tusky/util/EmojiCompatFont.java index 627893f2..ea047982 100644 --- a/app/src/main/java/com/keylesspalace/tusky/util/EmojiCompatFont.java +++ b/app/src/main/java/com/keylesspalace/tusky/util/EmojiCompatFont.java @@ -27,6 +27,7 @@ import de.c1710.filemojicompat.FileEmojiCompatConfig; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.Response; +import okhttp3.ResponseBody; import okio.BufferedSink; import okio.Okio; import okio.Source; @@ -81,7 +82,7 @@ public class EmojiCompatFont { R.drawable.ic_notoemoji, "https://tusky.app/hosted/emoji/NotoEmojiCompat.ttf", "11.0.0" - ); + ); /** * This array stores all available EmojiCompat fonts. @@ -109,14 +110,14 @@ public class EmojiCompatFont { /** * Returns the Emoji font associated with this ID + * * @param id the ID of this font * @return the corresponding font. Will default to SYSTEM_DEFAULT if not in range. */ public static EmojiCompatFont byId(int id) { - if(id >= 0 && id < FONTS.length) { + if (id >= 0 && id < FONTS.length) { return FONTS[id]; - } - else { + } else { return SYSTEM_DEFAULT; } } @@ -157,15 +158,15 @@ public class EmojiCompatFont { /** * This method will return the actual font file (regardless of its existence) for * the current version (not necessarily the latest!). + * * @return The font (TTF) file or null if called on SYSTEM_FONT */ @Nullable private File getFont(Context context) { - if(this != SYSTEM_DEFAULT) { + if (this != SYSTEM_DEFAULT) { File directory = new File(context.getExternalFilesDir(null), DIRECTORY); return new File(directory, this.getName() + this.getVersion() + ".ttf"); - } - else { + } else { return null; } } @@ -185,6 +186,7 @@ public class EmojiCompatFont { /** * Checks whether there is already a font version that satisfies the current version, i.e. it * has a higher or equal version code. + * * @param context The Context * @return Whether there is a font file with a higher or equal version code to the current */ @@ -199,10 +201,11 @@ public class EmojiCompatFont { /** * Downloads the TTF file for this font + * * @param listeners The listeners which will be notified when the download has been finished */ public void downloadFont(Context context, Downloader.EmojiDownloadListener... listeners) { - if(this != SYSTEM_DEFAULT) { + if (this != SYSTEM_DEFAULT) { // Additionally run a cleanup process after the download has been successful. Downloader.EmojiDownloadListener cleanup = font -> deleteOldVersions(context); @@ -216,9 +219,8 @@ public class EmojiCompatFont { this, allListeners.toArray(allListenersA)) .execute(getFont(context)); - } - else { - for(Downloader.EmojiDownloadListener listener: listeners) { + } else { + for (Downloader.EmojiDownloadListener listener : listeners) { // The system emoji font is always downloaded... listener.onDownloaded(this); } @@ -227,6 +229,7 @@ public class EmojiCompatFont { /** * Deletes any older version of a font + * * @param context The current Context */ private void deleteOldVersions(Context context) { @@ -236,11 +239,11 @@ public class EmojiCompatFont { Log.d(TAG, String.format("deleteOldVersions: Found %d other font files", existingFontFiles.size())); for (Pair fileExists : existingFontFiles) { if (compareVersions(fileExists.second, getVersionCode()) < 0) { - File file = fileExists.first; - // Uses side effects! - Log.d(TAG, String.format("Deleted %s successfully: %s", file.getAbsolutePath(), - file.delete())); - } + File file = fileExists.first; + // Uses side effects! + Log.d(TAG, String.format("Deleted %s successfully: %s", file.getAbsolutePath(), + file.delete())); + } } } @@ -250,6 +253,7 @@ public class EmojiCompatFont { /** * Loads all font files that are inside the files directory into an ArrayList with the information * on whether they are older than the currently available version or not. + * * @param context The Context */ private void loadExistingFontFiles(Context context) { @@ -274,7 +278,7 @@ public class EmojiCompatFont { this.existingFontFiles = new ArrayList<>(existingFontFiles.length); - for(File file : existingFontFiles) { + for (File file : existingFontFiles) { Matcher matcher = fontRegex.matcher(file.getName()); if (matcher.matches()) { String version = matcher.group(1); @@ -294,6 +298,7 @@ public class EmojiCompatFont { /** * Returns the current or latest version of this font file (if there is any) + * * @param context The Context * @return The file for this font with the current or (if not existent) highest version code or null if there is no file for this font. */ @@ -380,7 +385,7 @@ public class EmojiCompatFont { * Stops downloading the font. If no one started a font download, nothing happens. */ public void cancelDownload() { - if(fontDownloader != null) { + if (fontDownloader != null) { fontDownloader.cancel(false); fontDownloader = null; } @@ -407,7 +412,7 @@ public class EmojiCompatFont { } @Override - protected File doInBackground(File... files){ + protected File doInBackground(File... files) { // Only download to one file... File downloadFile = files[0]; try { @@ -428,7 +433,7 @@ public class EmojiCompatFont { // Download! if (response.body() != null && response.isSuccessful() - && (size = response.body().contentLength()) > 0) { + && (size = networkResponseLength(response)) > 0) { float progress = 0; source = response.body().source(); try { @@ -448,14 +453,13 @@ public class EmojiCompatFont { Log.e(TAG, "Status code: " + response.code()); failed = true; } - } - finally { - if(source != null) { + } finally { + if (source != null) { source.close(); } sink.close(); // This 'if' uses side effects to delete the File. - if(isCancelled() && !downloadFile.delete()) { + if (isCancelled() && !downloadFile.delete()) { Log.e(TAG, "Could not delete file " + downloadFile); } } @@ -468,28 +472,27 @@ public class EmojiCompatFont { @Override public void onProgressUpdate(Float... progress) { - for(EmojiDownloadListener listener: listeners) { + for (EmojiDownloadListener listener : listeners) { listener.onProgress(progress[0]); } } @Override public void onPostExecute(File downloadedFile) { - if(!failed && downloadedFile.exists()) { + if (!failed && downloadedFile.exists()) { for (EmojiDownloadListener listener : listeners) { listener.onDownloaded(font); } - } - else { + } else { fail(downloadedFile); } } private void fail(File failedFile) { - if(failedFile.exists() && !failedFile.delete()) { + if (failedFile.exists() && !failedFile.delete()) { Log.e(TAG, "Could not delete file " + failedFile); } - for(EmojiDownloadListener listener : listeners) { + for (EmojiDownloadListener listener : listeners) { listener.onFailed(); } } @@ -500,11 +503,13 @@ public class EmojiCompatFont { public interface EmojiDownloadListener { /** * Called after successfully finishing a download. + * * @param font The font related to this download. This will help identifying the download */ void onDownloaded(EmojiCompatFont font); // TODO: Add functionality + /** * Called when something went wrong with the download. * This one won't be called when the download has been cancelled though. @@ -515,12 +520,39 @@ public class EmojiCompatFont { /** * Called whenever the progress changed + * * @param Progress A value between 0 and 1 representing the current progress */ default void onProgress(float Progress) { // ARE WE THERE YET? } } + + + /** + * This method is needed because when transparent compression is used OkHttp reports + * {@link ResponseBody#contentLength()} as -1. We try to get the header which server sent + * us manually here. + * + * @see OkHttp issue 259 + */ + private long networkResponseLength(Response response) { + Response networkResponse = response.networkResponse(); + if (networkResponse == null) { + // In case it's a fully cached response + ResponseBody body = response.body(); + return body == null ? -1 : body.contentLength(); + } + String header = networkResponse.header("Content-Length"); + if (header == null) { + return -1; + } + try { + return Integer.parseInt(header); + } catch (NumberFormatException e) { + return -1; + } + } } @Override diff --git a/app/src/main/res/drawable/status_divider.xml b/app/src/main/res/drawable/status_divider.xml index cb6cf074..37fbbab1 100644 --- a/app/src/main/res/drawable/status_divider.xml +++ b/app/src/main/res/drawable/status_divider.xml @@ -2,5 +2,5 @@ - + \ No newline at end of file diff --git a/app/src/main/res/layout-sw640dp/fragment_timeline.xml b/app/src/main/res/layout-sw640dp/fragment_timeline.xml index e150a2d1..e85798eb 100644 --- a/app/src/main/res/layout-sw640dp/fragment_timeline.xml +++ b/app/src/main/res/layout-sw640dp/fragment_timeline.xml @@ -3,8 +3,8 @@ xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" - android:background="?attr/windowBackgroundColor" - android:layout_height="match_parent"> + android:layout_height="match_parent" + android:background="?attr/windowBackgroundColor"> + license:link="https://kotlinlang.org/" + license:name="Kotlin" /> + license:link="https://developer.android.com/jetpack/androidx" + license:name="AndroidX" /> + + - - + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_timeline_notifications.xml b/app/src/main/res/layout/fragment_timeline_notifications.xml index f3bcea0f..0fd674e9 100644 --- a/app/src/main/res/layout/fragment_timeline_notifications.xml +++ b/app/src/main/res/layout/fragment_timeline_notifications.xml @@ -3,7 +3,8 @@ xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" - android:layout_height="match_parent"> + android:layout_height="match_parent" + android:background="?android:attr/colorBackground"> Listen Listen Liste - Eine Liste erstellen - Eine Liste umbenennen - Eine Liste löschen - Eine Liste bearbeiten + Liste erstellen + Liste umbenennen + Liste löschen + Liste bearbeiten Ein Konto zu einer Liste hinzufügen verfassen mit %1$s Fehler beim Speichern der Beschreibung @@ -450,14 +450,13 @@ Geplante Beiträge Plane Beitrag Zurücksetzen - Dies sind Zeitstempel für Status. Beispiele: \"16s\" oder \"2t\". Audiodateien müssen kleiner als 40MB sein. Lesezeichen Lesezeichen Lesezeichen Bunten Farbverlauf für versteckte Medien anzeigen - Angetrieben durch Tusky + Powered by Tusky %s Boost %s Boosts diff --git a/app/src/main/res/values-en-rAU/strings.xml b/app/src/main/res/values-en-rAU/strings.xml deleted file mode 100644 index a6b3daec..00000000 --- a/app/src/main/res/values-en-rAU/strings.xml +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/app/src/main/res/values-en-rUS/strings.xml b/app/src/main/res/values-en-rUS/strings.xml deleted file mode 100644 index 2392d59a..00000000 --- a/app/src/main/res/values-en-rUS/strings.xml +++ /dev/null @@ -1,2 +0,0 @@ - - diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index ebd8c3c3..0ae66004 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -467,10 +467,16 @@ Error al buscar el post %s Potenciado por Tusky - Favoritos + Marcadores Favorito - Favoritos + Marcadores Marcado como favorito Seleccionar lista Lista - + Los ficheros de audio deben ser menores de 40MB. + Mostrar degradados coloridos para el contenido multimedia oculto. + + No tienes ningún borrador. + No tienes ningún estado programado. + + diff --git a/app/src/main/res/values-fa/strings.xml b/app/src/main/res/values-fa/strings.xml index 79ed253f..bb9cd3bf 100644 --- a/app/src/main/res/values-fa/strings.xml +++ b/app/src/main/res/values-fa/strings.xml @@ -23,10 +23,10 @@ محلی همگانی بوق - فرسته‌ها + بوق با پاسخ‌ پی می‌گیرد - پیرو + پی‌گیر پسندها کاربران خموش کاربران مسدود @@ -34,7 +34,7 @@ ویرایش نمایه‌تان پیش‌نویس‌ها پروانه‌ها - %s تقویت شد + %s تقویت کرد محتوای حسّاس رسانهٔ پنهان کلیک برای نمایش @@ -54,7 +54,7 @@ پسند بیش‌تر ایجاد - ورود با ماستدون + ورود با ماستودون خروج مطمئنید می‌خواهید از حساب %1s خارج شوید؟ پیگیری @@ -134,7 +134,7 @@ حذف این بوق؟ عمومی: فرستادن به خط زمانی‌های عمومی فهرست‌نشده: نشان ندادن در خط زمانی‌های عمومی - فقط پیروان: فرستادن فقط به پیروان + فقط پی‌گیران: فرستادن فقط به پی‌گیران مستقیم: فرستادن فقط برای کاربران مورد اشاره آگاهی‌ها آگاهی‌ها @@ -173,7 +173,7 @@ شکست در هم‌گام‌سازی تنظیمات عمومی فهرست‌نشده - فقط پیروان + فقط پی‌گیران اندازهٔ متن وضعیت بسیار کوچک کوچک @@ -182,8 +182,8 @@ بسیار بزرگ اشاره‌های جدید آگاهی‌ها در مورد اشاره‌های جدید - پیروان جدید - آگاهی‌ها درمورد پیروان جدید + پی‌گیران جدید + آگاهی‌ها درمورد پی‌گیران جدید تقویت‌ها آگاهی‌ها هنگام تقویت بوق‌هایتان پسندها @@ -225,7 +225,7 @@ در حال پاسخ به @%s بارگیری بیش‌تر افزودن حساب - افزودن حساب ماستدون جدید + افزودن حساب جدید ماستودون فهرست‌ها فهرست‌ها خط زمانی فهرست @@ -235,7 +235,7 @@ تنظیم عنوان برداشتن قفل حساب - می‌گذارد پیروانتان را به صورت دستی تأیید کنید + نیاز دارد پی‌گیرانتان را به صورت دستی تأیید کنید ذخیرهٔ پیش‌نویس؟ در حال فرستادن بوق… خطای فرستادن بوق @@ -257,7 +257,7 @@ شروع دوباره مجموعهٔ اموجی پیش‌گزیدهٔ افزاره‌تان اموجی‌های اندروید ۴.۴ تا ۷.۱ - مجموعهٔ اموجی استاندارد ماستدون + مجموعهٔ اموجی استاندارد ماستودون شکست در بارگیری بات %1$s منتقل شد به: @@ -379,7 +379,7 @@ پسندیده عمومی فهرست‌نشده - پیروان + پی‌گیران مستقیم نظرسنجی با انتخاب‌ها: %1$s، %2$s، %3$s، %4$s؛ %5$s @@ -459,14 +459,26 @@ بوق‌های زمان‌بندی‌شده زمان‌بندی بوق بازنشانی - مطمئنید می‌خواهید تمام %s را مسدود کنید؟ محتوای آن دامنه را در هیچ‌یک از خط زمانی‌ها یا در آگاهی‌هایتان نخواهید دید. پیروانتان از آن دامنه، برداشته خواهند شد. + مطمئنید می‌خواهید تمام %s را مسدود کنید؟ محتوای آن دامنه را در هیچ‌یک از خط زمانی‌ها یا در آگاهی‌هایتان نخواهید دید. پی‌گیرانتان از آن دامنه، برداشته خواهند شد. هنگامی که کلیدواژه یا عبارت، فقط حروف‌عددی باشد، فقط اگر با تمام واژه مطابق باشد، اعمال خواهد شد عبارت پالایش %1$s • %2$s - گزارش به ناظم‌های کارسازتان ارسال خواهد شد. می‌توانید توضیحی در باب چرایی گزارش این حساب در زیر بنویسید: + گزارش به ناظر کارسازتان ارسال خواهد شد. می‌توانید توضیحی در باب چرایی گزارش این حساب در زیر بنویسید: این حساب از کارسازی دیگر است. رونوشتی ناشناس از گزارش، به آن‌جا نیز ارسال شود؟ خطا در یافتن فرستهٔ %s قدرت‌گرفته از تاسکی - + پرونده‌های صوتی باید کم‌تر از ۴۰م‌ب باشند. + نشانک‌ها + نشانک + نشانک‌ها + نمایش گرادیان رنگی برای رسانهٔ نهفته + + نشان‌شده + گزینش فهرست + فهرست + هیچ پیش‌نویسی ندارید. + هیچ وضعیت زمان‌بسته‌ای ندارید. + + diff --git a/app/src/main/res/values-fr-rBE/strings.xml b/app/src/main/res/values-fr-rBE/strings.xml deleted file mode 100644 index a6b3daec..00000000 --- a/app/src/main/res/values-fr-rBE/strings.xml +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index d9426a3d..49cf48b2 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -331,9 +331,9 @@ Détacher Épingler - <b>%1$s</b> Favoris - <b>%1$s</b> Favoris - + %1$s Favori + %1$s Favoris + <b>%s</b> Boost <b>%s</b> Boosts @@ -381,8 +381,8 @@ Effacer et ré-écrire ce pouet \? - %s vote - %s votes + %s voix + %s voix %s restant Termine à %s diff --git a/app/src/main/res/values-is/strings.xml b/app/src/main/res/values-is/strings.xml index b4b7a95b..12e3dac2 100644 --- a/app/src/main/res/values-is/strings.xml +++ b/app/src/main/res/values-is/strings.xml @@ -23,7 +23,7 @@ Mistókst að fá innskráningarteikn. Stöðufærslan er of löng! Skráin verður að vera minni en 8MB. - Myndskeiðasskrár verða að vera minni en 40MB. + Myndskeiðaskrár verða að vera minni en 40MB. Þessa tegund skrár er ekki hægt að senda inn. Ekki var hægt að opna skrána. Krafist er heimilda til að lesa gögn. @@ -507,4 +507,5 @@ Þú ert ekki með nein drög. Þú ert ekki með neinar áætlaðar stöðufærslur. - +Hljóðskrár verða að vera minni en 40MB. + diff --git a/app/src/main/res/values-kab/strings.xml b/app/src/main/res/values-kab/strings.xml index 18771c32..0a7c51e7 100644 --- a/app/src/main/res/values-kab/strings.xml +++ b/app/src/main/res/values-kab/strings.xml @@ -8,8 +8,8 @@ Ẓreg amaγnu Nadi Γef - Tibdarin - Tibdarin + Umuγen + Umuγen Tijewwiqt-ik aṭas i γuzzifet! Agejdan Iccaren @@ -49,5 +49,191 @@ %1$s n ismenyifen - Ur teɛiḍ ara irewwayen. + Ur tesɛiḍ ara irewwayen. + Tella-d tucḍa. + Tilγa + D acu i ttummant\? + + Ticraḍ + Rnu γer ticraḍ + Ticraḍ + Sgugem %s + Bder + Sekles + Ẓreg + Sefsex + Anasiw n imujiyen + Rnu iccer + Nγel aseγwen + Ldi amzun d %s + Bḍu amzun d… + 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 + Sider + Kkes tijewwiqt-a\? + Ẓreg tilγa + Agrudem + Aceɛlal + Aberkan + Tutlayt + Iccaren + Apṛuksi + %1$s, %2$s, %3$s d %4$d nniḍen + %1$s, %2$s, akked %3$s + %1$s akked %2$s + Tusky %s + Amaγnu n Tusky + + Tugniwin + Tibidyutin + + Yeṭafaṛ-ik-id + Kkes + Lqem + Rnu amiḍan + Rnu yiwen umiḍan amaynut n Maṣṭudun + + Aru + + Tummant-ik·im %s ur tesɛi ara imujiyen udmawanen + Ldi tijewwiqt + CC-BY 4.0 + CC-BY-SA 4.0 + + Senṭeḍ + + Imiḍanen yettwasgugmen + Imiḍanen yettusḥebsen + Tiγula yettwaffren + Isuturen n teḍfeṛt + Taγwalt + Sfeḍ + Imiḍanen yettwasgugmen + Imiḍanen yettusḥebsen + Tiγula yettwaffren + Isuturen n teḍfeṛt + Ẓreg tilγa + Taγwalt + Kkes + Azen + + Ẓreg + Yettwanṭḍen + Rnu amidya + Rnu assenqed + Ṭef tugna + Timeẓriwt n tijewwaqt + Sγiwes tijewwaqt-a + Bḍu agbur n tijewwiqt-a + Bḍu aseγwen γer tijewwiqt + Rnu 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γ + + Rnu isefka + Isem n wumuγ + + Fren tabdart + Umuγ + Sizdeg + Imiḍanen + Rnu yiwen wefran + Ccetki γef @%s + Ccetki + Ggami + Yessidired %1$s + + Bḍu tugna s… + + itteqqen… + + Issalay… + fukken kran n wadγaren + Imzizdigen + + Akken yella yiṭij + Iminig + Sken-ed tiririyin + Apṛuksi HTTP + Tansa n upṛuksi HTTP + Imeḍfaṛen imaynuten + Adγaren + Yuder-ik-id %s + Yettwargel umiḍan + + %dis aya + %dus aya + Tettaraḍ-as i @%s + awid ugar + + Idewenniyen + Rgel amiḍan + Yettnadi… + Ales tanekra + Tuccḍa n usider + + Igujj %1$s γer: + + Kkes asenṭeḍ + %1$s + %1$s akked %2$s + %1$s, %2$s akked %3$d nniḍen + Aru tijewwiqt + %1$s • %2$s + + %s wedγar + %s n yedγaren + + %s id yugran + ad ifak deg %s + ifuk + + Dγer + + Ifuk, tura kan, yiwen wedγar t tteki-iḍ degs + Ifukk yiwen wedγar id snulfaḍ + + + %d n wass + %d n wussan + + + %d wesrag + %d n yisragen + + + %d n tasdidt + %d n tesdidin + + Kemmel + Uγal + Tella-d tuccḍa deg ccetki + Tucḍa n unadi + + Assenqed + 5 n tasditin + 30 n tasditin + 1 n wesrag + 6 n wesragen + 1 n wass + 3 n wussan + 7 n wussan + Tafrant %d + + Ig ṭafaṛ + Imeḍfaṛen + Nadi γef medden i teṭafareḍ + Imeḍfaṛen + diff --git a/app/src/main/res/values-lb/strings.xml b/app/src/main/res/values-lb/strings.xml deleted file mode 100644 index a6b3daec..00000000 --- a/app/src/main/res/values-lb/strings.xml +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/app/src/main/res/values-night/theme_colors.xml b/app/src/main/res/values-night/theme_colors.xml index 133dfbfc..11ad69c3 100644 --- a/app/src/main/res/values-night/theme_colors.xml +++ b/app/src/main/res/values-night/theme_colors.xml @@ -2,7 +2,7 @@ @color/tusky_grey_30 - @color/tusky_grey_10 + @color/tusky_grey_25 @color/tusky_grey_20 @color/tusky_grey_10 @@ -15,6 +15,7 @@ @color/tusky_grey_70 @color/tusky_grey_30 + @color/tusky_grey_25 @color/tusky_orange diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index f88cd153..f4e3ae8e 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -441,7 +441,7 @@ Verder naar %s Het rapporteren is mislukt Het ophalen van toots is mislukt - Deze rapportage wordt naar jouw servermoderator(en) gestuurd. Je kunt een uitleg geven over waarom je het account hieronder wilt rapporteren: + De rapportage wordt naar de moderator(en) van jouw server gestuurd. Je kunt hieronder een uitleg geven waarom je dit account rapporteert: Het account is van een andere server. Wil je ook een geanonimiseerde kopie van de rapportage daarnaartoe sturen\? Meldingenfilter tonen @@ -459,4 +459,30 @@ Keuze %d Bewerk +Geluidsbestanden moeten minder dan 40MB zijn. + Bladwijzers + Ingeplande toots + Bladwijzer + Bewerken + Bladwijzers + Poll toevoegen + Ingeplande toots + Ingeplande toot + Herstellen + Wazige kleurovergangen voor verborgen media tonen + + Powered by Tusky + Altijd toots met tekstwaarschuwingen uitklappen + Als bladwijzer toegevoegd + Kies een lijst + Lijst + Accounts + Zoeken mislukt + + Poll + Fout tijdens opzoeken toot %s + + Je hebt nog geen concepten. + Je hebt nog geen ingeplande toots. + diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 1bb3027e..d2c1acfd 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -492,4 +492,10 @@ Dodane do zakładek Wybierz listę Lista - + Pliki audio muszą być mniejsze niż 40MB. + Pokaż kolorowe gradienty dla ukrytych mediów + + Nie masz żadnych szkiców. + Nie masz żadnych zaplanowanych wpisów. + + diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 6c800042..6c8de206 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -484,4 +484,6 @@ Sem toots agendados. - +Áudios devem ser menores que 40MB. + Sem rascunhos. + diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index b0a97014..c6329807 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -538,7 +538,6 @@ Отложенные записи Отложить запись Сброс - Ошибка при поиске сообщения / ний Закладки Добавить в закладки diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index 75f1c473..8c42b4b4 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -28,4 +28,88 @@ Nahlásiť používateľa @%s Rýchla odpoveď Odpovedať + Čo je server\? + + Obľúbené + O aplikácii + Vyskytla sa chyba v sieti! Prosím skontrolujte svoje pripojenie a skúste to znova! + Toto nemôže byť prázdne. + Autorizácia bola zamietnutá. + Nepodarilo sa získať prihlasovací token. + Súbor musí byť menší ako 8 MB. + Videosúbory musia byť menšie ako 40 MB. + Audio súbory musia byť menšie ako 40 MB. + Súbor sa nepodarilo otvoriť. + Domov + Panely + Vytvoriť záložku + Sledovať + Prestať sledovať + Blokovať + Odblokovať + Nahlásiť + Upraviť + Vymazať + Vymazať a prepísať + Obnoviť + Odkazy + Zmienky + Hashtagy + Zobraziť obľúbené + + Hashtagy + Zmienky + Odkazy + Otvoriť médium #%d + + Sťahovanie %1$s + + Kopírovať odkaz + Otvoriť ako %s + Odoslané! + Používateľ bol odblokovaný + Odoslané! + Odpoveď bola úspešne odoslaná. + + Ktorý server\? + Zobrazované meno + O vás + Hľadať… + + Žiadne výsledky + + Odpovedať… + Nahrávanie… + Stiahnuť + Neplatná doména + Autentizácia servru zlyhala. + Nepodarilo sa nájsť použiteľný webový prehliadač. + Vyskytla sa neidentifikovaná chyba autorizácie. + Toot je príliš dlhý! + Tento typ súboru nemôže byť nahraný. + Chyba pri odosielaní tootu. + + Toot + %s si obľúbil/a váš toot + TOOT + TOOT! + Viditeľnosť tootu + Naplánovať toot + Vymazať tento toot\? + Vymazať a prepísať tento toot\? + Zdieľať obsah tootu + Zdieľať odkaz tootu + Odosielanie tootu… + Chyba pri odosielaní tootu + Kópia vášho tootu bola uložená do konceptov + Otvoriť toot + Napísať toot + Plánované tooty + Plánované tooty + Avatar + Odstrániť + Uzamknúť účet + Uložiť koncept\? + Odosielanie tootov + Odosielanie bolo zrušené diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index 8dcb8eb0..df30ecec 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -118,7 +118,7 @@ Öppna media #%d Laddar ned %1$s Kopiera länk - Öppen som %s + Öppna med %s Dela som … Dela toot-URL till… Dela toot till… @@ -480,4 +480,6 @@ Du har inga schemalagda statusar. - +Ljudfiler måste vara mindre än 40MB. + Du har inga utkast. + diff --git a/app/src/main/res/values-v27/styles.xml b/app/src/main/res/values-v27/styles.xml index eaea6ccc..78d32747 100644 --- a/app/src/main/res/values-v27/styles.xml +++ b/app/src/main/res/values-v27/styles.xml @@ -7,20 +7,20 @@ true false @color/tusky_grey_20 - @color/tusky_grey_30 + @color/tusky_grey_25 diff --git a/app/src/main/res/values/attrs.xml b/app/src/main/res/values/attrs.xml index 5de7712a..3dd3e30f 100644 --- a/app/src/main/res/values/attrs.xml +++ b/app/src/main/res/values/attrs.xml @@ -13,6 +13,7 @@ + diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index cde703eb..9cbfaa1e 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -15,6 +15,7 @@ #070b14 #121a24 #182230 + #1f2836 #252e3c #3f4855 #666e7a diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index f8bbe3d4..daa6252a 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -9,7 +9,7 @@ 120dp 8dp 14dp - 8dp + 16dp 36dp 16dp 5dp diff --git a/app/src/main/res/values/donottranslate.xml b/app/src/main/res/values/donottranslate.xml index f860a752..901c2875 100644 --- a/app/src/main/res/values/donottranslate.xml +++ b/app/src/main/res/values/donottranslate.xml @@ -46,6 +46,7 @@ Español Euskara Français + íslenska Italiano Magyar Nederlands @@ -59,6 +60,7 @@ Türkçe Русский العربية + বাংলা فارسی தமிழ் 한국어 @@ -82,6 +84,7 @@ es eu fr + is it hu nl @@ -95,6 +98,7 @@ tr ru ar + bn-in fa ta ko diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 9dd8c363..2e89c601 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -63,6 +63,7 @@ @color/iconColor @drawable/status_divider + @color/dividerColor @color/textColorDisabled @@ -71,7 +72,7 @@ @color/iconColor @color/textColorTertiary @color/textColorTertiary - @color/colorBackgroundAccent + ?attr/dividerColor @color/white @color/white @@ -91,11 +92,12 @@ @@ -140,7 +143,7 @@ @color/black @color/tusky_grey_80 - @color/tusky_grey_40 + @color/tusky_grey_40