Merge branch 'develop'

This commit is contained in:
tom79 2019-05-05 19:04:02 +02:00
commit 1e4d63f174
19 changed files with 255 additions and 52 deletions

View File

@ -38,7 +38,8 @@
<img src="./images/device-2019-02-02-114910.png" width="250">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
Developer: [@tom79](https://mastodon.social/@tom79)
Lead developer: [@tom79](https://mastodon.social/@tom79)
Developer: [@kasun](https://mastodon.social/@kasun)
## Backers

View File

@ -7,8 +7,8 @@ android {
applicationId "fr.gouv.etalab.mastodon"
minSdkVersion 16
targetSdkVersion 28
versionCode 259
versionName "1.80.2"
versionCode 260
versionName "1.80.3"
multiDexEnabled true
}
dexOptions {

View File

@ -24,11 +24,14 @@ import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.database.sqlite.SQLiteDatabase;
import android.graphics.BitmapFactory;
import android.graphics.PorterDuff;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.preference.PreferenceManager;
import android.support.annotation.NonNull;
import android.support.design.widget.AppBarLayout;
@ -56,6 +59,7 @@ import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.view.inputmethod.InputMethodManager;
import android.webkit.URLUtil;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.LinearLayout;
@ -63,9 +67,28 @@ import android.widget.RelativeLayout;
import android.widget.SeekBar;
import android.widget.TextView;
import android.widget.Toast;
import com.tonyodev.fetch2.Download;
import com.tonyodev.fetch2.Error;
import com.tonyodev.fetch2.Fetch;
import com.tonyodev.fetch2.FetchConfiguration;
import com.tonyodev.fetch2.FetchListener;
import com.tonyodev.fetch2.NetworkType;
import com.tonyodev.fetch2.Priority;
import com.tonyodev.fetch2.Request;
import com.tonyodev.fetch2core.DownloadBlock;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Random;
import java.util.regex.Matcher;
import es.dmoral.toasty.Toasty;
@ -118,6 +141,7 @@ import fr.gouv.etalab.mastodon.interfaces.OnUpdateAccountInfoInterface;
import fr.gouv.etalab.mastodon.services.BackupStatusService;
import fr.gouv.etalab.mastodon.services.LiveNotificationService;
import fr.gouv.etalab.mastodon.sqlite.AccountDAO;
import fr.gouv.etalab.mastodon.sqlite.DomainBlockDAO;
import fr.gouv.etalab.mastodon.sqlite.Sqlite;
import fr.gouv.etalab.mastodon.sqlite.TimelinesDAO;
@ -180,6 +204,8 @@ public abstract class BaseMainActivity extends BaseActivity
private final int PICK_IMPORT = 5556;
private AlertDialog.Builder dialogBuilderOptin;
private List<ManageTimelines> timelines;
private FetchConfiguration fetchConfiguration;
private Fetch fetch;
public static HashMap<Integer, Fragment> mPageReferenceMap = new HashMap<>();
private static boolean notificationChecked = false;
@ -228,6 +254,7 @@ public abstract class BaseMainActivity extends BaseActivity
finish();
return;
}
initializeDownload();
final int theme = sharedpreferences.getInt(Helper.SET_THEME, Helper.THEME_DARK);
switch (theme){
case Helper.THEME_LIGHT:
@ -2038,13 +2065,28 @@ public abstract class BaseMainActivity extends BaseActivity
}
public void updateNotifCounter(){
if(tabLayout.getTabAt(1) == null)
if( timelines == null)
return;
//noinspection ConstantConditions
View tabNotif = tabLayout.getTabAt(1).getCustomView();
ManageTimelines notifTimeline;
int i = 0;
int position = -1;
for(ManageTimelines tl: timelines){
if( tl.getType() == ManageTimelines.Type.NOTIFICATION){
if( tabLayout.getTabAt(i) != null) {
position = i;
}
break;
}
i++;
}
if( position == -1)
return;
View tabNotif = tabLayout.getTabAt(position).getCustomView();
if( tabNotif == null)
return;
TextView tabCounterNotif = tabNotif.findViewById(R.id.tab_counter);
if( tabCounterNotif == null)
return;
tabCounterNotif.setText(String.valueOf(countNewNotifications));
if( countNewNotifications > 0){
tabCounterNotif.setVisibility(View.VISIBLE);
@ -2094,7 +2136,83 @@ public abstract class BaseMainActivity extends BaseActivity
}
}
private void initializeDownload(){
fetchConfiguration = new FetchConfiguration.Builder(this)
.setDownloadConcurrentLimit(3)
.build();
fetch = Fetch.Impl.getInstance(fetchConfiguration);
FetchListener fetchListener = new FetchListener() {
@Override
public void onWaitingNetwork(@NotNull Download download) {
}
@Override
public void onStarted(@NotNull Download download, @NotNull List<? extends DownloadBlock> list, int i) {
}
@Override
public void onResumed(@NotNull Download download) {
}
@Override
public void onRemoved(@NotNull Download download) {
}
@Override
public void onQueued(@NotNull Download download, boolean b) {
}
@Override
public void onProgress(@NotNull Download download, long l, long l1) {
}
@Override
public void onPaused(@NotNull Download download) {
}
@Override
public void onError(@NotNull Download download, @NotNull Error error, @Nullable Throwable throwable) {
Toasty.error(getApplicationContext(), getString(R.string.toast_error),Toast.LENGTH_LONG).show();
}
@Override
public void onDownloadBlockUpdated(@NotNull Download download, @NotNull DownloadBlock downloadBlock, int i) {
}
@Override
public void onDeleted(@NotNull Download download) {
}
@Override
public void onCompleted(@NotNull Download download) {
if( download.getFileUri().getPath() != null) {
String url = download.getUrl();
final String fileName = URLUtil.guessFileName(url, null, null);
final SharedPreferences sharedpreferences = getSharedPreferences(Helper.APP_PREFS, Context.MODE_PRIVATE);
String mime = Helper.getMimeType(url);
File file = new File(download.getFileUri().getPath());
final Intent intent = new Intent();
Random r = new Random();
final int notificationIdTmp = r.nextInt(10000);
intent.setAction(android.content.Intent.ACTION_VIEW);
Uri uri = Uri.parse("file://" + file.getAbsolutePath() );
intent.setDataAndType(uri, mime);
Helper.notify_user(getApplicationContext(), intent, notificationIdTmp, BitmapFactory.decodeResource(getResources(),
R.mipmap.ic_launcher), Helper.NotifType.STORE, getString(R.string.save_over), getString(R.string.download_from, fileName));
}
}
@Override
public void onCancelled(@NotNull Download download) {
}
@Override
public void onAdded(@NotNull Download download) {
}
};
fetch.addListener(fetchListener);
}
public void download(String file, String url){
final Request request = new Request(url, file);
request.setPriority(Priority.HIGH);
request.setNetworkType(NetworkType.ALL);
fetch.enqueue(request, updatedRequest -> {
//Request was successfully enqueued for download.
}, error -> {
});
}
public boolean getFloatingVisibility(){

View File

@ -93,6 +93,7 @@ import fr.gouv.etalab.mastodon.client.Entities.Results;
import fr.gouv.etalab.mastodon.client.Entities.Status;
import fr.gouv.etalab.mastodon.client.TLSSocketFactory;
import fr.gouv.etalab.mastodon.drawers.StatusListAdapter;
import fr.gouv.etalab.mastodon.helper.CrossActions;
import fr.gouv.etalab.mastodon.helper.FullScreenMediaController;
import fr.gouv.etalab.mastodon.helper.Helper;
import fr.gouv.etalab.mastodon.interfaces.OnPostActionInterface;
@ -522,6 +523,29 @@ public class PeertubeActivity extends BaseActivity implements OnRetrievePeertube
changeColor();
}
});
}else{
peertube_like_count.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String newState = peertube.getMyRating().equals("like")?"none":"like";
Status status = new Status();
status.setUri("https://" + peertube.getAccount().getHost() + "/videos/watch/" + peertube.getUuid());
CrossActions.doCrossAction(getApplicationContext(), RetrieveFeedsAsyncTask.Type.REMOTE_INSTANCE, status, null, API.StatusAction.FAVOURITE, null, PeertubeActivity.this, true);
peertube.setMyRating(newState);
changeColor();
}
});
peertube_dislike_count.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String newState = peertube.getMyRating().equals("dislike")?"none":"dislike";
Status status = new Status();
status.setUri("https://" + peertube.getAccount().getHost() + "/videos/watch/" + peertube.getUuid());
CrossActions.doCrossAction(getApplicationContext(), RetrieveFeedsAsyncTask.Type.REMOTE_INSTANCE, status, null, API.StatusAction.UNFAVOURITE, null, PeertubeActivity.this, true);
peertube.setMyRating(newState);
changeColor();
}
});
}
try {

View File

@ -129,6 +129,7 @@ public class PostActionAsyncTask extends AsyncTask<Void, Void, Void> {
api = new API(contextReference.get());
if (remoteStatus != null) {
String uri;
if (remoteStatus.getReblog() != null) {
if (remoteStatus.getReblog().getUri().startsWith("http"))
uri = remoteStatus.getReblog().getUri();

View File

@ -21,6 +21,7 @@ import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.support.v4.content.LocalBroadcastManager;
import com.google.gson.JsonArray;
import com.google.gson.JsonObject;

View File

@ -33,7 +33,6 @@ import android.support.v7.app.AlertDialog;
import android.support.v7.widget.PopupMenu;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;

View File

@ -32,6 +32,7 @@ import android.os.AsyncTask;
import android.os.Build;
import android.os.Bundle;
import android.os.CountDownTimer;
import android.os.Environment;
import android.os.Handler;
import android.support.annotation.NonNull;
import android.support.v4.app.FragmentTransaction;
@ -55,6 +56,7 @@ import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.webkit.URLUtil;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Button;
@ -180,7 +182,7 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct
private boolean redraft;
private Status toot;
private TagTimeline tagTimeline;
public static boolean fetch_all_more = false;
public StatusListAdapter(Context context, RetrieveFeedsAsyncTask.Type type, String targetedId, boolean isOnWifi, List<Status> statuses){
super();
this.context = context;
@ -218,6 +220,7 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct
redraft = false;
}
public void updateMuted(List<String> timedMute){
this.timedMute = timedMute;
}
@ -250,7 +253,11 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct
@Override
public void onPoll(Status status, Poll poll) {
status.setPoll(poll);
if( status.getReblog() != null){
status.getReblog().setPoll(poll);
}else{
status.setPoll(poll);
}
notifyStatusChanged(status);
}
@ -551,15 +558,13 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct
holder.multiple_choice.setVisibility(View.GONE);
holder.single_choice.setVisibility(View.GONE);
holder.submit_vote.setVisibility(View.GONE);
if( (status.getPoll() != null && status.getPoll().getOptionsList() != null)
|| (status.getReblog() != null && status.getReblog().getPoll() != null && status.getReblog().getPoll().getOptionsList() != null)
){
Poll poll;
if( status.getReblog() != null) {
poll = status.getReblog().getPoll();
}else {
poll = status.getPoll();
}
Poll poll;
if( status.getReblog() != null) {
poll = status.getReblog().getPoll();
}else {
poll = status.getPoll();
}
if( poll != null && poll.getOptionsList() != null){
if( poll.isVoted() || poll.isExpired()){
holder.rated.setVisibility(View.VISIBLE);
List<BarItem> items = new ArrayList<>();
@ -1338,6 +1343,31 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct
}
}
});
holder.fetch_more.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
status.setFetchMore(false);
holder.fetch_more.setEnabled(false);
holder.fetch_more.setVisibility(View.GONE);
if( context instanceof BaseMainActivity) {
SQLiteDatabase db = Sqlite.getInstance(context, DB_NAME, null, Sqlite.DB_VERSION).open();
List<ManageTimelines> timelines = new TimelinesDAO(context, db).getDisplayedTimelines();
for(ManageTimelines tl: timelines) {
if( tl.getType() == ManageTimelines.Type.HOME) {
DisplayStatusFragment homeFragment = (DisplayStatusFragment) mPageReferenceMap.get(tl.getPosition());
if (homeFragment != null) {
fetch_all_more = true;
homeFragment.fetchMore(status.getId());
}
break;
}
}
}else{
Toasty.error(context, context.getString(R.string.toast_error), Toast.LENGTH_LONG).show();
}
return false;
}
});
} else {
holder.fetch_more.setVisibility(View.GONE);
@ -1456,12 +1486,13 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct
/*if (expand_cw)
holder.status_spoiler_button.setVisibility(View.GONE);*/
String contentCheck = "";
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N)
contentCheck = Html.fromHtml(status.getReblog() == null?status.getContent():status.getReblog().getContent(), Html.FROM_HTML_MODE_LEGACY).toString();
else
//noinspection deprecation
contentCheck = Html.fromHtml(status.getReblog() == null?status.getContent():status.getReblog().getContent()).toString();
String content = status.getReblog() == null?status.getContent():status.getReblog().getContent();
if( content != null) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N)
contentCheck = Html.fromHtml(content, Html.FROM_HTML_MODE_LEGACY).toString();
else
contentCheck = Html.fromHtml(content).toString();
}
if (status.getReblog() == null) {
if (status.getSpoiler_text() != null && status.getSpoiler_text().trim().length() > 0) {
holder.status_spoiler_container.setVisibility(View.VISIBLE);
@ -2914,6 +2945,15 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct
}
}
});
imageView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
String myDir = sharedpreferences.getString(Helper.SET_FOLDER_RECORD, Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).getAbsolutePath());
String fileName = URLUtil.guessFileName(attachment.getUrl(), null, null);
((MainActivity)context).download(myDir+"/"+fileName, attachment.getUrl());
return true;
}
});
i++;
position++;
}

