Merge branch 'develop'
This commit is contained in:
commit
1e4d63f174
|
@ -38,7 +38,8 @@
|
|||
<img src="./images/device-2019-02-02-114910.png" width="250">
|
||||
|
||||
|
||||
Developer: [@tom79](https://mastodon.social/@tom79)
|
||||
Lead developer: [@tom79](https://mastodon.social/@tom79)
|
||||
Developer: [@kasun](https://mastodon.social/@kasun)
|
||||
|
||||
## Backers
|
||||
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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(){
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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++;
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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) {
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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
|
Loading…
Reference in New Issue