Merge branch 'develop'

This commit is contained in:
Thomas 2022-12-15 18:26:43 +01:00
commit 2a675da7c2
31 changed files with 980 additions and 70 deletions

View file

@ -13,8 +13,8 @@ android {
defaultConfig {
minSdk 21
targetSdk 32
versionCode 446
versionName "3.11.0"
versionCode 448
versionName "3.11.2"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
flavorDimensions "default"

View file

@ -1,4 +1,9 @@
[
{
"version": "3.11.2",
"code": "448",
"note": "Added:\n- Mute/Unmute accounts in the Home timeline from their messages or their profiles\n- Add all users from a list to \"Muted home\" in one click\n- Display/Manage users that are muted for home\n\nFixed:\n- Timeline crashes"
},
{
"version": "3.11.0",
"code": "446",

View file

@ -127,6 +127,7 @@ import app.fedilab.android.client.entities.api.Status;
import app.fedilab.android.client.entities.app.Account;
import app.fedilab.android.client.entities.app.BaseAccount;
import app.fedilab.android.client.entities.app.BottomMenu;
import app.fedilab.android.client.entities.app.MutedAccounts;
import app.fedilab.android.client.entities.app.Pinned;
import app.fedilab.android.client.entities.app.PinnedTimeline;
import app.fedilab.android.client.entities.app.StatusCache;
@ -164,6 +165,7 @@ public abstract class BaseMainActivity extends BaseActivity implements NetworkSt
public static status networkAvailable = UNKNOWN;
public static Instance instanceInfo;
public static List<Filter> mainFilters;
public static List<app.fedilab.android.client.entities.api.Account> filteredAccounts;
public static boolean filterFetched;
public static boolean show_boosts, show_replies, show_art_nsfw;
public static String regex_home, regex_local, regex_public;
@ -302,7 +304,7 @@ public abstract class BaseMainActivity extends BaseActivity implements NetworkSt
} else {
BaseMainActivity.currentToken = sharedpreferences.getString(Helper.PREF_USER_TOKEN, null);
}
filteredAccounts = new ArrayList<>();
mamageNewIntent(getIntent());
filterFetched = false;
networkStateReceiver = new NetworkStateReceiver();
@ -565,6 +567,10 @@ public abstract class BaseMainActivity extends BaseActivity implements NetworkSt
currentAccount = new Account(BaseMainActivity.this).getConnectedAccount();
//Delete cache older than 7 days
new StatusCache(BaseMainActivity.this).deleteForAllAccountAfter7Days();
MutedAccounts mutedAccounts = new MutedAccounts(BaseMainActivity.this).getMutedAccount(currentAccount);
if (mutedAccounts != null && mutedAccounts.accounts != null) {
filteredAccounts = mutedAccounts.accounts;
}
} catch (DBException e) {
e.printStackTrace();
}

View file

@ -54,11 +54,12 @@ public class ActionActivity extends BaseBarActivity {
binding.muted.setOnClickListener(v -> displayTimeline(Timeline.TimeLineEnum.MUTED_TIMELINE));
binding.blocked.setOnClickListener(v -> displayTimeline(Timeline.TimeLineEnum.BLOCKED_TIMELINE));
binding.domainBlock.setOnClickListener(v -> displayTimeline(Timeline.TimeLineEnum.BLOCKED_DOMAIN_TIMELINE));
binding.mutedHome.setOnClickListener(v -> displayTimeline(Timeline.TimeLineEnum.MUTED_TIMELINE_HOME));
}
private void displayTimeline(Timeline.TimeLineEnum type) {
canGoBack = true;
if (type == Timeline.TimeLineEnum.MUTED_TIMELINE || type == Timeline.TimeLineEnum.BLOCKED_TIMELINE) {
if (type == Timeline.TimeLineEnum.MUTED_TIMELINE || type == Timeline.TimeLineEnum.BLOCKED_TIMELINE || type == Timeline.TimeLineEnum.MUTED_TIMELINE_HOME) {
ThemeHelper.slideViewsToLeft(binding.buttonContainer, binding.fragmentContainer, () -> {
fragmentMastodonAccount = new FragmentMastodonAccount();
@ -114,6 +115,9 @@ public class ActionActivity extends BaseBarActivity {
case BLOCKED_DOMAIN_TIMELINE:
setTitle(R.string.blocked_domains);
break;
case MUTED_TIMELINE_HOME:
setTitle(R.string.muted_menu_home);
break;
}
}

View file

@ -143,6 +143,22 @@ public class MastodonListActivity extends BaseBarActivity implements MastodonLis
if (item.getItemId() == android.R.id.home) {
onBackPressed();
return true;
} else if (item.getItemId() == R.id.action_user_mute_home) {
AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(MastodonListActivity.this, Helper.dialogStyle());
dialogBuilder.setTitle(R.string.put_all_accounts_in_home_muted);
dialogBuilder.setPositiveButton(R.string.mute_them_all, (dialog, id) -> {
timelinesVM.getAccountsInList(BaseMainActivity.currentInstance, BaseMainActivity.currentToken, mastodonList.id, null, null, 0)
.observe(MastodonListActivity.this, accounts -> {
if (accounts != null && accounts.size() > 0) {
for (Account account : accounts) {
accountsVM.muteHome(MainActivity.currentAccount, account);
}
}
});
dialog.dismiss();
});
dialogBuilder.setNegativeButton(R.string.cancel, (dialog, id) -> dialog.dismiss());
dialogBuilder.show();
} else if (item.getItemId() == R.id.action_manage_users) {
AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(MastodonListActivity.this, Helper.dialogStyle());
PopupManageAccountsListBinding popupManageAccountsListBinding = PopupManageAccountsListBinding.inflate(getLayoutInflater());

View file

@ -117,6 +117,7 @@ public class ProfileActivity extends BaseActivity {
private String mention_str;
private WellKnownNodeinfo.NodeInfo nodeInfo;
private boolean checkRemotely;
private boolean homeMuted;
private final BroadcastReceiver broadcast_data = new BroadcastReceiver() {
@Override
@ -144,6 +145,7 @@ public class ProfileActivity extends BaseActivity {
Bundle b = getIntent().getExtras();
binding.accountFollow.setEnabled(false);
checkRemotely = false;
homeMuted = false;
if (b != null) {
account = (Account) b.getSerializable(Helper.ARG_ACCOUNT);
account_id = b.getString(Helper.ARG_USER_ID, null);
@ -185,6 +187,8 @@ public class ProfileActivity extends BaseActivity {
Toasty.error(ProfileActivity.this, getString(R.string.toast_error), Toast.LENGTH_LONG).show();
finish();
}
//Check if account is homeMuted
accountsVM.isMuted(currentAccount, account).observe(this, result -> homeMuted = result != null && result);
LocalBroadcastManager.getInstance(ProfileActivity.this).registerReceiver(broadcast_data, new IntentFilter(Helper.BROADCAST_DATA));
}
@ -685,9 +689,11 @@ public class ProfileActivity extends BaseActivity {
menu.findItem(R.id.action_endorse).setVisible(false);
menu.findItem(R.id.action_direct_message).setVisible(false);
menu.findItem(R.id.action_add_to_list).setVisible(false);
menu.findItem(R.id.action_mute_home).setVisible(false);
} else {
menu.findItem(R.id.action_block).setVisible(true);
menu.findItem(R.id.action_mute).setVisible(true);
menu.findItem(R.id.action_mute_home).setVisible(true);
menu.findItem(R.id.action_timed_mute).setVisible(true);
menu.findItem(R.id.action_mention).setVisible(true);
}
@ -696,6 +702,7 @@ public class ProfileActivity extends BaseActivity {
if (!relationship.following) {
menu.findItem(R.id.action_hide_boost).setVisible(false);
menu.findItem(R.id.action_endorse).setVisible(false);
menu.findItem(R.id.action_mute_home).setVisible(false);
}
if (relationship.blocking) {
menu.findItem(R.id.action_block).setTitle(R.string.action_unblock);
@ -713,6 +720,11 @@ public class ProfileActivity extends BaseActivity {
} else {
menu.findItem(R.id.action_hide_boost).setTitle(getString(R.string.show_boost, account.username));
}
if (homeMuted) {
menu.findItem(R.id.action_mute_home).setTitle(getString(R.string.unmute_home));
} else {
menu.findItem(R.id.action_mute_home).setTitle(getString(R.string.mute_home));
}
}
}
return true;
@ -989,6 +1001,28 @@ public class ProfileActivity extends BaseActivity {
});
builderInner.show();
}
} else if (itemId == R.id.action_mute_home) {
AlertDialog.Builder builderInner = new AlertDialog.Builder(ProfileActivity.this, Helper.dialogStyle());
builderInner.setMessage(account.acct);
builderInner.setNeutralButton(R.string.cancel, (dialog, which) -> dialog.dismiss());
if (homeMuted) {
builderInner.setTitle(R.string.unmute_home);
builderInner.setPositiveButton(R.string.action_unmute, (dialog, which) -> accountsVM.unmuteHome(currentAccount, account)
.observe(ProfileActivity.this, account -> {
homeMuted = false;
invalidateOptionsMenu();
Toasty.info(ProfileActivity.this, getString(R.string.toast_unmute), Toasty.LENGTH_LONG).show();
}));
} else {
builderInner.setTitle(R.string.mute_home);
builderInner.setPositiveButton(R.string.action_mute, (dialog, which) -> accountsVM.muteHome(currentAccount, account)
.observe(ProfileActivity.this, account -> {
homeMuted = true;
invalidateOptionsMenu();
Toasty.info(ProfileActivity.this, getString(R.string.toast_mute), Toasty.LENGTH_LONG).show();
}));
}
builderInner.show();
} else if (itemId == R.id.action_timed_mute) {
MastodonHelper.scheduleBoost(ProfileActivity.this, MastodonHelper.ScheduleType.TIMED_MUTED, null, account, rs -> {
this.relationship = rs;

View file

@ -19,6 +19,8 @@ import android.content.Context;
import android.text.Spannable;
import android.view.View;
import androidx.annotation.Nullable;
import com.google.gson.annotations.SerializedName;
import java.io.Serializable;
@ -148,4 +150,14 @@ public class Account implements Serializable {
public LinkedHashMap<Integer, Field.FieldParams> fields;
}
@Override
public boolean equals(@Nullable Object obj) {
boolean same = false;
if (obj instanceof Account) {
same = this.id.equals(((Account) obj).id);
}
return same;
}
}

View file

@ -0,0 +1,249 @@
package app.fedilab.android.client.entities.app;
/* Copyright 2022 Thomas Schneider
*
* This file is a part of Fedilab
*
* This program is free software; you can redistribute it and/or modify it under the terms of the
* GNU General Public License as published by the Free Software Foundation; either version 3 of the
* License, or (at your option) any later version.
*
* Fedilab is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
* the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
* Public License for more details.
*
* You should have received a copy of the GNU General Public License along with Fedilab; if not,
* see <http://www.gnu.org/licenses>. */
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import com.google.gson.Gson;
import com.google.gson.annotations.SerializedName;
import com.google.gson.reflect.TypeToken;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import app.fedilab.android.client.entities.api.Account;
import app.fedilab.android.exception.DBException;
import app.fedilab.android.sqlite.Sqlite;
public class MutedAccounts implements Serializable {
private transient final SQLiteDatabase db;
@SerializedName("id")
public long id = -1;
@SerializedName("instance")
public String instance;
@SerializedName("user_id")
public String user_id;
@SerializedName("type")
public Timeline.TimeLineEnum type;
@SerializedName("accounts")
public List<Account> accounts;
public MutedAccounts() {
db = null;
}
public MutedAccounts(Context context) {
//Creation of the DB with tables
this.db = Sqlite.getInstance(context.getApplicationContext(), Sqlite.DB_NAME, null, Sqlite.DB_VERSION).open();
}
/**
* Serialized a list of BaseAccount class
*
* @param accounts List of {@link Account} to serialize
* @return String serialized emoji list
*/
public static String accountListToStringStorage(List<Account> accounts) {
Gson gson = new Gson();
try {
return gson.toJson(accounts);
} catch (Exception e) {
return null;
}
}
/**
* Unserialized a BaseAccount List
*
* @param serializedAccounts String serialized BaseAccount list
* @return List of {@link Account}
*/
public static List<Account> restoreAccountsFromString(String serializedAccounts) {
Gson gson = new Gson();
try {
return gson.fromJson(serializedAccounts, new TypeToken<List<Account>>() {
}.getType());
} catch (Exception e) {
return null;
}
}
public void delete() {
db.delete(Sqlite.TABLE_MUTED, null, null);
}
/**
* Insert an Account in muted account in db
*
* @param forAccount {@link BaseAccount}
* @param target {@link Account}
* @return long - db id
* @throws DBException exception with database
*/
public long muteAccount(BaseAccount forAccount, Account target) throws DBException {
if (db == null) {
throw new DBException("db is null. Wrong initialization.");
}
boolean insert = false;
MutedAccounts mutedAccounts = getMutedAccount(forAccount);
ContentValues values = new ContentValues();
if (mutedAccounts == null) {
mutedAccounts = new MutedAccounts();
mutedAccounts.accounts = new ArrayList<>();
mutedAccounts.type = Timeline.TimeLineEnum.HOME;
values.put(Sqlite.COL_INSTANCE, forAccount.instance);
values.put(Sqlite.COL_USER_ID, forAccount.user_id);
insert = true;
values.put(Sqlite.COL_TYPE, mutedAccounts.type.getValue());
} else if (mutedAccounts.accounts == null) {
mutedAccounts.accounts = new ArrayList<>();
}
if (!mutedAccounts.accounts.contains(target)) {
mutedAccounts.accounts.add(target);
}
values.put(Sqlite.COL_MUTED_ACCOUNTS, accountListToStringStorage(mutedAccounts.accounts));
//Inserts or updates
try {
if (insert) {
return db.insertOrThrow(Sqlite.TABLE_MUTED, null, values);
} else {
return db.update(Sqlite.TABLE_MUTED,
values, Sqlite.COL_USER_ID + " = ? AND " + Sqlite.COL_INSTANCE + " = ?",
new String[]{forAccount.user_id, forAccount.instance});
}
} catch (Exception e) {
e.printStackTrace();
return -1;
}
}
/**
* Remove an Account in muted account in db
*
* @param forAccount {@link BaseAccount}
* @param target {@link Account}
* @return long - db id
* @throws DBException exception with database
*/
public long unMuteAccount(BaseAccount forAccount, Account target) throws DBException {
if (db == null) {
throw new DBException("db is null. Wrong initialization.");
}
boolean insert = false;
MutedAccounts mutedAccounts = getMutedAccount(forAccount);
ContentValues values = new ContentValues();
if (mutedAccounts == null) {
mutedAccounts = new MutedAccounts();
mutedAccounts.accounts = new ArrayList<>();
mutedAccounts.type = Timeline.TimeLineEnum.HOME;
values.put(Sqlite.COL_INSTANCE, forAccount.instance);
values.put(Sqlite.COL_USER_ID, forAccount.user_id);
insert = true;
values.put(Sqlite.COL_TYPE, mutedAccounts.type.getValue());
} else if (mutedAccounts.accounts == null) {
mutedAccounts.accounts = new ArrayList<>();
}
mutedAccounts.accounts.remove(target);
values.put(Sqlite.COL_MUTED_ACCOUNTS, accountListToStringStorage(mutedAccounts.accounts));
//Inserts or updates
try {
if (insert) {
return db.insertOrThrow(Sqlite.TABLE_MUTED, null, values);
} else {
return db.update(Sqlite.TABLE_MUTED,
values, Sqlite.COL_USER_ID + " = ? AND " + Sqlite.COL_INSTANCE + " = ?",
new String[]{forAccount.user_id, forAccount.instance});
}
} catch (Exception e) {
e.printStackTrace();
return -1;
}
}
/**
* Check if an account is muted in db
*
* @param forAccount {@link BaseAccount}
* @param target {@link Account}
* @return MutedAccounts - {@link MutedAccounts}
*/
public boolean isMuted(BaseAccount forAccount, Account target) throws DBException {
if (db == null) {
throw new DBException("db is null. Wrong initialization.");
}
MutedAccounts mutedAccounts = getMutedAccount(forAccount);
if (mutedAccounts != null && mutedAccounts.accounts != null) {
for (Account account : mutedAccounts.accounts) {
if (account.id.equals(target.id)) {
return true;
}
}
}
return false;
}
/**
* Returns the MutedAccounts for an account
*
* @param account Account
* @return MutedAccounts - {@link MutedAccounts}
*/
public MutedAccounts getMutedAccount(BaseAccount account) throws DBException {
if (db == null) {
throw new DBException("db is null. Wrong initialization.");
}
try {
Cursor c = db.query(Sqlite.TABLE_MUTED, null, Sqlite.COL_INSTANCE + " = '" + account.instance + "' AND " + Sqlite.COL_USER_ID + " = '" + account.user_id + "'", null, null, null, null, "1");
return convertCursorToMuted(c);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
/**
* Read cursor and hydrate without closing it
*
* @param c - Cursor
* @return MutedAccounts
*/
private MutedAccounts convertCursorToMuted(Cursor c) {
if (c.getCount() == 0) {
c.close();
return null;
}
//Take the first element
c.moveToFirst();
MutedAccounts mutedAccounts = new MutedAccounts();
mutedAccounts.id = c.getInt(c.getColumnIndexOrThrow(Sqlite.COL_ID));
mutedAccounts.instance = c.getString(c.getColumnIndexOrThrow(Sqlite.COL_INSTANCE));
mutedAccounts.user_id = c.getString(c.getColumnIndexOrThrow(Sqlite.COL_USER_ID));
mutedAccounts.accounts = restoreAccountsFromString(c.getString(c.getColumnIndexOrThrow(Sqlite.COL_MUTED_ACCOUNTS)));
mutedAccounts.type = Timeline.TimeLineEnum.valueOf(c.getString(c.getColumnIndexOrThrow(Sqlite.COL_TYPE)));
c.close();
return mutedAccounts;
}
}

View file

@ -388,6 +388,8 @@ public class Timeline {
ACCOUNT_TIMELINE("ACCOUNT_TIMELINE"),
@SerializedName("MUTED_TIMELINE")
MUTED_TIMELINE("MUTED_TIMELINE"),
@SerializedName("MUTED_TIMELINE_HOME")
MUTED_TIMELINE_HOME("MUTED_TIMELINE_HOME"),
@SerializedName("BOOKMARK_TIMELINE")
BOOKMARK_TIMELINE("BOOKMARK_TIMELINE"),
@SerializedName("BLOCKED_DOMAIN_TIMELINE")

View file

@ -1953,4 +1953,19 @@ public class Helper {
public interface OnAttachmentCopied {
void onAttachmentCopied(Attachment attachment);
}
public static void addMutedAccount(app.fedilab.android.client.entities.api.Account target) {
if (MainActivity.filteredAccounts == null) {
MainActivity.filteredAccounts = new ArrayList<>();
}
if (!MainActivity.filteredAccounts.contains(target)) {
MainActivity.filteredAccounts.add(target);
}
}
public static void removeMutedAccount(app.fedilab.android.client.entities.api.Account target) {
if (MainActivity.filteredAccounts != null) {
MainActivity.filteredAccounts.remove(target);
}
}
}

View file

@ -494,7 +494,9 @@ public class SpannableHelper {
contentUrl = new SpannableString(Html.fromHtml(value, Html.FROM_HTML_MODE_LEGACY));
else
contentUrl = new SpannableString(Html.fromHtml(value));
if (contentUrl.toString().trim().isEmpty()) {
continue;
}
Pattern word = Pattern.compile(Pattern.quote(contentUrl.toString()));
Matcher matcherLink = word.matcher(content);
while (matcherLink.find()) {

View file

@ -14,6 +14,8 @@ package app.fedilab.android.helper;
* You should have received a copy of the GNU General Public License along with Fedilab; if not,
* see <http://www.gnu.org/licenses>. */
import static app.fedilab.android.BaseMainActivity.filteredAccounts;
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
@ -35,6 +37,7 @@ import java.util.regex.Pattern;
import app.fedilab.android.BaseMainActivity;
import app.fedilab.android.activities.MainActivity;
import app.fedilab.android.client.endpoints.MastodonFiltersService;
import app.fedilab.android.client.entities.api.Account;
import app.fedilab.android.client.entities.api.Filter;
import app.fedilab.android.client.entities.api.Notification;
import app.fedilab.android.client.entities.api.Status;
@ -90,6 +93,7 @@ public class TimelineHelper {
}
}
}
//If there are filters:
if (BaseMainActivity.mainFilters != null && BaseMainActivity.mainFilters.size() > 0 && statuses != null && statuses.size() > 0) {
@ -143,6 +147,23 @@ public class TimelineHelper {
Matcher ms = p.matcher(spoilerText);
if (ms.find()) {
status.filteredByApp = filter;
continue;
}
}
if (filterTimeLineType == Timeline.TimeLineEnum.HOME) {
if (filteredAccounts != null && filteredAccounts.size() > 0) {
for (Account account : filteredAccounts) {
if (account.acct.equals(status.account.acct) || (status.reblog != null && account.acct.equals(status.reblog.account.acct))) {
Filter filterCustom = new Filter();
filterCustom.filter_action = "hide";
ArrayList<String> contextCustom = new ArrayList<>();
contextCustom.add("home");
filterCustom.title = "Fedilab";
filterCustom.context = contextCustom;
status.filteredByApp = filterCustom;
}
}
}
}
}

View file

@ -23,7 +23,7 @@ import android.database.sqlite.SQLiteOpenHelper;
public class Sqlite extends SQLiteOpenHelper {
public static final int DB_VERSION = 7;
public static final int DB_VERSION = 8;
public static final String DB_NAME = "fedilab_db";
//Table of owned accounts
@ -84,6 +84,9 @@ public class Sqlite extends SQLiteOpenHelper {
//Tracking domains
public static final String TABLE_DOMAINS_TRACKING = "TABLE_DOMAINS_TRACKING";
public static final String COL_DOMAIN = "DOMAIN";
//Muted accounts for home
public static final String TABLE_MUTED = "TABLE_MUTED";
public static final String COL_MUTED_ACCOUNTS = "MUTED_ACCOUNTS";
private static final String CREATE_TABLE_USER_ACCOUNT = "CREATE TABLE " + TABLE_USER_ACCOUNT + " ("
+ COL_USER_ID + " TEXT NOT NULL, "
@ -177,6 +180,14 @@ public class Sqlite extends SQLiteOpenHelper {
+ COL_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, "
+ COL_DOMAIN + " TEXT NOT NULL)";
private static final String CREATE_TABLE_MUTED = "CREATE TABLE IF NOT EXISTS " + TABLE_MUTED + " ("
+ COL_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, "
+ COL_INSTANCE + " TEXT NOT NULL, "
+ COL_USER_ID + " TEXT NOT NULL, "
+ COL_TYPE + " TEXT NOT NULL, "
+ COL_MUTED_ACCOUNTS + " TEXT)";
public static SQLiteDatabase db;
private static Sqlite sInstance;
@ -205,6 +216,7 @@ public class Sqlite extends SQLiteOpenHelper {
db.execSQL(CREATE_TABLE_SCHEDULE_BOOST);
db.execSQL(CREATE_TABLE_BOTTOM_MENU);
db.execSQL(CREATE_DOMAINS_TRACKING);
db.execSQL(CREATE_TABLE_MUTED);
}
@Override
@ -229,6 +241,8 @@ public class Sqlite extends SQLiteOpenHelper {
db.execSQL("DROP TABLE IF EXISTS " + TABLE_QUICK_LOAD);
case 6:
db.execSQL("DROP TABLE IF EXISTS " + TABLE_DOMAINS_TRACKING);
case 7:
db.execSQL(CREATE_TABLE_MUTED);
default:
break;
}

View file

@ -42,6 +42,7 @@ import java.util.List;
import app.fedilab.android.BaseMainActivity;
import app.fedilab.android.R;
import app.fedilab.android.activities.MainActivity;
import app.fedilab.android.activities.ProfileActivity;
import app.fedilab.android.client.entities.api.Account;
import app.fedilab.android.databinding.DrawerAccountBinding;
@ -56,12 +57,19 @@ public class AccountAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder
private final List<Account> accountList;
private Context context;
private final boolean home_mute;
public AccountAdapter(List<Account> accountList, boolean home_mute) {
this.accountList = accountList;
this.home_mute = home_mute;
}
public AccountAdapter(List<Account> accountList) {
this.accountList = accountList;
this.home_mute = false;
}
public static void accountManagement(Context context, AccountViewHolder accountViewHolder, Account account, int position, RecyclerView.Adapter<RecyclerView.ViewHolder> adapter) {
public static void accountManagement(Context context, AccountViewHolder accountViewHolder, Account account, int position, RecyclerView.Adapter<RecyclerView.ViewHolder> adapter, boolean home_mute) {
MastodonHelper.loadPPMastodon(accountViewHolder.binding.avatar, account);
SharedPreferences sharedpreferences = PreferenceManager.getDefaultSharedPreferences(context);
@ -73,6 +81,21 @@ public class AccountAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder
accountViewHolder.binding.dividerCard.setVisibility(View.GONE);
}
if (home_mute) {
accountViewHolder.binding.muteHome.setVisibility(View.VISIBLE);
boolean muted = MainActivity.filteredAccounts != null && MainActivity.filteredAccounts.contains(account);
accountViewHolder.binding.muteHome.setChecked(muted);
accountViewHolder.binding.muteHome.setOnClickListener(v -> {
if (muted) {
accountsVM.unmuteHome(MainActivity.currentAccount, account).observe((LifecycleOwner) context, account1 -> adapter.notifyItemChanged(accountViewHolder.getLayoutPosition()));
} else {
accountsVM.muteHome(MainActivity.currentAccount, account).observe((LifecycleOwner) context, account1 -> adapter.notifyItemChanged(accountViewHolder.getLayoutPosition()));
}
});
} else {
accountViewHolder.binding.muteHome.setVisibility(View.GONE);
}
accountViewHolder.binding.avatar.setOnClickListener(v -> {
Intent intent = new Intent(context, ProfileActivity.class);
Bundle b = new Bundle();
@ -263,7 +286,7 @@ public class AccountAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int position) {
Account account = accountList.get(position);
AccountViewHolder holder = (AccountViewHolder) viewHolder;
accountManagement(context, holder, account, position, this);
accountManagement(context, holder, account, position, this, home_mute);
}

View file

@ -1655,6 +1655,16 @@ public class StatusAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>
Toasty.info(context, context.getString(R.string.toast_mute), Toasty.LENGTH_LONG).show();
}));
builderInner.show();
} else if (itemId == R.id.action_mute_home) {
AlertDialog.Builder builderInner = new AlertDialog.Builder(context, Helper.dialogStyle());
builderInner.setTitle(R.string.mute_home);
builderInner.setMessage(statusToDeal.account.acct);
builderInner.setNeutralButton(R.string.cancel, (dialog, which) -> dialog.dismiss());
builderInner.setPositiveButton(R.string.action_mute, (dialog, which) -> accountsVM.muteHome(currentAccount, statusToDeal.account)
.observe((LifecycleOwner) context, account -> {
Toasty.info(context, context.getString(R.string.toast_mute), Toasty.LENGTH_LONG).show();
}));
builderInner.show();
} else if (itemId == R.id.action_mute_conversation) {
if (statusToDeal.muted) {
statusesVM.unMute(BaseMainActivity.currentInstance, BaseMainActivity.currentToken, statusToDeal.id).observe((LifecycleOwner) context, status1 -> Toasty.info(context, context.getString(R.string.toast_unmute_conversation)).show());

View file

@ -92,7 +92,7 @@ public class FragmentMedia extends Fragment {
return;
}
canSwipe = (binding.mediaPicture.getScale() == 1);
if (!canSwipe) {
if (!canSwipe && !requireActivity().isFinishing() && isAdded()) {
if (!((MediaActivity) requireActivity()).getFullScreen()) {
((MediaActivity) requireActivity()).setFullscreen(true);
}

View file

@ -32,6 +32,7 @@ import java.util.List;
import app.fedilab.android.BaseMainActivity;
import app.fedilab.android.R;
import app.fedilab.android.activities.MainActivity;
import app.fedilab.android.client.entities.api.Account;
import app.fedilab.android.client.entities.api.Accounts;
import app.fedilab.android.client.entities.api.Pagination;
@ -128,6 +129,11 @@ public class FragmentMastodonAccount extends Fragment {
accountsVM.getMutes(BaseMainActivity.currentInstance, BaseMainActivity.currentToken, String.valueOf(MastodonHelper.accountsPerCall(requireActivity())), max_id, null)
.observe(getViewLifecycleOwner(), this::dealWithPagination);
}
} else if (timelineType == Timeline.TimeLineEnum.MUTED_TIMELINE_HOME) {
if (firstLoad) {
accountsVM.getMutedHome(MainActivity.currentAccount)
.observe(getViewLifecycleOwner(), this::initializeAccountCommonView);
}
} else if (timelineType == Timeline.TimeLineEnum.BLOCKED_TIMELINE) {
if (firstLoad) {
accountsVM.getBlocks(BaseMainActivity.currentInstance, BaseMainActivity.currentToken, String.valueOf(MastodonHelper.accountsPerCall(requireActivity())), null, null)
@ -197,7 +203,7 @@ public class FragmentMastodonAccount extends Fragment {
}
this.accounts = accounts.accounts;
accountAdapter = new AccountAdapter(this.accounts);
accountAdapter = new AccountAdapter(this.accounts, timelineType == Timeline.TimeLineEnum.MUTED_TIMELINE_HOME);
flagLoading = accounts.pagination.max_id == null;
LinearLayoutManager mLayoutManager = new LinearLayoutManager(requireActivity());
binding.recyclerView.setLayoutManager(mLayoutManager);

View file

@ -14,6 +14,8 @@ package app.fedilab.android.viewmodel.mastodon;
* You should have received a copy of the GNU General Public License along with Fedilab; if not,
* see <http://www.gnu.org/licenses>. */
import static app.fedilab.android.helper.Helper.addMutedAccount;
import static app.fedilab.android.helper.Helper.removeMutedAccount;
import static app.fedilab.android.ui.drawer.StatusAdapter.sendAction;
import android.app.Application;
@ -52,7 +54,10 @@ import app.fedilab.android.client.entities.api.Suggestion;
import app.fedilab.android.client.entities.api.Suggestions;
import app.fedilab.android.client.entities.api.Tag;
import app.fedilab.android.client.entities.api.Token;
import app.fedilab.android.client.entities.app.BaseAccount;
import app.fedilab.android.client.entities.app.MutedAccounts;
import app.fedilab.android.client.entities.app.StatusCache;
import app.fedilab.android.exception.DBException;
import app.fedilab.android.helper.Helper;
import app.fedilab.android.helper.MastodonHelper;
import okhttp3.MultipartBody;
@ -92,6 +97,8 @@ public class AccountsVM extends AndroidViewModel {
private MutableLiveData<Token> tokenMutableLiveData;
private MutableLiveData<Domains> domainsMutableLiveData;
private MutableLiveData<Report> reportMutableLiveData;
private MutableLiveData<Boolean> booleanMutableLiveData;
public AccountsVM(@NonNull Application application) {
super(application);
@ -748,6 +755,100 @@ public class AccountsVM extends AndroidViewModel {
return relationShipMutableLiveData;
}
/**
* Mute the given account in db
*
* @return {@link LiveData} containing the {@link Account} to the given account
*/
public LiveData<Accounts> getMutedHome(@NonNull BaseAccount forAccount) {
accountsMutableLiveData = new MutableLiveData<>();
new Thread(() -> {
Accounts accounts = new Accounts();
MutedAccounts mutedAccount;
try {
mutedAccount = new MutedAccounts(getApplication().getApplicationContext()).getMutedAccount(forAccount);
if (mutedAccount != null) {
accounts.accounts = mutedAccount.accounts;
}
accounts.pagination = new Pagination();
} catch (DBException e) {
e.printStackTrace();
}
Handler mainHandler = new Handler(Looper.getMainLooper());
Runnable myRunnable = () -> accountsMutableLiveData.setValue(accounts);
mainHandler.post(myRunnable);
}).start();
return accountsMutableLiveData;
}
/**
* Mute the given account in db
*
* @return {@link LiveData} containing the {@link Account} to the given account
*/
public LiveData<Boolean> isMuted(@NonNull BaseAccount forAccount, @NonNull Account target) {
booleanMutableLiveData = new MutableLiveData<>();
new Thread(() -> {
boolean isMuted = false;
try {
isMuted = new MutedAccounts(getApplication().getApplicationContext()).isMuted(forAccount, target);
} catch (DBException e) {
e.printStackTrace();
}
Handler mainHandler = new Handler(Looper.getMainLooper());
boolean finalIsMuted = isMuted;
Runnable myRunnable = () -> booleanMutableLiveData.setValue(finalIsMuted);
mainHandler.post(myRunnable);
}).start();
return booleanMutableLiveData;
}
/**
* Mute the given account in db
*
* @return {@link LiveData} containing the {@link Account} to the given account
*/
public LiveData<Account> muteHome(@NonNull BaseAccount forAccount, @NonNull Account target) {
accountMutableLiveData = new MutableLiveData<>();
new Thread(() -> {
try {
new MutedAccounts(getApplication().getApplicationContext()).muteAccount(forAccount, target);
addMutedAccount(target);
} catch (DBException e) {
e.printStackTrace();
}
Handler mainHandler = new Handler(Looper.getMainLooper());
sendAction(getApplication().getApplicationContext(), Helper.ARG_STATUS_ACCOUNT_ID_DELETED, null, target.id);
Runnable myRunnable = () -> accountMutableLiveData.setValue(target);
mainHandler.post(myRunnable);
}).start();
return accountMutableLiveData;
}
/**
* Unmute the given account in db
*
* @return {@link LiveData} containing the {@link Account} to the given account
*/
public LiveData<Account> unmuteHome(@NonNull BaseAccount forAccount, @NonNull Account target) {
accountMutableLiveData = new MutableLiveData<>();
new Thread(() -> {
try {
new MutedAccounts(getApplication().getApplicationContext()).unMuteAccount(forAccount, target);
removeMutedAccount(target);
} catch (DBException e) {
e.printStackTrace();
}
Handler mainHandler = new Handler(Looper.getMainLooper());
Runnable myRunnable = () -> accountMutableLiveData.setValue(target);
mainHandler.post(myRunnable);
}).start();
return accountMutableLiveData;
}
/**
* Unmute the given account.
*

View file

@ -12,12 +12,27 @@
android:orientation="vertical"
android:padding="24dp">
<com.google.android.material.button.MaterialButton
android:id="@+id/bookmarks"
style="@style/Widget.Material3.Button.OutlinedButton"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingVertical="12dp"
android:text="@string/bookmarks"
android:textAlignment="textStart"
android:textColor="?attr/colorAccent"
app:icon="@drawable/ic_baseline_navigate_next_24"
app:iconGravity="end"
app:iconTint="?attr/colorAccent"
app:strokeColor="?attr/colorAccent" />
<com.google.android.material.button.MaterialButton
android:id="@+id/muted"
style="@style/Widget.Material3.Button.OutlinedButton"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingVertical="12dp"
android:layout_marginTop="24dp"
android:text="@string/muted_menu"
android:textAlignment="textStart"
android:textColor="?attr/colorAccent"
@ -26,6 +41,21 @@
app:iconTint="?attr/colorAccent"
app:strokeColor="?attr/colorAccent" />
<com.google.android.material.button.MaterialButton
android:id="@+id/muted_home"
style="@style/Widget.Material3.Button.OutlinedButton"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="24dp"
android:paddingVertical="12dp"
android:text="@string/muted_menu_home"
android:textAlignment="textStart"
android:textColor="?attr/colorAccent"
app:icon="@drawable/ic_baseline_navigate_next_24"
app:iconGravity="end"
app:iconTint="?attr/colorAccent"
app:strokeColor="?attr/colorAccent" />
<com.google.android.material.button.MaterialButton
android:id="@+id/blocked"
style="@style/Widget.Material3.Button.OutlinedButton"
@ -41,20 +71,6 @@
app:iconTint="?attr/colorAccent"
app:strokeColor="?attr/colorAccent" />
<com.google.android.material.button.MaterialButton
android:id="@+id/bookmarks"
style="@style/Widget.Material3.Button.OutlinedButton"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="24dp"
android:paddingVertical="12dp"
android:text="@string/bookmarks"
android:textAlignment="textStart"
android:textColor="?attr/colorAccent"
app:icon="@drawable/ic_baseline_navigate_next_24"
app:iconGravity="end"
app:iconTint="?attr/colorAccent"
app:strokeColor="?attr/colorAccent" />
<com.google.android.material.button.MaterialButton
android:id="@+id/favourites"

View file

@ -2,8 +2,8 @@
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="@dimen/fab_margin">
android:layout_marginHorizontal="6dp"
android:orientation="vertical">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recycler_view"

View file

@ -116,6 +116,18 @@
app:iconPadding="0dp"
app:strokeWidth="1dp" />
<com.google.android.material.button.MaterialButton
android:id="@+id/mute_home"
style="@style/Widget.Material3.Button.OutlinedButton"
android:layout_width="48dp"
android:layout_height="48dp"
android:padding="0dp"
android:visibility="gone"
app:icon="@drawable/ic_baseline_home_24"
app:iconGravity="textStart"
app:iconPadding="0dp"
app:strokeWidth="1dp" />
<com.google.android.material.button.MaterialButton
android:id="@+id/mute_timed"
style="@style/Widget.Material3.Button.OutlinedButton"

View file

@ -16,6 +16,11 @@
android:icon="@drawable/ic_baseline_open_with_24"
android:title="@string/action_open_in_web"
app:showAsAction="never" />
<item
android:id="@+id/action_mute_home"
android:icon="@drawable/ic_baseline_volume_mute_24"
android:title="@string/mute_home"
app:showAsAction="never" />
<item
android:id="@+id/action_mute"
android:icon="@drawable/ic_baseline_volume_mute_24"

View file

@ -11,6 +11,11 @@
android:icon="@drawable/ic_baseline_edit_note_24"
android:title="@string/action_lists_edit"
app:showAsAction="ifRoom" />
<item
android:id="@+id/action_user_mute_home"
android:icon="@drawable/ic_baseline_volume_mute_24"
android:title="@string/add_all_users_home_muted"
app:showAsAction="ifRoom" />
<item
android:id="@+id/action_delete"
android:icon="@drawable/ic_baseline_delete_24"

View file

@ -46,6 +46,10 @@
android:id="@+id/action_mute"
android:title="@string/more_action_1"
app:showAsAction="never" />
<item
android:id="@+id/action_mute_home"
android:title="@string/mute_home"
app:showAsAction="never" />
<item
android:id="@+id/action_timed_mute"
android:title="@string/more_action_8"

View file

@ -159,9 +159,11 @@
<string name="toot_scheduled">Zpráva byla naplánována!</string>
<string name="toot_scheduled_date">Plánované datum musí být vyšší než aktuální hodina!</string>
<!-- timed mute -->
<string name="timed_mute_date_error">Časový interval pro ztlumení musí být vyšší než jedna minuta.</string>
<string name="timed_mute_date">%1$s byl ztlumen až do %2$s. \n Ztišení účtu můžete zrušit z jeho/její profilové stránky.</string>
<string name="timed_mute_profile">%1$s je ztlumen do %2$s. \n Klikněte zde pro zrušení ztišení.</string>
<string name="timed_mute_date_error">Časový interval pro ztlumení musí být delší než jedna minuta.</string>
<string name="timed_mute_date">%1$s byl ztlumen až do %2$s.
\n Ztlumení účtu můžete zrušit z jeho/její profilové stránky.</string>
<string name="timed_mute_profile">%1$s je ztlumen do %2$s.
\n Klikněte zde pro zrušení ztlumení.</string>
<!-- Notifications -->
<string name="no_notifications">Žádné upozornění k zobrazení</string>
<string name="notif_mention">vás zmínil(a)</string>
@ -194,7 +196,7 @@
<string name="nothing_to_do">Nelze vykonat akci</string>
<string name="toast_error_translate">Při překladu došlo k chybě!</string>
<!-- Settings -->
<string name="set_toots_page">Počet zpráv pro jedno nahrá</string>
<string name="set_toots_page">Počet zpráv pro jedno načte</string>
<string name="set_disable_gif">Zakázat GIF avatary</string>
<string name="set_notif_follow">Upozornit, když vás někdo začne sledovat</string>
<string name="set_notif_follow_share">Upozornit, když někdo boostne váš status</string>
@ -314,7 +316,9 @@
<string name="channel_notif_media">Stahování médií</string>
<string name="select_sound">Vybrat tón</string>
<string name="set_enable_time_slot">Zapnout rozvrh oznámení</string>
<string name="block_domain_confirm_message">Určitě chcete zablokovat %s?\n\nJiž z této domény neuvidíte ve všech veřejných časových osách ani v oznámeních žádný obsah. Vaši sledující z této domény budou odstraněni.</string>
<string name="block_domain_confirm_message">Určitě chcete zablokovat %s\?
\n
\nJiž z této domény neuvidíte ve všech veřejných časových osách ani v oznámeních žádný obsah. Vaši sledující z této domény budou odstraněni.</string>
<string name="block_domain">Zablokovat doménu</string>
<string name="toast_block_domain">Doména je blokována</string>
<string name="retrieve_remote_status">Načítám vzdálený status</string>
@ -332,9 +336,9 @@
<string name="schedule_boost">Naplánovat boost</string>
<string name="boost_scheduled">Boost je naplánován!</string>
<string name="no_scheduled_boosts">Žádný naplánovaný boost k zobrazení!</string>
<string name="open_menu">Otevřete nabídku</string>
<string name="open_menu">Otevřít nabídku</string>
<string name="profile_picture">Profilový obrázek</string>
<string name="profile_banner">Profilová hlavička</string>
<string name="profile_banner">Hlavička profilu</string>
<string name="contact_instance_admin">Kontaktovat administrátora instance</string>
<string name="mastohost_logo">Logo MastoHost</string>
<string name="emoji_picker">Výběr emotikonů</string>
@ -384,7 +388,7 @@
<string name="list_of_blocked_domains">Seznam blokovaných volání</string>
<string name="submit">Odeslat</string>
<string name="filter_timeline_with_a_tag">Filtrovat časovou osu s hashtagy</string>
<string name="no_tags">Žádné hashtagy</string>
<string name="no_tags">Žádné tagy</string>
<string name="set_retrieve_metadata_share_from_extras">Při sdílení URL připojit obrázek</string>
<!-- end languages -->
<string name="create_poll">Vytvořit anketu</string>
@ -415,14 +419,14 @@
<string name="label_filter">Filtr</string>
<string name="label_brush">Štětec</string>
<string name="discard">Zahodit</string>
<string name="saving">Ukladáno</string>
<string name="saving">Ukladání</string>
<string name="image_saved">Obrázek byl úspěšně uložen!</string>
<string name="save_image_failed">Nepodařilo se uložit obrázek</string>
<string name="add_poll_item">Přidat položku ankety</string>
<string name="mute_conversation">Ztit konverzaci</string>
<string name="unmute_conversation">Zrušit umení konverzace</string>
<string name="toast_unmute_conversation">Konverzace už není umená!</string>
<string name="toast_mute_conversation">Konverzace je umená</string>
<string name="mute_conversation">Ztlumit konverzaci</string>
<string name="unmute_conversation">Zrušit ztlumení konverzace</string>
<string name="toast_unmute_conversation">Konverzace už není ztlumená!</string>
<string name="toast_mute_conversation">Konverzace je ztlumená</string>
<string name="category_general">Základní</string>
<string name="category_regional">Regionální</string>
<string name="category_art">Umění</string>
@ -433,7 +437,7 @@
<string name="category_food">Jídlo</string>
<string name="instance_logo">Logo instance</string>
<string name="join_mastodon">Připojte se k Mastodonu</string>
<string name="pickup_instance_category">Choose an instance by picking up a category, then tap on a check button.</string>
<string name="pickup_instance_category">K získání seznamu instancí vyberte kategorii, potom si klepnutím zvolte instanci, kterou chcete.</string>
<string name="users">%1$s uživatelů</string>
<string name="password_confirm">Potvrdit heslo</string>
<string name="agreement_check">Souhlasím s %1$s a %2$s</string>
@ -443,7 +447,7 @@
<string name="validation_needed">Tato instance funguje na pozvánky. Aby se dal váš účet používat, musí ho ručně schválit administrátor.</string>
<string name="password_error">Hesla nesouhlasí!</string>
<string name="email_error">E-mail se zdá být neplatný!</string>
<string name="email_indicator">Poslali jsme vám potvrzovací e-mail</string>
<string name="email_indicator">Instance vám pošle potvrzovací e-mail</string>
<string name="password_indicator">Použijte minimálně 8 znaků</string>
<string name="password_too_short">Heslo musí mít minimálně 8 znaků</string>
<string name="username_error">Uživatelské jméno smí obsahovat jen písmena, číslice a podtržítka</string>
@ -466,20 +470,20 @@
<string name="suspended">Pozastaveno</string>
<string name="permissions">Oprávnění</string>
<string name="disable">Vypnout</string>
<string name="silence">Silence</string>
<string name="silence">Ztišit</string>
<string name="account">Účet</string>
<string name="unsilence">Undo silence</string>
<string name="unsilence">Zrušit ztišení</string>
<string name="undisable">Zrušit vypnutí</string>
<string name="suspend">Pozastavit</string>
<string name="unsuspend">Zrušit pozastavení</string>
<string name="audio">Zvuk</string>
<string name="voice_message">Hlasová zpráva</string>
<string name="set_enable_time_slot_indication">During the time slot, the app will send notifications. You can reverse (ie: silent) this time slot with the right spinner.</string>
<string name="set_enable_time_slot_indication">Během časového úseku budu aplikace posílat upozornění. Můžete to pro tento úsek změnit (tzn. ztišit) pomocí ovládacího prvku vpravo.</string>
<string name="set_fit_preview_indication">Náhledy nebudou v časových osách oříznuty</string>
<string name="set_capitalize_indication">Automatically insert a line break after the mention to capitalize the first letter</string>
<string name="set_capitalize_indication">Automaticky vkládat zalomení řádku za zmínku, aby bylo první písmeno velké</string>
<string name="settings_title_custom_sharing_indication">Umožňuje tvůrcům obsahu sdílet statusy do jejich kanálů RSS</string>
<string name="compose">Vytváření</string>
<string name="select">Select</string>
<string name="select">Vybrat</string>
<string name="add_instances">Přidat instanci</string>
<string name="set_enable_crash_report">Zapnout hlášení o pádech aplikace</string>
<string name="set_enable_crash_report_indication">Pokud je zapnuto, místně se vytvoří hlášení o pádu a pak ho budete moci sdílet.</string>
@ -525,13 +529,13 @@
<string name="link_color_title">Odkazy</string>
<string name="link_color">Změnit ve zprávách barvu odkazů (URL, zmínek, tagů apod.)</string>
<string name="boost_header_color_title">Hlavička reblogů</string>
<string name="displayname_title">Change the color of display name at the top of messages</string>
<string name="username_title">Change the color of the user name at the top of messages</string>
<string name="displayname_title">Změnit barvu zobrazovaného jména nad zprávami</string>
<string name="username_title">Změnit barvu uživatelského jména nad zprávami</string>
<string name="boost_header_color">Změnit barvu hlavičky pro reblogy</string>
<string name="background_status_title">Příspěvky</string>
<string name="background_status">Barva pozadí příspěvků v časových osách</string>
<string name="reset_color">Resetovat barvy</string>
<string name="clik_reset">Tap here to reset all your custom colors</string>
<string name="clik_reset">Klepněte zde k resetu všech vašich vlastních barev</string>
<string name="reset">Reset</string>
<string name="icons_color_title">Ikony</string>
<string name="icons_color">Barva dolních ikon v časových osách</string>
@ -546,14 +550,14 @@
<string name="data_export_theme">Téma bylo exportováno</string>
<string name="data_export_theme_success">Téma bylo úspěšně exportováno do CSV</string>
<string name="import_theme">Importovat téma</string>
<string name="import_theme_title">Tap here to import a theme from a previous export</string>
<string name="import_theme_title">Klepněte zde k importu tématu z předchozího exportu</string>
<string name="export_theme">Exportovat téma</string>
<string name="export_theme_title">Tap here to export the current theme</string>
<string name="export_theme_title">Klepněte zde k exportu aktuálního tématu</string>
<string name="theme_file_error">Při výběru souboru s tématem došlo k chybě</string>
<string name="user_count">Počet uživatelů</string>
<string name="status_count">Počet statusů</string>
<string name="instance_count">Počet instancí</string>
<string name="poll_finish_in">End in %s</string>
<string name="poll_finish_in">Konec za %s</string>
<string name="no_instance_reccord">Tato instance není k dispozici na https://instances.social</string>
<string name="display_full_link">Zobrazit úplný odkaz</string>
<string name="share_link">Sdílet odkaz</string>
@ -605,7 +609,7 @@
<string name="filter">Filtr</string>
<string name="icon_size">Velikosti ikon</string>
<string name="toots_visibility_title">Výchozí viditelnost zpráv:</string>
<string name="set_notifications_page">Počet upozornění na jedno nahrá</string>
<string name="set_notifications_page">Počet upozornění na jedno načte</string>
<string name="replace_reddit_host">Doména frontendu Redditu</string>
<string name="hide_content">Skrýt obsah &lt;</string>
<string name="report_val2">Je to spam</string>
@ -625,7 +629,7 @@
<string name="report_3_title">Která pravidla jsou porušována\?</string>
<string name="join_the_fediverse">Připojte se k fediverse</string>
<string name="delete_field">Smazat pole</string>
<string name="fetch_more_messages">Nahrát více zpráv…</string>
<string name="fetch_more_messages">Načíst více zpráv…</string>
<string name="replace_youtube_description">Použít alternativní frontend pro YouTube</string>
<string name="replace_twitter_description">Použít alternativní frontend pro Twitter</string>
<string name="replace_youtube">YouTube</string>
@ -649,7 +653,7 @@
<string name="set_display_bookmark_indication">Vždy zobrazovat tlačítko pro záložky</string>
<string name="bottom_menu">Spodní nabídka</string>
<string name="also_favourite_by">"Oblíbené také u: "</string>
<string name="tap_here_to_refresh_poll">Klepněte zde pro aktualizaci hlasování</string>
<string name="tap_here_to_refresh_poll">Klepněte zde pro znovunačtení ankety</string>
<string name="media_cannot_be_uploaded">Média se nepovedlo nahrát!</string>
<string name="load_media_type_title">Načíst náhledy pro média</string>
<string name="display_media">Zobrazovat média</string>
@ -699,7 +703,7 @@
<string name="edit_message">Upravit zprávu</string>
<string name="toast_bookmark">Zpráva byla přidána do vašich záložek!</string>
<string name="toast_unbookmark">Zpráva byla odebrána z vašich záložek!</string>
<string name="set_accounts_page">Počet účtů na jedno nahrá</string>
<string name="set_accounts_page">Počet účtů na jedno načte</string>
<string name="category_music">Hudba</string>
<string name="replace_youtube_host">Doména frontendu YouTube</string>
<string name="cannot_be_empty">Toto pole nesmí být prázdné!</string>
@ -711,7 +715,7 @@
<string name="save_changes">Uložit změny</string>
<string name="set_bot_content">Účet bota</string>
<string name="show_content">Ukázat obsah &gt;</string>
<string name="report_1_mute">Neuvidíte jejich příspěvky. Mohou vás stále sledovat a vidět vaše příspěvky a nedozví se, že jste je umlčeli.</string>
<string name="report_1_mute">Neuvidíte jejich příspěvky. Mohou vás stále sledovat a vidět vaše příspěvky a nedozví se, že jste je ztlumili.</string>
<string name="report_more">Je ještě něco jiného, co si myslíte, že bychom měli vědět\?</string>
<string name="profiled_updated">Profil byl aktualizován!</string>
<string name="not_valid_list_name">Název seznamu není platný!</string>
@ -721,7 +725,7 @@
<string name="invite_join_the_fediverse">Ahoj! Zveme vás k připojení do Fediverse.</string>
<string name="notif_display_mentions">Zmínky</string>
<string name="unlocked">Odemčeno</string>
<string name="report_1_mute_title">Umlčet %1$s</string>
<string name="report_1_mute_title">Ztlumit %1$s</string>
<string name="add_field">Přidat pole</string>
<string name="report_1_title_more">Zde jsou volby ovládající, co uvidíte na Mastodonu:</string>
<string name="report_1_unfollow_title">Nesledovat %1$s</string>

View file

@ -29,7 +29,7 @@
<string name="camera">Fotocamera</string>
<string name="delete_all">Elimina tutto</string>
<string name="schedule">Pianifica</string>
<string name="text_size">Dimensioni testo e icona</string>
<string name="text_size">Dimensioni testo</string>
<string name="next">Successivo</string>
<string name="previous">Precedente</string>
<string name="open_with">Apri con</string>
@ -105,18 +105,22 @@
<string name="date_day">%d g</string>
<plurals name="date_seconds_polls">
<item quantity="one">%d secondo</item>
<item quantity="many">%d secondi</item>
<item quantity="other">%d secondi</item>
</plurals>
<plurals name="date_minutes_polls">
<item quantity="one">%d minuto</item>
<item quantity="many">%d minuti</item>
<item quantity="other">%d minuti</item>
</plurals>
<plurals name="date_hours_polls">
<item quantity="one">%d ora</item>
<item quantity="many">%d ore</item>
<item quantity="other">%d ore</item>
</plurals>
<plurals name="date_day_polls">
<item quantity="one">%d giorno</item>
<item quantity="many">%d giorni</item>
<item quantity="other">%d giorni</item>
</plurals>
<!-- TOOT -->
@ -309,7 +313,9 @@
<string name="channel_notif_media">Scarica i media</string>
<string name="select_sound">Seleziona tono</string>
<string name="set_enable_time_slot">Abilita fascia oraria</string>
<string name="block_domain_confirm_message">Sei sicuro di voler bloccare %s\?</string>
<string name="block_domain_confirm_message">Sei sicuro di voler bloccare %s\?
\nNon vedrai i contenuti di quel dominio in nessuna timeline pubblica e nelle notifiche.
\nI tuoi followers di quel dominio saranno rimossi.</string>
<string name="block_domain">Blocca dominio</string>
<string name="toast_block_domain">Il dominio è bloccato</string>
<string name="retrieve_remote_status">Recupero dello stato remoto</string>
@ -350,7 +356,6 @@
<string name="languages">Lingue</string>
<string name="show_media_only">Solo media</string>
<string name="show_media_nsfw">Mostra NSFW</string>
<string name="bot">Bot</string>
<string name="pixelfed_instance">Istanza Pixelfed</string>
<string name="mastodon_instance">Istanza Mastodon</string>
<string name="any_tags">Qualsiasi tra queste</string>
@ -424,7 +429,6 @@
<string name="category_activism">Attivismo</string>
<string name="category_games">Gioco</string>
<string name="category_tech">Tecnologia</string>
<string name="category_furry">Furry</string>
<string name="category_food">Cibo</string>
<string name="instance_logo">Icona dell\'istanza</string>
<string name="join_mastodon">Unisciti a Mastodon</string>
@ -487,6 +491,7 @@
<string name="report_account">Segnala account</string>
<plurals name="number_of_voters">
<item quantity="one">%d votante</item>
<item quantity="many">%d Votanti</item>
<item quantity="other">%d votanti</item>
</plurals>
<string-array name="poll_choice_type">
@ -508,7 +513,7 @@
<string name="unfollow_confirm">Vuoi smettere di seguire questo account?</string>
<string name="set_unfollow_validation">Mostra finestra di conferma prima di smettere di seguire</string>
<string name="replace_medium">Replace Medium links</string>
<string name="replace_medium_description">Replace medium.com links with an open source alternative front-end focused on privacy.</string>
<string name="replace_medium_description">Usa un frontend alternativo per Medium</string>
<string name="replace_medium_host">Default: scribe.rip</string>
<string name="set_push_notifications">Usa un sistema di notifiche push per ricevere notifiche in tempo reale.</string>
<string name="action_add_notes">Aggiungi note</string>
@ -534,7 +539,7 @@
<string name="make_an_action">Scegli un\'azione</string>
<string name="translation">Traduzione</string>
<string name="text_color_title">Colore del testo</string>
<string name="text_color">Cambia il colore del testo nei riquadri</string>
<string name="text_color">Cambia il colore del testo nei messaggi</string>
<string name="pref_custom_theme">Usa un tema personalizzato</string>
<string name="theming">Temi</string>
<string name="data_export_theme">Il tema è stato esportato</string>
@ -586,4 +591,314 @@
<string name="toast_bookmark">Il messaggio è stato aggiunto ai tuoi preferiti!</string>
<string name="toast_unbookmark">Il messaggio è stato rimosso dai tuoi preferiti!</string>
<string name="set_accounts_page">Numero di account per caricamento</string>
<string name="approved">Approvato</string>
<string name="replace_twitter">Twitter</string>
<string name="is_down">É offline!</string>
<string name="instance_health_checkedat">Controllato il: %s</string>
<string name="set_single_topbar_title">Barra azione singola</string>
<string name="set_single_topbar">Se abilitato, l\'app avrà solo una singola barra per timeline</string>
<string name="set_timelines_in_a_list_title">Timeline in lista</string>
<string name="channel_notif_update">Nuovo aggiornamento</string>
<string name="channel_notif_signup">Nuova iscrizione</string>
<string name="channel_notif_report">Nuova segnalazione</string>
<string name="notif_update_push">Un messaggio che hai condiviso è stato modificato</string>
<string name="show_content">Mostra contenuto &gt;</string>
<string name="stop_recording">Ferma registrazione</string>
<string name="report_val4">Si tratta di altro</string>
<string name="report_1_unfollow">Stai seguendo questo account. Per non vedere più i suoi post sul tuo home feed, smetti di seguirlo.</string>
<string name="report_more_remote">L\'account proviene da un altro server. Vuoi inviare una copia anonima del report anche a quel server\?</string>
<string name="report_3_title">Quali regole si stanno violando\?</string>
<string name="locked">Bloccato</string>
<string name="notifications_are">Durante questo intervallo</string>
<string name="set_use_cache">Usa la cache</string>
<string name="reply">Rispondi</string>
<string name="display_options">Mostra opzioni</string>
<string name="unconfirmed">Non confermato</string>
<string name="action_followed_tag_empty">Non segui alcuna etichetta!</string>
<string name="account_silenced">Account silenziato</string>
<string name="state">Stato</string>
<string name="follow_tag">Segui etichetta</string>
<string name="followed_tags">Etichette seguite</string>
<string name="notif_update">Modifica messaggio</string>
<string name="hide_completely">Nascondi completamente</string>
<string name="hide_with_warning_description">Nascondi il contenuto filtrato con un avviso con il titolo del filtro</string>
<string name="title">Titolo</string>
<string name="context_home_list">Home e liste</string>
<string name="unpin_timeline_description">Sei sicuro di non voler fissare quella timeline\?</string>
<string name="domains">Domini</string>
<string name="set_notif_admin_report">Nuova segnalazione (moderatori)</string>
<string name="order_lists">Ordine liste</string>
<string name="admin_reject_reports">Rifiuta segnalazioni</string>
<string name="type_of_notifications">Tipo di notifiche</string>
<string name="mute_tag">Sei sicuro di voler silenziare l\'etichetta %1$s\?</string>
<string name="type_of_notifications_title">Scegli il tipo di notifiche</string>
<string name="select_a_theme">Seleziona un tema</string>
<string name="filter">Filtro</string>
<string name="approve">Approva</string>
<string name="media_cannot_be_uploaded">I media non possono essere caricati!</string>
<string name="set_push_notifications_delay">Imposta il ritardo tra ogni aggiornamento</string>
<string name="set_timelines_in_a_list">Quando abilitato, tutte le timeline fissate saranno mostrate in un menú a tendina</string>
<string name="view_the_original_message">Apri messaggio originale</string>
<string name="full_date_edited">%1$s modificato %2$s</string>
<string name="set_display_translate_indication">Mostra sempre il bottone di traduzione</string>
<string name="display">Mostra</string>
<string name="toast_token">L\'app ha fallito nel ricevere un token</string>
<string name="status_history">Cronologia messaggio</string>
<string name="edited_message_at">Modificato %1$s</string>
<string name="created_message_at">Creato %1$s</string>
<string name="notif_display_updates">Aggiornamenti</string>
<string name="filtered_by">Filtrato: %1$s</string>
<string name="display_remote_profile">Mostra profilo remoto</string>
<string name="no_blocked_domains">Non hai domini bloccati</string>
<string name="unblock_domain_confirm">Vuoi sbloccare %1$s\?</string>
<string name="set_notif_update">Notifica aggiornamenti</string>
<string name="set_notif_user_sign_up">Nuova registrazione(moderatori)</string>
<string name="open_with_account">Apri con un altro account</string>
<string name="icon_size">Dimensioni icona</string>
<string name="set_notifications_page">Numero di notifiche per caricamento</string>
<string name="category_music">Musica</string>
<string name="post_message_text">Inviando messaggio %d/%d</string>
<string name="is_up">É online!</string>
<string name="notif_display_favourites">Preferiti</string>
<string name="hide_content">Nascondi contenuto&lt;</string>
<string name="report_1_mute_title">Muta %1$s</string>
<string name="report_more_additional">Commenti aggiuntivi</string>
<string name="dont_have_an_account">Non hai un account\?</string>
<string name="join_the_fediverse">Unisciti al fediverso</string>
<string name="add_filter">Aggiungi filtro</string>
<string name="my_instance">La mia istanza</string>
<string name="my_app">La mia app</string>
<string name="Suggestions">Suggerimenti</string>
<string name="notif_display_mentions">Menzioni</string>
<string name="pref_theme_base_summary">Scegli se la base del tema debba essere scura o chiara</string>
<string name="also_boosted_by">Ricondiviso anche da:</string>
<string name="label_shape">Forma</string>
<string name="cached_messages">Messaggi in cache</string>
<string name="release_notes">Note aggiornamento</string>
<string name="export_settings">Esporta impostazioni</string>
<string name="type_of_theme">Scegli una modalità per il tema</string>
<string name="type_default_theme_dark">Tema scuro default</string>
<string name="poll_duration">Durata del sondaggio:</string>
<string name="domain">Dominio</string>
<string name="disable_notifications">Disabilita notifiche</string>
<string name="pref_contributor">Temi dai contribuenti</string>
<string name="label_eraser_mode">Modalità gomma</string>
<string name="refresh_every">Controlla notifiche ogni:</string>
<string name="import_settings">Importa impostazioni</string>
<string name="notif_sign_up">Un utente si è registrato</string>
<string name="notif_report">Un utente ha inviato una segnalazione</string>
<string name="cannot_be_empty">Questo campo non può essere vuoto!</string>
<string name="sign_ups">Registrazioni</string>
<string name="replace_twitter_description">Usa un frontend alternativo per Twitter</string>
<string name="data_export_settings_success">Le impostazioni sono state esportate con successo</string>
<string name="data_import_settings_success">Le impostazioni sono state importate con successo</string>
<string name="keepon">Continua</string>
<string name="report_indication_title_status">Dicci cosa non va con questo post</string>
<string name="report_val3">Viola le regole del server</string>
<string name="report_val_more3">Non sai se violi delle regole specifiche</string>
<string name="report_val_more4">Il problema non rientra nelle altre categorie</string>
<string name="report_1_title">Non vuoi vederlo\?</string>
<string name="report_1_title_more">Qui ci sono le tue opzioni per controllare cosa vedi su Mastodon:</string>
<string name="report_1_block_title">Blocca %1$s</string>
<string name="report_more">C\'é qualcos\'altro che vorresti aggiungere\?</string>
<string name="instance_health_indication">Versione: %s
\n%s utenti -%s stati</string>
<string name="report_indication_title_status_more">Scegli l\'opzione migliore</string>
<string name="report_1_unfollow_title">Non seguire %1$s</string>
<string name="invite_join_the_fediverse">Ciao! Ti inviatiamo ad unirti al fediverso.</string>
<string name="notif_display_updates_from_people">Aggiornamenti dalle persone</string>
<string name="clear_all_notif">Cancella tutte le notifiche</string>
<string name="save_changes">Salva modifiche</string>
<string name="display_all_categories">Mostra tutte le categorie</string>
<string name="interactions">Interazioni</string>
<string name="add_field">Aggiungi campo</string>
<string name="unlocked">Sbloccato</string>
<string name="delete_field_confirm">Sei sicuro di voler eliminare il campo\?</string>
<string name="scheduled">Schedulato</string>
<string name="not_valid_list_name">Il nome della lista non é valido!</string>
<string name="set_display_bookmark_indication">Mostra sempre il pulsante segnalibro</string>
<string name="bottom_menu">Menú inferiore</string>
<string name="top_menu">Barra del menú superiore</string>
<string name="also_favourite_by">"Preferito anche da: "</string>
<string name="last_active">Ultima volta attivo</string>
<string name="resolved">Risolto</string>
<string name="tap_here_to_refresh_poll">Clicca qui per aggiornare il sondaggio</string>
<string name="action_announcement_from_to">Annunci %1$s - %2$s</string>
<string name="delete_cache">Elimina cache</string>
<string name="files_cache_size">Grandezza file cache</string>
<string name="default_system_language">Usa la lingua di sistema</string>
<string name="open_draft">Apri bozza</string>
<string name="type_of_notifications_delay_title">Tempo controllo notifiche</string>
<string name="display_media">Mostra i media</string>
<string name="display_timelines">Mostra le timeline</string>
<string name="remember_position">Ricorda posizione nelle timeline</string>
<string name="aggregate_notifications">Aggrega notifiche</string>
<string name="display_media_notification">Mostra i media nelle notifiche</string>
<string name="change_logo">Cambia logo</string>
<string name="change_logo_description">Cambia il logo dell\'app sul dispositivo</string>
<string name="action_pin">Fissa messaggio</string>
<string name="action_unpin">Non fissare messaggio</string>
<string name="edit_message">Modifica messaggio</string>
<string name="moderator">Moderatore</string>
<string name="assign_to_me">Assegnamelo</string>
<string name="unassign">Non assegnare</string>
<string name="notification_remove_from_cache">Le notifiche sono state rimosse dalla cache.</string>
<string name="report">Segnala</string>
<string name="action_unfollow_tag">Non seguire etichetta</string>
<string name="action_unfollow_tag_confirm">Smettere di seguire questa etichetta\?</string>
<string name="write_the_tag_to_follow">Scrivi l\'etichetta da seguire</string>
<string name="profiles">Profili</string>
<string name="toast_feature_not_supported">La tua istanza non supporta questa feature!</string>
<string name="hide_with_warning">Nascondi avviso</string>
<string name="hide_completely_description">Nascondi completamente il contenuto filtrato, come se non esistesse</string>
<string name="keyword_or_phrase">Parola chiave o frase</string>
<string name="delete_keyword">Elimina parola chiave</string>
<string name="add_keyword">Aggiungi parola chiave</string>
<string name="toast_fetch_error">L\'app non é riuscita a trovare dati remoti!</string>
<string name="notif_reported">Invia una segnalazione</string>
<string name="not_interested">Non interessato</string>
<string name="action_privacy_policy">Politiche sulla privacy</string>
<string name="unpin_timeline">Rimuovere timeline fissate\?</string>
<string name="action_pinned_delete">Eliminare le timeline fissate\?</string>
<string name="keep_notifications">Mantieni notifiche</string>
<string name="reject_media">Rifiuta media</string>
<string name="reject_reports">Rifiuta segnalazioni</string>
<string name="admin_domainblock_domain">Il blocco di dominio non previene la creazione di account nel database, ma applicherà retroattivamente e automaticamente metodi specifici di moderazione su questi account.</string>
<string name="severity">Gravità</string>
<string name="admin_domainblock_severity">Il silenziamento renderà i post dell\'account invisibili a tutti quelli che non lo seguono.La sospensione rimuoverà tutti i contenuti dell\'account, media e dati del profilo. Usa nessuno se vuoi solo rifiutare i media.</string>
<string name="admin_domainblock_reject_media">Ignora tutte le segnalazioni provenienti da questo dominio.Irrelevante per le sospensioni</string>
<string name="set_cardview">Cards in sovraimpressione</string>
<string name="set_cardview_indication">Se abilitato, gli oggetti nelle timeline avranno un\'ombra e un elevazione.</string>
<string name="set_customize_light">Personalizza tema chiaro</string>
<string name="unmute_home">Non silenziare per la home</string>
<string name="set_customize_dark">Personalizza tema scuro</string>
<string name="set_customize_dark_indication">Permette di personalizzare alcuni elementi nei messaggi per il tema scuro.</string>
<string name="mute_them_all">Muta tutti</string>
<string name="set_use_cache_indication">Le timeline sarranno mantenute in cache in modo da velocizzare l\'app.</string>
<string name="display_media_notification_summary">Mostra i media nelle notifiche di preferiti e condivisioni</string>
<string name="pickup_logo">Scegli un logo</string>
<string name="set_live_translate_title">Traduci messaggi</string>
<string name="set_live_translate">Forza traduzione in una lingua specifica.Scegli la prima opzione per resettarla alle impostazioni del dispositivo</string>
<string name="user">Utente</string>
<string name="administrator">Amministratore</string>
<string name="max_indentation_thread">Indentazioni massime nei threads</string>
<string name="set_unlisted_replies">Risposte non in lista</string>
<string name="set_unlisted_replies_indication">Riguarda solo le risposte pubbliche.Se abilitato, le tue risposte avranno automaticamente la visibilità \"non in lista\" invece di \"pubblico\"</string>
<string name="email_status">Stato email</string>
<string name="login_status">Stato login</string>
<string name="joined">Unito</string>
<string name="recent_ip">IP recente</string>
<string name="allow">Permetti</string>
<string name="warn">Avvisa</string>
<string name="email_user">Notifica user per email</string>
<string name="custom_warning">Avviso personalizzato</string>
<string name="list_reported_statuses">Status segnalazioni</string>
<string name="silenced">Silenziato</string>
<string name="set_language_picker">Permette di ridurre la lista della lingua del post quando si compone un messaggio.</string>
<string name="restart_the_app">Riavviare l\'app\?</string>
<string name="restart">Riavvia</string>
<string name="restart_the_app_theme">Devi riavviare l\'app per applicare le modifiche.</string>
<string name="category_custom">Personalizzato</string>
<string name="instance_not_valid">L\'istanza non sembra essere valida!</string>
<string name="followers_only">Solo followers</string>
<string name="add_status">Aggiungi status</string>
<string name="favourited_by">Preferito da</string>
<string name="other">Altro</string>
<string name="eg_sensitive_content">Es.: contenuto sensibile</string>
<string name="pref_custom_theme_new_summary">Permette di creare il tuo tema personalizzato</string>
<string name="notification_sounds">Suoni delle notifiche</string>
<string name="action_lists_edit">Modifica lista</string>
<string name="remove_status">Rimuovi status</string>
<string name="pref_contributor_summary">Scegli un tema creato dai contribuenti</string>
<string name="admin_scope">Sono un moderatore</string>
<string name="set_bot_content">Account bot</string>
<string name="no_account_in_list">Nessun account trovato per questa lista!</string>
<string name="pref_theme_base">Base del tema</string>
<string name="set_unfollow_validation_title">Conferma unfollow</string>
<string name="more_actions">Altre azioni</string>
<string name="mute_home">Silenzia per la home</string>
<string name="report_val2">È spam</string>
<string name="report_title">Segnala %1$s</string>
<string name="add_all_users_home_muted">Aggiungi tutti gli utenti nella home silenziata</string>
<string name="types_of_notifications_to_display">Tipo di notifiche da mostrare</string>
<string name="origin_report">Origine dell\'account segnalato</string>
<string name="message_language">Lingua dei messaggi</string>
<string name="my_account">Il mio account</string>
<string name="fetch_notifications">Controlla notifiche</string>
<string name="set_display_counters">Mostra contatori</string>
<string name="account_warned">Account avvisato</string>
<string name="account_unsuspended">Account non sospeso</string>
<string name="account_suspended">Account sospeso</string>
<string name="account_undisabled">Account abilitato</string>
<string name="account_disabled">Account disabilitato</string>
<string name="notif_submitted_report">Invia una segnalazione</string>
<string name="notif_signed_up">Iscritto</string>
<string name="admin_reject_media">Rifiuta file media</string>
<string name="public_comment">Commento pubblico</string>
<string name="private_comment">Commento privato</string>
<string name="saved_changes">Modifiche salvate!</string>
<string name="pref_customize">Personalizza colori</string>
<string name="set_dynamic_color">Colore dinamico</string>
<string name="set_dynamic_color_indication">Allinea la tonalità con il colore dello sfondo del dispositivo.</string>
<string name="put_all_accounts_in_home_muted">Tutti gli account saranno silenziati per la timeline della Home.</string>
<string name="replace_instagram_description">Usa un frontend alternativo per Instagram</string>
<string name="replace_reddit_description">Usa un fronten alternativo per Reddit</string>
<string name="most_recent">Piú recente</string>
<string name="clear_cache">Pulisci la cache</string>
<string name="delete_cache_message">Sei sicuro di voler pulire la cache\? Se hai bozze con media, andranno persi.</string>
<string name="data_export_settings">Le impostazioni sono state esportate</string>
<string name="post_message">Invio messaggio…</string>
<string name="report_val_more1">Non è qualcosa che vorresti vedere</string>
<string name="report_1_block">Non vedrai i suoi post.Non potrà vedere i tuoi post o seguirti.Saprà di essere stato bloccato.</string>
<string name="delete_field">Campo eliminato</string>
<string name="customize_timelines">Personalizza timelines</string>
<string name="muted_menu_home">Server mutati</string>
<string name="profiled_updated">Il profilo é stato aggiornato!</string>
<string name="label_line">Linea</string>
<string name="location">Località</string>
<string name="label_oval">Ovale</string>
<string name="label_rectangle">Rettangolo</string>
<string name="report_1_mute">Non vedrai i suoi post. Potrà ancora seguirti e vedere i tuoi post e non saprà che l\'hai mutato.</string>
<string name="report_more_forward">Inviato a %1$s</string>
<string name="message_has_been_sent">Il messaggio è stato inviato!</string>
<string name="poll_type">Tipo di sondaggio:</string>
<string name="report_sent">Il report é stato inviato!</string>
<string name="about_mastodon">\"Mastodon non é un singolo sito come Twitter o Facebook, é una rete di migliaia di communità gestite da organizzazioni e individui differenti che forniscono un\'esperienza social integrata.\"</string>
<string name="mark_all_as_read">Segna tutte le notifiche come lette</string>
<string name="delete_notification_all_warning">Sei sicuro di voler eliminare tutte le notifiche\? L\'azione non puó essere annulata.</string>
<string name="notif_display_poll_results">Risultati sondaggio</string>
<string name="msg_save_image">Vuoi uscire senza salvare l\'immagine\?</string>
<string name="permission_missing">Permessi non abilitati!</string>
<string name="set_display_counter">Mostra contatori per i messaggi</string>
<string name="load_media_type_title">Mostra anteprime per i media</string>
<string name="set_your_max_char_count">Imposta numero massimo di caratteri</string>
<string name="load_settings">Carica impostazioni esportate</string>
<string name="set_display_counters_description">Mostrerà un contatore nel tab delle timeline per i nuovi messaggi</string>
<string name="aggregate_notifications_summary">Se abiliato, l\'app aggregherà le notifiche della stessa tipologia</string>
<string name="mark_resolved">Segna come risolto</string>
<string name="mark_unresolved">Segna come irrisolto</string>
<string name="account_unsilenced">Account non silenziato</string>
<string name="confirmed">Confermato</string>
<string name="account_rejected">Account rifiutato</string>
<string name="account_approved">Account approvato</string>
<string name="action_tag_follow">Segui etichetta</string>
<string name="not_valid_tag_name">Il nome etichetta non é valido!</string>
<string name="watch_trends_for_instance">Quarda i trends di questa istanza</string>
<string name="blocked_domains">Domini bloccati</string>
<string name="unblock_domain">Domini sbloccati</string>
<string name="admin_reject_obfuscate">Nascondi nome dominio</string>
<string name="admin_domainblock_reject_reports">Ignora tutte le segnalazioni provenienti da questo dominio.Irrilevante per le sospensioni</string>
<string name="create_domain_block">Crea un blocco dominio</string>
<string name="admin_domainblock_private_comment">Commento privato riguardo le limitazioni di questo dominio per uso interno dei moderatori.</string>
<string name="admin_domainblock_public_comment">Commento pubblico riguardo questo dominio, se é abilitata la lista delle limitazioni del dominio.</string>
<string name="pref_customize_summary">Permette di impostare un colore personalizzato per i temi.</string>
<string name="type_default_theme_light">Tema chiaro default</string>
<string name="set_customize_light_indication">Permette di personalizzare alcuni elementi nei messaggi per il tema chiaro.</string>
<string name="toast_unpin">Il messaggio non é piú fissato!</string>
<string name="toast_pin">Il messaggio é stato fissato</string>
<string name="filter_action">Filtra azione</string>
<string name="filter_action_explanations">Scegli quale azione eseguire quando un post corrisponde al filtro</string>
<string name="show_anyway">Mostra comunque</string>
<string name="toast_error_add_to_list">L\'app non é riuscita ad aggiungere l\'account nella lista!</string>
<string name="delete_timeline">Elimina timeline</string>
</resources>

View file

@ -914,4 +914,10 @@
<string name="set_customize_light_indication">Permitit de personalizare unos cantos elementos in is messàgios pro su tema craru.</string>
<string name="toast_try_later">Torra a proare prus a tardu.</string>
<string name="toast_error_fetch_message">S\'aplicatzione no at agatadu su messàgiu remotu.</string>
<string name="mute_tag_action">Pone s\'eticheta a sa muda</string>
<string name="unpin_tag">Isbloca s\'eticheta</string>
<string name="set_display_translate_indication">Ammustra semper su butone de tradutzione</string>
<string name="unmute_tag_action">Torra a ativare s\'eticheta</string>
<string name="pin_tag">Apica s\'eticheta</string>
<string name="unfollow_tag">Non sigas prus s\'eticheta</string>
</resources>

View file

@ -226,7 +226,7 @@
<string name="action_follow">Takip Et</string>
<string name="action_unblock">Engeli kaldır</string>
<string name="action_mute">Sustur</string>
<string name="action_unmute">Sesi aç</string>
<string name="action_unmute">Susturmaktan vazgeç</string>
<string name="request_sent">İstek gönderildi</string>
<string name="followed_by">Sizi takip ediyor</string>
<string name="set_capitalize">Cevaplarda ilk harf büyük olsun</string>
@ -647,8 +647,8 @@
<string name="report_title">%1$s bildiriliyor</string>
<string name="report_val_more2">Kötü amaçlı bağlantılar, sahte etkileşim veya tekrarlayan yanıtlar</string>
<string name="report_1_unfollow">Bu hesabı takip ediyorsunuz. Gönderilerini artık ana akışınızda görmemek için onları takip etmeyi bırakın.</string>
<string name="report_1_mute_title">%1$s sesini kapat</string>
<string name="report_1_mute">Onların gönderilerini görmeyeceksiniz. Yine de sizi takip edebilir ve gönderilerinizi görebilirler ve sessize alındıklarını bilmezler.</string>
<string name="report_1_mute_title">%1$s sustur</string>
<string name="report_1_mute">Onların gönderilerini görmeyeceksiniz. Yine de sizi takip edebilir ve gönderilerinizi görebilirler ve susturulduklarını bilmezler.</string>
<string name="report_1_block_title">%1$s engelle</string>
<string name="report_2_title">Bu bildirimi destekleyen herhangi bir gönderi var mı\?</string>
<string name="report_more_remote">Hesap başka bir sunucudan. Bildirimin anonimleştirilmiş bir kopyası da oraya gönderilsin mi\?</string>
@ -899,7 +899,7 @@
<string name="admin_domainblock_private_comment">Moderatörler tarafından özel kullanım için bu etki alanı sınırlaması hakkında yorum yapın.</string>
<string name="admin_domainblock_reject_obfuscate">Etki alanı sınırlamaları listesinin tanıtılması etkinleştirilmişse listedeki etki alanı adını kısmen gizleyin</string>
<string name="admin_domainblock_public_comment">Etki alanı sınırlamaları listesinin tanıtılması etkinleştirilmişse, bu etki alanı sınırlaması hakkında herkese açık yorum yapın.</string>
<string name="mute_tag">%1$s etiketini sessize almak istediğinizden emin misiniz\?</string>
<string name="mute_tag">%1$s etiketini susturmak istediğinizden emin misiniz\?</string>
<string name="pref_customize">Renkleri özelleştir</string>
<string name="pref_customize_summary">Temalar için özel renklerinizi ayarlamanıza izin verir.</string>
<string name="set_dynamic_color">Değişken Renk</string>
@ -920,10 +920,16 @@
<string name="toast_on_your_instance">Görüşme sizin sunucunuzda başladı!</string>
<string name="toast_try_later">Lütfen daha sonra tekrar deneyin.</string>
<string name="toast_error_fetch_message">Uygulama uzak mesajı bulamadı.</string>
<string name="mute_tag_action">Etiketi sessize al</string>
<string name="mute_tag_action">Etiketi sustur</string>
<string name="unpin_tag">Etiketin sabitlemesini kaldır</string>
<string name="set_display_translate_indication">Her zaman çevir düğmesini göster</string>
<string name="unmute_tag_action">Etiketin sesini aç</string>
<string name="unmute_tag_action">Etiketi susturmaktan vazgeç</string>
<string name="pin_tag">Etiketi sabitle</string>
<string name="unfollow_tag">Etiketi takibi bırak</string>
<string name="muted_menu_home">Ana sayfada susturulan kullanıcılar</string>
<string name="put_all_accounts_in_home_muted">Ana sayfa zaman çizelgesi için tüm hesaplar susturulacaktır.</string>
<string name="mute_them_all">Tümünü sustur</string>
<string name="unmute_home">Ana sayfa için susturmaktan vazgeç</string>
<string name="add_all_users_home_muted">Tüm kullanıcıları ana sayfada susturmaya ekle</string>
<string name="mute_home">Ana sayfa için sustur</string>
</resources>

View file

@ -54,6 +54,7 @@
<string name="home_menu">Home</string>
<string name="local_menu">Local timeline</string>
<string name="muted_menu">Muted users</string>
<string name="muted_menu_home">Home muted users</string>
<string name="blocked_menu">Blocked users</string>
<string name="notifications">Notifications</string>
<string name="follow_request">Follow requests</string>
@ -2059,4 +2060,9 @@
<string name="pin_tag">Pin tag</string>
<string name="unpin_tag">Unpin tag</string>
<string name="unfollow_tag">Unfollow tag</string>
<string name="mute_home">Mute for home</string>
<string name="unmute_home">Unmute for home</string>
<string name="add_all_users_home_muted">Add all users in muted home</string>
<string name="put_all_accounts_in_home_muted">All accounts will be muted for the Home timeline.</string>
<string name="mute_them_all">Mute them all</string>
</resources>

View file

@ -0,0 +1,4 @@
Added:
- Mute/Unmute accounts in the Home timeline from their messages or their profiles
- Add all users from a list to "Muted home" in one click
- Display/Manage users that are muted for home

View file

@ -0,0 +1,7 @@
Added:
- Mute/Unmute accounts in the Home timeline from their messages or their profiles
- Add all users from a list to "Muted home" in one click
- Display/Manage users that are muted for home
Fixed:
- Timeline crashes