View File

@ -975,9 +975,16 @@ public class DisplayStatusFragment extends Fragment implements OnRetrieveFeedsIn
//Display the fetch more toot button
if( tmpStatuses.size() >= tootPerPage) {
if (initialBookMarkDate != null && !fetchMoreButtonDisplayed && tmpStatuses.size() > 0 && tmpStatuses.get(tmpStatuses.size() - 1).getCreated_at().after(initialBookMarkDate)) {
tmpStatuses.get(tmpStatuses.size() - 1).setFetchMore(true);
fetchMoreButtonDisplayed = true;
if( StatusListAdapter.fetch_all_more && statuses.size() > 0){
fetchMore(tmpStatuses.get(tmpStatuses.size() - 1).getId());
}else{
fetchMoreButtonDisplayed = true;
tmpStatuses.get(tmpStatuses.size() - 1).setFetchMore(true);
StatusListAdapter.fetch_all_more = false;
}
}
}else{
StatusListAdapter.fetch_all_more = false;
}
this.statuses.addAll(position, tmpStatuses);
boolean display_content_after_fetch_more = sharedpreferences.getBoolean(Helper.SET_DISPLAY_CONTENT_AFTER_FM, true);

View File

@ -3,22 +3,25 @@ package fr.gouv.etalab.mastodon.helper;
import java.util.Arrays;
/**
* Work from https://stackoverflow.com/a/5626340
* Work from https://stackoverflow.com/a/26420820
*/
public class FileNameCleaner {
public class FileNameCleaner {
private final static int[] illegalChars = {34, 60, 62, 124, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 58, 42, 63, 92, 47};
static {
Arrays.sort(illegalChars);
}
public static String cleanFileName(String badFileName) {
StringBuilder cleanName = new StringBuilder();
for (int i = 0; i < badFileName.length(); i++) {
int c = (int)badFileName.charAt(i);
int len = badFileName.codePointCount(0, badFileName.length());
for (int i=0; i<len; i++) {
int c = badFileName.codePointAt(i);
if (Arrays.binarySearch(illegalChars, c) < 0) {
cleanName.append((char)c);
cleanName.appendCodePoint(c);
}
}
return cleanName.toString();
}
}
}

View File

@ -969,7 +969,7 @@ public class Helper {
alert.show();
}
private static String getMimeType(String url) {
public static String getMimeType(String url) {
String type = null;
String extension = MimeTypeMap.getFileExtensionFromUrl(url);
if (extension != null) {

View File

@ -305,7 +305,7 @@
<string name="set_notif_follow_share">Avisa quan algú difongui el teu estatus</string>
<string name="set_notif_follow_add">Avisa quan algú marqui el teu estatus com a preferit</string>
<string name="set_notif_follow_mention">Avisa quan algú et mencioni</string>
<string name="set_notif_follow_poll">Notify when a poll ended</string>
<string name="set_notif_follow_poll">Avisar quan una enquesta finalitzi</string>
<string name="set_share_validation">Demana confirmació abans de difondre</string>
<string name="set_share_validation_fav">Demana confirmació abans d\'afegir a preferits</string>
<string name="set_wifi_only">Enviar avisos només per WIFI</string>
@ -567,7 +567,7 @@ Quan s\'esborra l\'aplicació s\'eliminen les dades immediatament.\n
<string name="channel_notif_boost">Nova difusió</string>
<string name="channel_notif_fav">Nou preferit</string>
<string name="channel_notif_mention">Nova menció</string>
<string name="channel_notif_poll">Poll Ended</string>
<string name="channel_notif_poll">Enquesta finalitzada</string>
<string name="channel_notif_toot">Toot nou</string>
<string name="channel_notif_backup">Còpia de seguretat de toots</string>
<string name="channel_notif_media">Baixada de mèdia</string>
@ -791,7 +791,7 @@ Quan s\'esborra l\'aplicació s\'eliminen les dades immediatament.\n
<string name="set_retrieve_metadata_share_from_extras">Adjunta una imatge en compartir un URL</string>
<!-- end languages -->
<string name="poll">Enquesta</string>
<string name="polls">Polls</string>
<string name="polls">Enquestes</string>
<string name="create_poll">Crea una enquesta</string>
<string name="poll_choice_1">Opció 1</string>
<string name="poll_choice_2">Opció 2</string>
@ -804,7 +804,7 @@ Quan s\'esborra l\'aplicació s\'eliminen les dades immediatament.\n
<string name="vote">Vota</string>
<string name="poll_not_private">No es pot adjuntar enquestes a un missatge directe!</string>
<string name="notif_poll">S\'ha acabat una enquesta en què havies participat</string>
<string name="notif_poll_self">A poll you tooted has ended</string>
<string name="notif_poll_self">Ha finalitzat una enquesta on has votat</string>
<string name="settings_category_notif_customize">Personalitza</string>
<string name="settings_category_notif_categories">Categories</string>
<string name="settings_category_notif_news">Notícies</string>

View File

@ -837,7 +837,7 @@ Uživatelské jméno a heslo nejsou nikdy ukládány. Jsou použity pouze během
<string name="warning_list_deletion">Použijte položky seznamu k odstranění tohoto seznamu!</string>
<string name="warning_main_timeline">Hlavní časové linie mohou být pouze skryty!</string>
<string name="action_bbcode">BBCode</string>
<string name="add_timeline">Add a timeline</string>
<string name="add_timeline">Přidat časovou osu</string>
<plurals name="number_of_vote">
<item quantity="one">%d hlas</item>
<item quantity="few">%d hlasy</item>

View File

@ -782,7 +782,7 @@ Sobald Sie die ersten Buchstaben eintippen, werden Namensvorschläge angezeigt\n
<string name="submit">Senden</string>
<string name="data_base_exported">Die Datenbank wurde exportiert!</string>
<string name="featured_hashtags">Empfohlene Hashtags</string>
<string name="filter_timeline_with_a_tag">Timeline mit Tags filtern</string>
<string name="filter_timeline_with_a_tag">Zeitleiste mit Schlagwörtern filtern</string>
<string name="no_tags">Keine Tags</string>
<string name="set_hide_delete_notification_on_tab">Schaltfläche „Mitteilungen löschen” im Tab „Mitteilungen” ausblenden</string>
<string name="set_retrieve_metadata_share_from_extras">Metadaten abrufen, wenn die URL von anderen Apps geteilt wird</string>
@ -818,9 +818,9 @@ Sobald Sie die ersten Buchstaben eintippen, werden Namensvorschläge angezeigt\n
<string name="visible_tabs_needed">Es müssen zwei sichtbare Tabs vorhanden sein!</string>
<string name="action_reorder_timeline">Zeitleisten neu ordnen</string>
<string name="warning_list_deletion">Verwenden Sie den Listeneintrag zum Löschen dieser Liste!</string>
<string name="warning_main_timeline">Hauptzeitachsen können nur ausgeblendet werden!</string>
<string name="warning_main_timeline">Hauptzeitleisten können nur ausgeblendet werden!</string>
<string name="action_bbcode">BBCode</string>
<string name="add_timeline">Zeitachse hinzufügen</string>
<string name="add_timeline">Zeitleiste hinzufügen</string>
<plurals name="number_of_vote">
<item quantity="one">%d Stimme</item>
<item quantity="other">%d Stimmen</item>

View File

@ -305,7 +305,7 @@
<string name="set_notif_follow_share">Értesíts, amikor valaki megismétli a posztodat</string>
<string name="set_notif_follow_add">Értesíts, ha valaki lájkolja a posztodat</string>
<string name="set_notif_follow_mention">Értesíts, amikor valaki megemlít téged</string>
<string name="set_notif_follow_poll">Notify when a poll ended</string>
<string name="set_notif_follow_poll">Értesíts, amikor egy szavazás végetér</string>
<string name="set_share_validation">Kérdezz vissza újratootolás előtt</string>
<string name="set_share_validation_fav">Megerősítés kérése kedvencekhez hozzáadás előtt</string>
<string name="set_wifi_only">Értesítés csak WiFi használatakor </string>
@ -573,7 +573,7 @@ A Yandexnek megvan a saját adatvédelmi szabályzata, ami itt található: http
<string name="channel_notif_boost">Új újratoot</string>
<string name="channel_notif_fav">Új kedvenc</string>
<string name="channel_notif_mention">Új említés</string>
<string name="channel_notif_poll">Poll Ended</string>
<string name="channel_notif_poll">A szavazás véget ért</string>
<string name="channel_notif_toot">Új toot</string>
<string name="channel_notif_backup">Tootok elmentése</string>
<string name="channel_notif_media">Média letöltése</string>
@ -797,7 +797,7 @@ A Yandexnek megvan a saját adatvédelmi szabályzata, ami itt található: http
<string name="set_retrieve_metadata_share_from_extras">Kép csatolása URL megosztásakor</string>
<!-- end languages -->
<string name="poll">Szavazás</string>
<string name="polls">Polls</string>
<string name="polls">Szavazások</string>
<string name="create_poll">Szavazás létrehozása</string>
<string name="poll_choice_1">1. lehetőség</string>
<string name="poll_choice_2">2. lehetőség</string>
@ -810,7 +810,7 @@ A Yandexnek megvan a saját adatvédelmi szabályzata, ami itt található: http
<string name="vote">Szavazás</string>
<string name="poll_not_private">Közvetlen üzenethez nem csatolhatsz szavazást!</string>
<string name="notif_poll">Véget ért egy szavazás, amiben részt vettél</string>
<string name="notif_poll_self">A poll you tooted has ended</string>
<string name="notif_poll_self">Véget ért egy szavazás, amiben részt vettél</string>
<string name="settings_category_notif_customize">Testreszabás</string>
<string name="settings_category_notif_categories">Kategóriák</string>
<string name="settings_category_notif_news">Hírek</string>
@ -829,7 +829,7 @@ A Yandexnek megvan a saját adatvédelmi szabályzata, ami itt található: http
<string name="warning_list_deletion">A lista törléséhez használd a listabejegyzést!</string>
<string name="warning_main_timeline">A fő idővonalakat csak elrejteni lehet!</string>
<string name="action_bbcode">BBCode</string>
<string name="add_timeline">Add a timeline</string>
<string name="add_timeline">Idővonal hozzáadása</string>
<plurals name="number_of_vote">
<item quantity="one">%d szavazat</item>
<item quantity="other">%d szavazat</item>

View File

@ -305,7 +305,7 @@
<string name="set_notif_follow_share">Geef een melding wanneer jouw toot is geboost</string>
<string name="set_notif_follow_add">Geef een melding wanneer jouw toot als favoriet is gemarkeerd</string>
<string name="set_notif_follow_mention">Geef een melding wanneer iemand jou vermeldt</string>
<string name="set_notif_follow_poll">Notify when a poll ended</string>
<string name="set_notif_follow_poll">Geef een melding wanneer een poll is beëindigd</string>
<string name="set_share_validation">Vraag voor het boosten een bevestiging</string>
<string name="set_share_validation_fav">Vraag voor het markeren als favoriet een bevestiging</string>
<string name="set_wifi_only">Alleen met Wifi meldingen tonen</string>
@ -576,7 +576,7 @@
<string name="channel_notif_boost">Nieuwe boost</string>
<string name="channel_notif_fav">Nieuwe favoriet</string>
<string name="channel_notif_mention">Nieuwe vermelding</string>
<string name="channel_notif_poll">Poll Ended</string>
<string name="channel_notif_poll">Poll is beëindigd</string>
<string name="channel_notif_toot">Nieuwe toot</string>
<string name="channel_notif_backup">Toots back-uppen</string>
<string name="channel_notif_media">Media downloaden</string>
@ -810,7 +810,7 @@ Je kunt beginnen met typen en er zullen namen gesuggereerd worden.\n\n
<string name="vote">Stemmen</string>
<string name="poll_not_private">Een poll kan niet aan een direct bericht worden toegevoegd!</string>
<string name="notif_poll">Een poll waarin je hebt gestemd is beëindigd</string>
<string name="notif_poll_self">A poll you tooted has ended</string>
<string name="notif_poll_self">Een poll die je hebt getoot is beëindigd</string>
<string name="settings_category_notif_customize">Aanpassen</string>
<string name="settings_category_notif_categories">Categorieën</string>
<string name="settings_category_notif_news">Nieuws</string>
@ -829,7 +829,7 @@ Je kunt beginnen met typen en er zullen namen gesuggereerd worden.\n\n
<string name="warning_list_deletion">Druk lang op de lijstnaam onder lijsten om deze lijst te verwijderen!</string>
<string name="warning_main_timeline">Hoofdtijdlijnen kunnen alleen worden verborgen!</string>
<string name="action_bbcode">BBCode</string>
<string name="add_timeline">Add a timeline</string>
<string name="add_timeline">Tijdlijn toevoegen</string>
<plurals name="number_of_vote">
<item quantity="one">%d stem</item>
<item quantity="other">%d stemmen</item>

View File

@ -820,7 +820,7 @@ Adresser vil bli foreslått når du begynner å skrive.\n\n
<string name="warning_list_deletion">Bruk listeoppføringen for å slette denne listen!</string>
<string name="warning_main_timeline">Hovedtidslinjer kan bare skjules!</string>
<string name="action_bbcode">BBCode</string>
<string name="add_timeline">Add a timeline</string>
<string name="add_timeline">Legg til tidlinje</string>
<plurals name="number_of_vote">
<item quantity="one">%d stemme</item>
<item quantity="other">%d stemmer</item>

View File

@ -828,7 +828,7 @@ Yandex 有適當的隱私權政策可以在這裡找到https://yandex.ru/l
<string name="warning_list_deletion">使用清單項目刪除此清單!</string>
<string name="warning_main_timeline">主時間軸只能被隱藏!</string>
<string name="action_bbcode">BBCode</string>
<string name="add_timeline">Add a timeline</string>
<string name="add_timeline">加入動態時報</string>
<plurals name="number_of_vote">
<item quantity="other">%d 人投票</item>
</plurals>

View File

@ -0,0 +1,9 @@
Added
* Long press on "Fetch more" will retrieve all missing statuses
* Long press on media in timelines will download them in full resolution
* Favourite video from Peertube when following an instance
Fixed
* Crashes when notifications timeline has been moved
* Media not uploaded when the filename contains some special characters
* Fix vote issue on reblogs