mirror of
https://codeberg.org/Bazsalanszky/Infinity-For-Lemmy.git
synced 2025-03-29 20:45:39 +01:00
Compare commits
11 Commits
48d79bc353
...
2f2d86bc3f
Author | SHA1 | Date | |
---|---|---|---|
|
2f2d86bc3f | ||
|
ecd3d008de | ||
|
f5172a17db | ||
|
662a5bd597 | ||
|
6621748de5 | ||
|
37fa76b79a | ||
|
c7acb50522 | ||
|
64304ad637 | ||
|
635ca332da | ||
|
e2a15ab925 | ||
|
016801419f |
@ -402,6 +402,11 @@
|
||||
android:label="@string/subscriptions"
|
||||
android:parentActivityName=".activities.MainActivity"
|
||||
android:theme="@style/AppTheme.Slidable" />
|
||||
<activity
|
||||
android:name=".activities.BlockedThingListingActivity"
|
||||
android:label="@string/blocks"
|
||||
android:parentActivityName=".activities.MainActivity"
|
||||
android:theme="@style/AppTheme.Slidable" />
|
||||
<activity
|
||||
android:name=".activities.SubredditSelectionActivity"
|
||||
android:label="@string/community_selection_activity_label"
|
||||
|
@ -8,6 +8,7 @@ import dagger.BindsInstance;
|
||||
import dagger.Component;
|
||||
import eu.toldi.infinityforlemmy.activities.AccountPostsActivity;
|
||||
import eu.toldi.infinityforlemmy.activities.AccountSavedThingActivity;
|
||||
import eu.toldi.infinityforlemmy.activities.BlockedThingListingActivity;
|
||||
import eu.toldi.infinityforlemmy.activities.CommentActivity;
|
||||
import eu.toldi.infinityforlemmy.activities.CreateMultiRedditActivity;
|
||||
import eu.toldi.infinityforlemmy.activities.CustomThemeListingActivity;
|
||||
@ -66,6 +67,8 @@ import eu.toldi.infinityforlemmy.activities.WebViewActivity;
|
||||
import eu.toldi.infinityforlemmy.activities.WikiActivity;
|
||||
import eu.toldi.infinityforlemmy.bottomsheetfragments.AccountChooserBottomSheetFragment;
|
||||
import eu.toldi.infinityforlemmy.bottomsheetfragments.FlairBottomSheetFragment;
|
||||
import eu.toldi.infinityforlemmy.fragments.BlockedCommunitiesListingFragment;
|
||||
import eu.toldi.infinityforlemmy.fragments.BlockedUsersListingFragment;
|
||||
import eu.toldi.infinityforlemmy.fragments.CommentsListingFragment;
|
||||
import eu.toldi.infinityforlemmy.fragments.FollowedUsersListingFragment;
|
||||
import eu.toldi.infinityforlemmy.fragments.HistoryPostFragment;
|
||||
@ -307,6 +310,12 @@ public interface AppComponent {
|
||||
|
||||
void inject(MorePostsInfoFragment morePostsInfoFragment);
|
||||
|
||||
void inject(BlockedThingListingActivity blockedThingListingActivity);
|
||||
|
||||
void inject(BlockedCommunitiesListingFragment blockedCommunitiesListingFragment);
|
||||
|
||||
void inject(BlockedUsersListingFragment blockedUsersListingFragment);
|
||||
|
||||
|
||||
@Component.Factory
|
||||
interface Factory {
|
||||
|
@ -110,9 +110,9 @@ class ParseSubscribedThing {
|
||||
boolean postingRestrictedToMods = community.getBoolean("posting_restricted_to_mods");
|
||||
int instanceId = community.getInt("instance_id");
|
||||
int subscribers = data.getJSONObject("counts").getInt("subscribers");
|
||||
|
||||
boolean isBlocked = data.getBoolean("blocked");
|
||||
newSubscribedSubredditData.add(new SubscribedSubredditData(id, title, LemmyUtils.actorID2FullName(actorId), iconUrl, accountName));
|
||||
newSubredditData.add(new SubredditData(id,name,title,description,removed,published,updated,deleted,nsfw,actorId,local,iconUrl,bannerImageUrl,hidden,postingRestrictedToMods,instanceId,subscribers));
|
||||
newSubredditData.add(new SubredditData(id, name, title, description, removed, published, updated, deleted, nsfw, actorId, local, iconUrl, bannerImageUrl, hidden, postingRestrictedToMods, instanceId, subscribers, isBlocked));
|
||||
|
||||
}
|
||||
} catch (JSONException e) {
|
||||
|
@ -13,6 +13,10 @@ import androidx.sqlite.db.SupportSQLiteDatabase;
|
||||
|
||||
import eu.toldi.infinityforlemmy.account.Account;
|
||||
import eu.toldi.infinityforlemmy.account.AccountDao;
|
||||
import eu.toldi.infinityforlemmy.blockedcommunity.BlockedCommunityDao;
|
||||
import eu.toldi.infinityforlemmy.blockedcommunity.BlockedCommunityData;
|
||||
import eu.toldi.infinityforlemmy.blockeduser.BlockedUserDao;
|
||||
import eu.toldi.infinityforlemmy.blockeduser.BlockedUserData;
|
||||
import eu.toldi.infinityforlemmy.customtheme.CustomTheme;
|
||||
import eu.toldi.infinityforlemmy.customtheme.CustomThemeDao;
|
||||
import eu.toldi.infinityforlemmy.multireddit.AnonymousMultiredditSubreddit;
|
||||
@ -38,7 +42,7 @@ import eu.toldi.infinityforlemmy.user.UserData;
|
||||
|
||||
@Database(entities = {Account.class, SubredditData.class, SubscribedSubredditData.class, UserData.class,
|
||||
SubscribedUserData.class, MultiReddit.class, CustomTheme.class, RecentSearchQuery.class,
|
||||
ReadPost.class, PostFilter.class, PostFilterUsage.class, AnonymousMultiredditSubreddit.class}, version = 24)
|
||||
ReadPost.class, PostFilter.class, PostFilterUsage.class, AnonymousMultiredditSubreddit.class, BlockedUserData.class, BlockedCommunityData.class}, version = 26)
|
||||
public abstract class RedditDataRoomDatabase extends RoomDatabase {
|
||||
|
||||
public static RedditDataRoomDatabase create(final Context context) {
|
||||
@ -49,7 +53,7 @@ public abstract class RedditDataRoomDatabase extends RoomDatabase {
|
||||
MIGRATION_9_10, MIGRATION_10_11, MIGRATION_11_12, MIGRATION_12_13,
|
||||
MIGRATION_13_14, MIGRATION_14_15, MIGRATION_15_16, MIGRATION_16_17,
|
||||
MIGRATION_17_18, MIGRATION_18_19, MIGRATION_19_20, MIGRATION_20_21,
|
||||
MIGRATION_21_22, MIGRATION_22_23, MIGRATION_23_24)
|
||||
MIGRATION_21_22, MIGRATION_22_23, MIGRATION_23_24, MIGRATION_24_25, MIGRATION_25_26)
|
||||
.build();
|
||||
}
|
||||
|
||||
@ -59,6 +63,10 @@ public abstract class RedditDataRoomDatabase extends RoomDatabase {
|
||||
|
||||
public abstract SubscribedSubredditDao subscribedSubredditDao();
|
||||
|
||||
public abstract BlockedUserDao blockedUserDao();
|
||||
|
||||
public abstract BlockedCommunityDao blockedCommunityDao();
|
||||
|
||||
public abstract UserDao userDao();
|
||||
|
||||
public abstract SubscribedUserDao subscribedUserDao();
|
||||
@ -390,4 +398,22 @@ public abstract class RedditDataRoomDatabase extends RoomDatabase {
|
||||
database.execSQL("ALTER TABLE accounts ADD COLUMN can_downvote INTEGER DEFAULT 1 NOT NULL");
|
||||
}
|
||||
};
|
||||
|
||||
private static final Migration MIGRATION_24_25 = new Migration(24, 25) {
|
||||
@Override
|
||||
public void migrate(@NonNull SupportSQLiteDatabase database) {
|
||||
database.execSQL("ALTER TABLE subreddits ADD COLUMN blocked INTEGER DEFAULT 1 NOT NULL");
|
||||
}
|
||||
};
|
||||
|
||||
private static final Migration MIGRATION_25_26 = new Migration(25, 26) {
|
||||
@Override
|
||||
public void migrate(@NonNull SupportSQLiteDatabase database) {
|
||||
database.execSQL("CREATE TABLE blocked_users" +
|
||||
"(name TEXT, id INTEGER NOT NULL, avatar TEXT, qualified_name TEXT, account_name TEXT NOT NULL, PRIMARY KEY( id, account_name))");
|
||||
database.execSQL("CREATE TABLE blocked_communities" +
|
||||
"(name TEXT, icon TEXT, id INTEGER NOT NULL, qualified_name TEXT, account_name TEXT NOT NULL, PRIMARY KEY( id, account_name))");
|
||||
|
||||
}
|
||||
};
|
||||
}
|
||||
|
@ -0,0 +1,82 @@
|
||||
package eu.toldi.infinityforlemmy.account;
|
||||
|
||||
import org.json.JSONArray;
|
||||
import org.json.JSONException;
|
||||
import org.json.JSONObject;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import eu.toldi.infinityforlemmy.apis.LemmyAPI;
|
||||
import eu.toldi.infinityforlemmy.blockedcommunity.BlockedCommunityData;
|
||||
import eu.toldi.infinityforlemmy.blockeduser.BlockedUserData;
|
||||
import eu.toldi.infinityforlemmy.subreddit.ParseSubredditData;
|
||||
import eu.toldi.infinityforlemmy.subreddit.SubredditData;
|
||||
import eu.toldi.infinityforlemmy.utils.LemmyUtils;
|
||||
import retrofit2.Call;
|
||||
import retrofit2.Callback;
|
||||
import retrofit2.Retrofit;
|
||||
|
||||
public class FetchBlockedThings {
|
||||
|
||||
public static void fetchBlockedThings(Retrofit mRetrofit, String accessToken, String accountName, FetchBlockedThingsListener fetchBlockedThingsListener) {
|
||||
LemmyAPI lemmyAPI = mRetrofit.create(LemmyAPI.class);
|
||||
|
||||
Call<String> call = lemmyAPI.getSiteInfo(accessToken);
|
||||
call.enqueue(new Callback<String>() {
|
||||
@Override
|
||||
public void onResponse(Call<String> call, retrofit2.Response<String> response) {
|
||||
if (response.isSuccessful()) {
|
||||
String siteInfo = response.body();
|
||||
if (siteInfo != null) {
|
||||
List<BlockedUserData> blockedUsers = new ArrayList<>();
|
||||
List<BlockedCommunityData> blockedCommunities = new ArrayList<>();
|
||||
try {
|
||||
JSONObject siteInfoJson = new JSONObject(siteInfo).getJSONObject("my_user");
|
||||
JSONArray blockedUsersJson = (siteInfoJson.has("person_blocks")) ? siteInfoJson.getJSONArray("person_blocks") : null;
|
||||
JSONArray blockedCommunitiesJson = (siteInfoJson.has("community_blocks")) ? siteInfoJson.getJSONArray("community_blocks") : null;
|
||||
if (blockedUsersJson != null) {
|
||||
for (int i = 0; i < blockedUsersJson.length(); i++) {
|
||||
JSONObject blockedUserJson = blockedUsersJson.getJSONObject(i).getJSONObject("target");
|
||||
int id = blockedUserJson.getInt("id");
|
||||
String name = blockedUserJson.getString("name");
|
||||
String avatar = blockedUserJson.getString("avatar");
|
||||
String qualifiedName = LemmyUtils.actorID2FullName(blockedUserJson.getString("actor_id"));
|
||||
BlockedUserData blockedUserData = new BlockedUserData(id, name, avatar, qualifiedName, accountName);
|
||||
|
||||
blockedUsers.add(blockedUserData);
|
||||
}
|
||||
}
|
||||
if (blockedCommunitiesJson != null) {
|
||||
for (int i = 0; i < blockedCommunitiesJson.length(); i++) {
|
||||
JSONObject blockedCommunityJson = blockedCommunitiesJson.getJSONObject(i);
|
||||
SubredditData blockedCommunityData = ParseSubredditData.parseSubredditData(blockedCommunityJson, true);
|
||||
blockedCommunities.add(new BlockedCommunityData(blockedCommunityData, accountName));
|
||||
}
|
||||
}
|
||||
fetchBlockedThingsListener.onFetchBlockedThingsSuccess(blockedUsers, blockedCommunities);
|
||||
} catch (JSONException e) {
|
||||
e.printStackTrace();
|
||||
fetchBlockedThingsListener.onFetchBlockedThingsFailure();
|
||||
}
|
||||
} else {
|
||||
fetchBlockedThingsListener.onFetchBlockedThingsFailure();
|
||||
}
|
||||
} else {
|
||||
fetchBlockedThingsListener.onFetchBlockedThingsFailure();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onFailure(Call<String> call, Throwable t) {
|
||||
fetchBlockedThingsListener.onFetchBlockedThingsFailure();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public interface FetchBlockedThingsListener {
|
||||
void onFetchBlockedThingsSuccess(List<BlockedUserData> blockedUsers, List<BlockedCommunityData> blockedCommunities);
|
||||
|
||||
void onFetchBlockedThingsFailure();
|
||||
}
|
||||
}
|
@ -0,0 +1,462 @@
|
||||
package eu.toldi.infinityforlemmy.activities;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.SharedPreferences;
|
||||
import android.os.Build;
|
||||
import android.os.Bundle;
|
||||
import android.os.Handler;
|
||||
import android.text.Editable;
|
||||
import android.text.TextWatcher;
|
||||
import android.view.Menu;
|
||||
import android.view.MenuItem;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.view.Window;
|
||||
import android.view.WindowManager;
|
||||
import android.view.inputmethod.InputMethodManager;
|
||||
import android.widget.EditText;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.appcompat.widget.Toolbar;
|
||||
import androidx.coordinatorlayout.widget.CoordinatorLayout;
|
||||
import androidx.core.view.inputmethod.EditorInfoCompat;
|
||||
import androidx.fragment.app.Fragment;
|
||||
import androidx.fragment.app.FragmentManager;
|
||||
import androidx.fragment.app.FragmentPagerAdapter;
|
||||
import androidx.viewpager.widget.ViewPager;
|
||||
|
||||
import com.google.android.material.appbar.AppBarLayout;
|
||||
import com.google.android.material.appbar.CollapsingToolbarLayout;
|
||||
import com.google.android.material.floatingactionbutton.FloatingActionButton;
|
||||
import com.google.android.material.tabs.TabLayout;
|
||||
|
||||
import org.greenrobot.eventbus.EventBus;
|
||||
import org.greenrobot.eventbus.Subscribe;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.concurrent.Executor;
|
||||
|
||||
import javax.inject.Inject;
|
||||
import javax.inject.Named;
|
||||
|
||||
import butterknife.BindView;
|
||||
import butterknife.ButterKnife;
|
||||
import eu.toldi.infinityforlemmy.ActivityToolbarInterface;
|
||||
import eu.toldi.infinityforlemmy.FragmentCommunicator;
|
||||
import eu.toldi.infinityforlemmy.Infinity;
|
||||
import eu.toldi.infinityforlemmy.R;
|
||||
import eu.toldi.infinityforlemmy.RedditDataRoomDatabase;
|
||||
import eu.toldi.infinityforlemmy.RetrofitHolder;
|
||||
import eu.toldi.infinityforlemmy.account.FetchBlockedThings;
|
||||
import eu.toldi.infinityforlemmy.asynctasks.InsertBlockedThings;
|
||||
import eu.toldi.infinityforlemmy.blockedcommunity.BlockedCommunityData;
|
||||
import eu.toldi.infinityforlemmy.blockeduser.BlockedUserData;
|
||||
import eu.toldi.infinityforlemmy.customtheme.CustomThemeWrapper;
|
||||
import eu.toldi.infinityforlemmy.customviews.ViewPagerBugFixed;
|
||||
import eu.toldi.infinityforlemmy.customviews.slidr.Slidr;
|
||||
import eu.toldi.infinityforlemmy.events.GoBackToMainPageEvent;
|
||||
import eu.toldi.infinityforlemmy.events.SwitchAccountEvent;
|
||||
import eu.toldi.infinityforlemmy.fragments.BlockedCommunitiesListingFragment;
|
||||
import eu.toldi.infinityforlemmy.fragments.BlockedUsersListingFragment;
|
||||
import eu.toldi.infinityforlemmy.utils.SharedPreferencesUtils;
|
||||
import eu.toldi.infinityforlemmy.utils.Utils;
|
||||
import retrofit2.Retrofit;
|
||||
|
||||
|
||||
public class BlockedThingListingActivity extends BaseActivity implements ActivityToolbarInterface {
|
||||
|
||||
public static final String EXTRA_SHOW_MULTIREDDITS = "ESM";
|
||||
private static final String INSERT_SUBSCRIBED_SUBREDDIT_STATE = "ISSS";
|
||||
private static final String INSERT_MULTIREDDIT_STATE = "IMS";
|
||||
|
||||
@BindView(R.id.coordinator_layout_subscribed_thing_listing_activity)
|
||||
CoordinatorLayout coordinatorLayout;
|
||||
@BindView(R.id.appbar_layout_subscribed_thing_listing_activity)
|
||||
AppBarLayout appBarLayout;
|
||||
@BindView(R.id.collapsing_toolbar_layout_subscribed_thing_listing_activity)
|
||||
CollapsingToolbarLayout collapsingToolbarLayout;
|
||||
@BindView(R.id.toolbar_subscribed_thing_listing_activity)
|
||||
Toolbar toolbar;
|
||||
@BindView(R.id.search_edit_text_subscribed_thing_listing_activity)
|
||||
EditText searchEditText;
|
||||
@BindView(R.id.tab_layout_subscribed_thing_listing_activity)
|
||||
TabLayout tabLayout;
|
||||
@BindView(R.id.view_pager_subscribed_thing_listing_activity)
|
||||
ViewPagerBugFixed viewPager;
|
||||
@BindView(R.id.fab_subscribed_thing_listing_activity)
|
||||
FloatingActionButton fab;
|
||||
@Inject
|
||||
@Named("oauth")
|
||||
Retrofit mOauthRetrofit;
|
||||
|
||||
@Inject
|
||||
@Named("no_oauth")
|
||||
RetrofitHolder mRetrofit;
|
||||
@Inject
|
||||
RedditDataRoomDatabase mRedditDataRoomDatabase;
|
||||
@Inject
|
||||
@Named("default")
|
||||
SharedPreferences mSharedPreferences;
|
||||
@Inject
|
||||
@Named("current_account")
|
||||
SharedPreferences mCurrentAccountSharedPreferences;
|
||||
@Inject
|
||||
CustomThemeWrapper mCustomThemeWrapper;
|
||||
@Inject
|
||||
Executor mExecutor;
|
||||
private String mAccessToken;
|
||||
private String mAccountName;
|
||||
|
||||
private String mAccountQualifiedName;
|
||||
private boolean mInsertSuccess = false;
|
||||
private boolean mInsertMultiredditSuccess = false;
|
||||
private boolean showMultiReddits = false;
|
||||
private SectionsPagerAdapter sectionsPagerAdapter;
|
||||
private Menu mMenu;
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
((Infinity) getApplication()).getAppComponent().inject(this);
|
||||
|
||||
super.onCreate(savedInstanceState);
|
||||
|
||||
setContentView(R.layout.activity_subscribed_thing_listing);
|
||||
|
||||
ButterKnife.bind(this);
|
||||
|
||||
EventBus.getDefault().register(this);
|
||||
|
||||
applyCustomTheme();
|
||||
|
||||
if (mSharedPreferences.getBoolean(SharedPreferencesUtils.SWIPE_RIGHT_TO_GO_BACK, true)) {
|
||||
mSliderPanel = Slidr.attach(this);
|
||||
}
|
||||
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
|
||||
Window window = getWindow();
|
||||
|
||||
if (isChangeStatusBarIconColor()) {
|
||||
addOnOffsetChangedListener(appBarLayout);
|
||||
}
|
||||
|
||||
if (isImmersiveInterface()) {
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
|
||||
window.setDecorFitsSystemWindows(false);
|
||||
} else {
|
||||
window.setFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS, WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);
|
||||
}
|
||||
adjustToolbar(toolbar);
|
||||
|
||||
int navBarHeight = getNavBarHeight();
|
||||
if (navBarHeight > 0) {
|
||||
CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) fab.getLayoutParams();
|
||||
params.bottomMargin += navBarHeight;
|
||||
fab.setLayoutParams(params);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
setSupportActionBar(toolbar);
|
||||
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
|
||||
setToolbarGoToTop(toolbar);
|
||||
|
||||
mAccessToken = mCurrentAccountSharedPreferences.getString(SharedPreferencesUtils.ACCESS_TOKEN, null);
|
||||
mAccountName = mCurrentAccountSharedPreferences.getString(SharedPreferencesUtils.ACCOUNT_NAME, "-");
|
||||
mAccountQualifiedName = mCurrentAccountSharedPreferences.getString(SharedPreferencesUtils.ACCOUNT_QUALIFIED_NAME, "-");
|
||||
|
||||
if (savedInstanceState != null) {
|
||||
mInsertSuccess = savedInstanceState.getBoolean(INSERT_SUBSCRIBED_SUBREDDIT_STATE);
|
||||
mInsertMultiredditSuccess = savedInstanceState.getBoolean(INSERT_MULTIREDDIT_STATE);
|
||||
} else {
|
||||
showMultiReddits = getIntent().getBooleanExtra(EXTRA_SHOW_MULTIREDDITS, false);
|
||||
}
|
||||
|
||||
if (mAccessToken == null && Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
||||
searchEditText.setImeOptions(searchEditText.getImeOptions() | EditorInfoCompat.IME_FLAG_NO_PERSONALIZED_LEARNING);
|
||||
}
|
||||
|
||||
searchEditText.addTextChangedListener(new TextWatcher() {
|
||||
@Override
|
||||
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void afterTextChanged(Editable editable) {
|
||||
sectionsPagerAdapter.changeSearchQuery(editable.toString());
|
||||
}
|
||||
});
|
||||
initializeViewPagerAndLoadSubscriptions();
|
||||
}
|
||||
|
||||
@Override
|
||||
public SharedPreferences getDefaultSharedPreferences() {
|
||||
return mSharedPreferences;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected CustomThemeWrapper getCustomThemeWrapper() {
|
||||
return mCustomThemeWrapper;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void applyCustomTheme() {
|
||||
coordinatorLayout.setBackgroundColor(mCustomThemeWrapper.getBackgroundColor());
|
||||
applyAppBarLayoutAndCollapsingToolbarLayoutAndToolbarTheme(appBarLayout, collapsingToolbarLayout, toolbar);
|
||||
applyTabLayoutTheme(tabLayout);
|
||||
applyFABTheme(fab, mSharedPreferences.getBoolean(SharedPreferencesUtils.USE_CIRCULAR_FAB, false));
|
||||
searchEditText.setTextColor(mCustomThemeWrapper.getToolbarPrimaryTextAndIconColor());
|
||||
searchEditText.setHintTextColor(mCustomThemeWrapper.getToolbarSecondaryTextColor());
|
||||
}
|
||||
|
||||
private void initializeViewPagerAndLoadSubscriptions() {
|
||||
fab.setOnClickListener(view -> {
|
||||
Intent intent = new Intent(this, CreateMultiRedditActivity.class);
|
||||
startActivity(intent);
|
||||
});
|
||||
sectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());
|
||||
viewPager.setAdapter(sectionsPagerAdapter);
|
||||
viewPager.setOffscreenPageLimit(2);
|
||||
if (viewPager.getCurrentItem() != 2) {
|
||||
fab.hide();
|
||||
}
|
||||
viewPager.addOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
|
||||
@Override
|
||||
public void onPageSelected(int position) {
|
||||
if (position == 0) {
|
||||
unlockSwipeRightToGoBack();
|
||||
fab.hide();
|
||||
} else {
|
||||
lockSwipeRightToGoBack();
|
||||
if (position != 2) {
|
||||
fab.hide();
|
||||
} else {
|
||||
fab.show();
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
tabLayout.setupWithViewPager(viewPager);
|
||||
|
||||
if (showMultiReddits) {
|
||||
viewPager.setCurrentItem(2, false);
|
||||
}
|
||||
|
||||
loadBlocks(false);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onCreateOptionsMenu(Menu menu) {
|
||||
getMenuInflater().inflate(R.menu.subscribed_thing_listing_activity, menu);
|
||||
mMenu = menu;
|
||||
applyMenuItemTheme(menu);
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
|
||||
if (item.getItemId() == R.id.action_search_subscribed_thing_listing_activity) {
|
||||
item.setVisible(false);
|
||||
searchEditText.setVisibility(View.VISIBLE);
|
||||
searchEditText.requestFocus();
|
||||
if (searchEditText.requestFocus()) {
|
||||
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
|
||||
imm.showSoftInput(searchEditText, InputMethodManager.SHOW_IMPLICIT);
|
||||
}
|
||||
return true;
|
||||
} else if (item.getItemId() == android.R.id.home) {
|
||||
if (searchEditText.getVisibility() == View.VISIBLE) {
|
||||
Utils.hideKeyboard(this);
|
||||
searchEditText.setVisibility(View.GONE);
|
||||
searchEditText.setText("");
|
||||
mMenu.findItem(R.id.action_search_subscribed_thing_listing_activity).setVisible(true);
|
||||
sectionsPagerAdapter.changeSearchQuery("");
|
||||
return true;
|
||||
}
|
||||
finish();
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onBackPressed() {
|
||||
if (searchEditText.getVisibility() == View.VISIBLE) {
|
||||
Utils.hideKeyboard(this);
|
||||
searchEditText.setVisibility(View.GONE);
|
||||
searchEditText.setText("");
|
||||
mMenu.findItem(R.id.action_search_subscribed_thing_listing_activity).setVisible(true);
|
||||
sectionsPagerAdapter.changeSearchQuery("");
|
||||
} else {
|
||||
super.onBackPressed();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onSaveInstanceState(@NonNull Bundle outState) {
|
||||
super.onSaveInstanceState(outState);
|
||||
outState.putBoolean(INSERT_SUBSCRIBED_SUBREDDIT_STATE, mInsertSuccess);
|
||||
outState.putBoolean(INSERT_MULTIREDDIT_STATE, mInsertMultiredditSuccess);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onDestroy() {
|
||||
super.onDestroy();
|
||||
EventBus.getDefault().unregister(this);
|
||||
}
|
||||
|
||||
public void loadBlocks(boolean forceLoad) {
|
||||
if (mAccessToken != null && !(!forceLoad && mInsertSuccess)) {
|
||||
FetchBlockedThings.fetchBlockedThings(mRetrofit.getRetrofit(), mAccessToken, mAccountQualifiedName, new FetchBlockedThings.FetchBlockedThingsListener() {
|
||||
@Override
|
||||
public void onFetchBlockedThingsSuccess(List<BlockedUserData> blockedUsers, List<BlockedCommunityData> blockedCommunities) {
|
||||
InsertBlockedThings.insertBlockedThings(mExecutor, new Handler(), mRedditDataRoomDatabase, mAccountQualifiedName,
|
||||
blockedCommunities, blockedUsers, () -> {
|
||||
mInsertSuccess = true;
|
||||
sectionsPagerAdapter.stopRefreshProgressbar();
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onFetchBlockedThingsFailure() {
|
||||
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@Subscribe
|
||||
public void onAccountSwitchEvent(SwitchAccountEvent event) {
|
||||
finish();
|
||||
}
|
||||
|
||||
@Subscribe
|
||||
public void goBackToMainPageEvent(GoBackToMainPageEvent event) {
|
||||
finish();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onLongPress() {
|
||||
if (sectionsPagerAdapter != null) {
|
||||
sectionsPagerAdapter.goBackToTop();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void lockSwipeRightToGoBack() {
|
||||
if (mSliderPanel != null) {
|
||||
mSliderPanel.lock();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void unlockSwipeRightToGoBack() {
|
||||
if (mSliderPanel != null) {
|
||||
mSliderPanel.unlock();
|
||||
}
|
||||
}
|
||||
|
||||
private class SectionsPagerAdapter extends FragmentPagerAdapter {
|
||||
|
||||
private BlockedCommunitiesListingFragment blockedCommunitiesListingFragment;
|
||||
private BlockedUsersListingFragment followedUsersListingFragment;
|
||||
|
||||
public SectionsPagerAdapter(FragmentManager fm) {
|
||||
super(fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT);
|
||||
}
|
||||
|
||||
@NonNull
|
||||
@Override
|
||||
public Fragment getItem(int position) {
|
||||
switch (position) {
|
||||
default:
|
||||
case 0: {
|
||||
BlockedCommunitiesListingFragment fragment = new BlockedCommunitiesListingFragment();
|
||||
Bundle bundle = new Bundle();
|
||||
bundle.putBoolean(BlockedCommunitiesListingFragment.EXTRA_IS_SUBREDDIT_SELECTION, false);
|
||||
bundle.putString(BlockedCommunitiesListingFragment.EXTRA_ACCOUNT_NAME, mAccountName);
|
||||
bundle.putString(BlockedCommunitiesListingFragment.EXTRA_ACCOUNT_QUALIFIED_NAME, mAccountQualifiedName);
|
||||
bundle.putString(BlockedCommunitiesListingFragment.EXTRA_ACCESS_TOKEN, mAccessToken);
|
||||
fragment.setArguments(bundle);
|
||||
return fragment;
|
||||
}
|
||||
case 1: {
|
||||
BlockedUsersListingFragment fragment = new BlockedUsersListingFragment();
|
||||
Bundle bundle = new Bundle();
|
||||
bundle.putString(BlockedUsersListingFragment.EXTRA_ACCOUNT_NAME, mAccountQualifiedName);
|
||||
bundle.putString(BlockedUsersListingFragment.EXTRA_ACCESS_TOKEN, mAccessToken);
|
||||
fragment.setArguments(bundle);
|
||||
return fragment;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getCount() {
|
||||
return 2;
|
||||
}
|
||||
|
||||
@Override
|
||||
public CharSequence getPageTitle(int position) {
|
||||
switch (position) {
|
||||
case 0:
|
||||
return Utils.getTabTextWithCustomFont(typeface, getString(R.string.communities));
|
||||
case 1:
|
||||
return Utils.getTabTextWithCustomFont(typeface, getString(R.string.users));
|
||||
case 2:
|
||||
return Utils.getTabTextWithCustomFont(typeface, getString(R.string.multi_reddits));
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
@NonNull
|
||||
@Override
|
||||
public Object instantiateItem(@NonNull ViewGroup container, int position) {
|
||||
Fragment fragment = (Fragment) super.instantiateItem(container, position);
|
||||
if (position == 0) {
|
||||
blockedCommunitiesListingFragment = (BlockedCommunitiesListingFragment) fragment;
|
||||
} else if (position == 1) {
|
||||
followedUsersListingFragment = (BlockedUsersListingFragment) fragment;
|
||||
}
|
||||
|
||||
return fragment;
|
||||
}
|
||||
|
||||
void stopRefreshProgressbar() {
|
||||
if (blockedCommunitiesListingFragment != null) {
|
||||
((FragmentCommunicator) blockedCommunitiesListingFragment).stopRefreshProgressbar();
|
||||
}
|
||||
if (followedUsersListingFragment != null) {
|
||||
((FragmentCommunicator) followedUsersListingFragment).stopRefreshProgressbar();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void goBackToTop() {
|
||||
if (viewPager.getCurrentItem() == 0) {
|
||||
blockedCommunitiesListingFragment.goBackToTop();
|
||||
} else if (viewPager.getCurrentItem() == 1) {
|
||||
followedUsersListingFragment.goBackToTop();
|
||||
}
|
||||
}
|
||||
|
||||
void changeSearchQuery(String searchQuery) {
|
||||
if (blockedCommunitiesListingFragment != null) {
|
||||
blockedCommunitiesListingFragment.changeSearchQuery(searchQuery);
|
||||
}
|
||||
if (followedUsersListingFragment != null) {
|
||||
followedUsersListingFragment.changeSearchQuery(searchQuery);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -79,9 +79,9 @@ public class LinkResolverActivity extends AppCompatActivity {
|
||||
|
||||
private Uri getRedditUriByPath(String path) {
|
||||
if (path.charAt(0) != '/') {
|
||||
return Uri.parse("https://www.reddit.com/" + path);
|
||||
return Uri.parse(mRetrofit.getBaseURL() + path);
|
||||
} else {
|
||||
return Uri.parse("https://www.reddit.com" + path);
|
||||
return Uri.parse(mRetrofit.getBaseURL() + path);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -882,6 +882,8 @@ public class MainActivity extends BaseActivity implements SortTypeSelectionCallb
|
||||
});
|
||||
} else if (stringId == R.string.anonymous_account_instance) {
|
||||
changeAnonymousAccountInstance();
|
||||
} else if (stringId == R.string.blocks) {
|
||||
intent = new Intent(MainActivity.this, BlockedThingListingActivity.class);
|
||||
}
|
||||
if (intent != null) {
|
||||
startActivity(intent);
|
||||
|
@ -73,7 +73,6 @@ import eu.toldi.infinityforlemmy.utils.SharedPreferencesUtils;
|
||||
import eu.toldi.infinityforlemmy.utils.Utils;
|
||||
import retrofit2.Retrofit;
|
||||
|
||||
;
|
||||
|
||||
public class SubscribedThingListingActivity extends BaseActivity implements ActivityToolbarInterface {
|
||||
|
||||
|
@ -82,6 +82,7 @@ import eu.toldi.infinityforlemmy.bottomsheetfragments.RandomBottomSheetFragment;
|
||||
import eu.toldi.infinityforlemmy.bottomsheetfragments.SortTimeBottomSheetFragment;
|
||||
import eu.toldi.infinityforlemmy.bottomsheetfragments.SortTypeBottomSheetFragment;
|
||||
import eu.toldi.infinityforlemmy.bottomsheetfragments.UrlMenuBottomSheetFragment;
|
||||
import eu.toldi.infinityforlemmy.community.BlockCommunity;
|
||||
import eu.toldi.infinityforlemmy.customtheme.CustomThemeWrapper;
|
||||
import eu.toldi.infinityforlemmy.customviews.NavigationWrapper;
|
||||
import eu.toldi.infinityforlemmy.customviews.slidr.Slidr;
|
||||
@ -210,6 +211,8 @@ public class ViewSubredditDetailActivity extends BaseActivity implements SortTyp
|
||||
private String communityName;
|
||||
|
||||
private int communityId;
|
||||
|
||||
private SubredditData communityData;
|
||||
private String description;
|
||||
|
||||
private String qualifiedName;
|
||||
@ -693,6 +696,7 @@ public class ViewSubredditDetailActivity extends BaseActivity implements SortTyp
|
||||
}
|
||||
setupVisibleElements();
|
||||
communityId = communityData.getId();
|
||||
ViewSubredditDetailActivity.this.communityData = communityData;
|
||||
setupSubscribeChip();
|
||||
|
||||
mNCurrentOnlineSubscribers = nCurrentOnlineSubscribers;
|
||||
@ -1123,6 +1127,11 @@ public class ViewSubredditDetailActivity extends BaseActivity implements SortTyp
|
||||
@Override
|
||||
public boolean onCreateOptionsMenu(Menu menu) {
|
||||
getMenuInflater().inflate(R.menu.view_subreddit_detail_activity, menu);
|
||||
if (communityData != null && communityData.isBlocked()) {
|
||||
menu.findItem(R.id.block_community_view_subreddit_detail_activity).setVisible(false);
|
||||
} else {
|
||||
menu.findItem(R.id.unblock_community_view_subreddit_detail_activity).setVisible(false);
|
||||
}
|
||||
applyMenuItemTheme(menu);
|
||||
return true;
|
||||
}
|
||||
@ -1151,22 +1160,6 @@ public class ViewSubredditDetailActivity extends BaseActivity implements SortTyp
|
||||
PostLayoutBottomSheetFragment postLayoutBottomSheetFragment = new PostLayoutBottomSheetFragment();
|
||||
postLayoutBottomSheetFragment.show(getSupportFragmentManager(), postLayoutBottomSheetFragment.getTag());
|
||||
return true;
|
||||
} else if (itemId == R.id.action_select_user_flair_view_subreddit_detail_activity) {
|
||||
if (mAccessToken == null) {
|
||||
Toast.makeText(this, R.string.login_first, Toast.LENGTH_SHORT).show();
|
||||
return true;
|
||||
}
|
||||
Intent selectUserFlairIntent = new Intent(this, SelectUserFlairActivity.class);
|
||||
selectUserFlairIntent.putExtra(SelectUserFlairActivity.EXTRA_SUBREDDIT_NAME, communityName);
|
||||
startActivity(selectUserFlairIntent);
|
||||
return true;
|
||||
} else if (itemId == R.id.action_add_to_multireddit_view_subreddit_detail_activity) {
|
||||
if (mAccessToken == null) {
|
||||
Toast.makeText(this, R.string.login_first, Toast.LENGTH_SHORT).show();
|
||||
return true;
|
||||
}
|
||||
Intent intent = new Intent(this, MultiredditSelectionActivity.class);
|
||||
startActivityForResult(intent, ADD_TO_MULTIREDDIT_REQUEST_CODE);
|
||||
} else if (itemId == R.id.action_add_to_post_filter_view_subreddit_detail_activity) {
|
||||
Intent intent = new Intent(this, PostFilterPreferenceActivity.class);
|
||||
intent.putExtra(PostFilterPreferenceActivity.EXTRA_SUBREDDIT_NAME, communityName);
|
||||
@ -1183,16 +1176,42 @@ public class ViewSubredditDetailActivity extends BaseActivity implements SortTyp
|
||||
Toast.makeText(this, R.string.no_app, Toast.LENGTH_SHORT).show();
|
||||
}
|
||||
return true;
|
||||
} else if (itemId == R.id.action_go_to_wiki_view_subreddit_detail_activity) {
|
||||
Intent wikiIntent = new Intent(this, WikiActivity.class);
|
||||
wikiIntent.putExtra(WikiActivity.EXTRA_SUBREDDIT_NAME, communityName);
|
||||
wikiIntent.putExtra(WikiActivity.EXTRA_WIKI_PATH, "index");
|
||||
startActivity(wikiIntent);
|
||||
return true;
|
||||
} else if (itemId == R.id.action_contact_mods_view_subreddit_detail_activity) {
|
||||
Intent intent = new Intent(this, SendPrivateMessageActivity.class);
|
||||
intent.putExtra(SendPrivateMessageActivity.EXTRA_RECIPIENT_USERNAME, "r/" + communityName);
|
||||
startActivity(intent);
|
||||
//startActivity(intent);
|
||||
return true;
|
||||
} else if (itemId == R.id.block_community_view_subreddit_detail_activity) {
|
||||
BlockCommunity.INSTANCE.blockCommunity(mRetrofit.getRetrofit(), communityId, mAccessToken, new BlockCommunity.BlockCommunityListener() {
|
||||
@Override
|
||||
public void onBlockCommunitySuccess() {
|
||||
communityData.setBlocked(true);
|
||||
Toast.makeText(ViewSubredditDetailActivity.this, R.string.block_community_success, Toast.LENGTH_SHORT).show();
|
||||
ViewSubredditDetailActivity.this.invalidateOptionsMenu();
|
||||
sectionsPagerAdapter.refresh(false);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onBlockCommunityError() {
|
||||
Toast.makeText(ViewSubredditDetailActivity.this, R.string.block_community_failed, Toast.LENGTH_SHORT).show();
|
||||
}
|
||||
});
|
||||
return true;
|
||||
} else if (itemId == R.id.unblock_community_view_subreddit_detail_activity) {
|
||||
BlockCommunity.INSTANCE.unBlockCommunity(mRetrofit.getRetrofit(), communityId, mAccessToken, new BlockCommunity.BlockCommunityListener() {
|
||||
@Override
|
||||
public void onBlockCommunitySuccess() {
|
||||
communityData.setBlocked(false);
|
||||
Toast.makeText(ViewSubredditDetailActivity.this, R.string.unblock_community_success, Toast.LENGTH_SHORT).show();
|
||||
ViewSubredditDetailActivity.this.invalidateOptionsMenu();
|
||||
sectionsPagerAdapter.refresh(false);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onBlockCommunityError() {
|
||||
Toast.makeText(ViewSubredditDetailActivity.this, R.string.unblock_community_failed, Toast.LENGTH_SHORT).show();
|
||||
}
|
||||
});
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
|
@ -52,6 +52,7 @@ import org.greenrobot.eventbus.EventBus;
|
||||
import org.greenrobot.eventbus.Subscribe;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
import java.util.concurrent.Executor;
|
||||
|
||||
@ -71,11 +72,14 @@ import eu.toldi.infinityforlemmy.RedditDataRoomDatabase;
|
||||
import eu.toldi.infinityforlemmy.RetrofitHolder;
|
||||
import eu.toldi.infinityforlemmy.SortType;
|
||||
import eu.toldi.infinityforlemmy.SortTypeSelectionCallback;
|
||||
import eu.toldi.infinityforlemmy.account.FetchBlockedThings;
|
||||
import eu.toldi.infinityforlemmy.adapters.SubredditAutocompleteRecyclerViewAdapter;
|
||||
import eu.toldi.infinityforlemmy.apis.RedditAPI;
|
||||
import eu.toldi.infinityforlemmy.asynctasks.AddSubredditOrUserToMultiReddit;
|
||||
import eu.toldi.infinityforlemmy.asynctasks.CheckIsFollowingUser;
|
||||
import eu.toldi.infinityforlemmy.asynctasks.SwitchAccount;
|
||||
import eu.toldi.infinityforlemmy.blockedcommunity.BlockedCommunityData;
|
||||
import eu.toldi.infinityforlemmy.blockeduser.BlockedUserData;
|
||||
import eu.toldi.infinityforlemmy.bottomsheetfragments.CopyTextBottomSheetFragment;
|
||||
import eu.toldi.infinityforlemmy.bottomsheetfragments.FABMoreOptionsBottomSheetFragment;
|
||||
import eu.toldi.infinityforlemmy.bottomsheetfragments.PostLayoutBottomSheetFragment;
|
||||
@ -237,9 +241,10 @@ public class ViewUserDetailActivity extends BaseActivity implements SortTypeSele
|
||||
private int mMessageId;
|
||||
private String mNewAccountName;
|
||||
|
||||
|
||||
private UserData mUserData;
|
||||
|
||||
private boolean isBlocked;
|
||||
|
||||
//private MaterialAlertDialogBuilder nsfwWarningBuilder;
|
||||
|
||||
@Override
|
||||
@ -1091,6 +1096,25 @@ public class ViewUserDetailActivity extends BaseActivity implements SortTypeSele
|
||||
setupVisibleElements();
|
||||
new ViewUserDetailActivity.InsertUserDataAsyncTask(mRedditDataRoomDatabase.userDao(), userData,
|
||||
() -> mFetchUserInfoSuccess = true).execute();
|
||||
FetchBlockedThings.fetchBlockedThings(mRetrofit.getRetrofit(), mAccessToken, mAccountQualifiedName, new FetchBlockedThings.FetchBlockedThingsListener() {
|
||||
|
||||
@Override
|
||||
public void onFetchBlockedThingsSuccess(List<BlockedUserData> blockedUsers, List<BlockedCommunityData> blockedCommunities) {
|
||||
for (BlockedUserData blockedUserData : blockedUsers) {
|
||||
if (blockedUserData.getQualifiedName().equals(qualifiedName)) {
|
||||
isBlocked = true;
|
||||
invalidateOptionsMenu();
|
||||
return;
|
||||
}
|
||||
}
|
||||
isBlocked = false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onFetchBlockedThingsFailure() {
|
||||
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -1131,6 +1155,12 @@ public class ViewUserDetailActivity extends BaseActivity implements SortTypeSele
|
||||
menu.findItem(R.id.action_block_user_view_user_detail_activity).setVisible(false);
|
||||
} else {
|
||||
menu.findItem(R.id.action_edit_profile_view_user_detail_activity).setVisible(false);
|
||||
if (isBlocked) {
|
||||
menu.findItem(R.id.action_block_user_view_user_detail_activity).setVisible(false);
|
||||
menu.findItem(R.id.action_unblock_user_view_user_detail_activity).setVisible(true);
|
||||
} else {
|
||||
menu.findItem(R.id.action_unblock_user_view_user_detail_activity).setVisible(false);
|
||||
}
|
||||
}
|
||||
applyMenuItemTheme(menu);
|
||||
return true;
|
||||
@ -1182,13 +1212,6 @@ public class ViewUserDetailActivity extends BaseActivity implements SortTypeSele
|
||||
pmIntent.putExtra(SendPrivateMessageActivity.EXTRA_RECIPIENT_USERNAME, username);
|
||||
startActivity(pmIntent);
|
||||
return true;
|
||||
} else if (itemId == R.id.action_add_to_multireddit_view_user_detail_activity) {
|
||||
if (mAccessToken == null) {
|
||||
Toast.makeText(this, R.string.login_first, Toast.LENGTH_SHORT).show();
|
||||
return true;
|
||||
}
|
||||
Intent intent = new Intent(this, MultiredditSelectionActivity.class);
|
||||
startActivityForResult(intent, ADD_TO_MULTIREDDIT_REQUEST_CODE);
|
||||
} else if (itemId == R.id.action_add_to_post_filter_view_user_detail_activity) {
|
||||
Intent intent = new Intent(this, PostFilterPreferenceActivity.class);
|
||||
intent.putExtra(PostFilterPreferenceActivity.EXTRA_USER_NAME, username);
|
||||
@ -1209,10 +1232,13 @@ public class ViewUserDetailActivity extends BaseActivity implements SortTypeSele
|
||||
.setTitle(R.string.block_user)
|
||||
.setMessage(R.string.are_you_sure)
|
||||
.setPositiveButton(R.string.yes, (dialogInterface, i)
|
||||
-> BlockUser.blockUser(mOauthRetrofit, mAccessToken, username, new BlockUser.BlockUserListener() {
|
||||
-> BlockUser.blockUser(mRetrofit.getRetrofit(), mAccessToken, mUserData.getId(), true, new BlockUser.BlockUserListener() {
|
||||
@Override
|
||||
public void success() {
|
||||
Toast.makeText(ViewUserDetailActivity.this, R.string.block_user_success, Toast.LENGTH_SHORT).show();
|
||||
isBlocked = true;
|
||||
sectionsPagerAdapter.refresh();
|
||||
invalidateOptionsMenu();
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -1226,6 +1252,25 @@ public class ViewUserDetailActivity extends BaseActivity implements SortTypeSele
|
||||
} else if (itemId == R.id.action_edit_profile_view_user_detail_activity) {
|
||||
startActivity(new Intent(this, EditProfileActivity.class));
|
||||
return true;
|
||||
} else if (itemId == R.id.action_unblock_user_view_user_detail_activity) {
|
||||
if (mAccessToken == null) {
|
||||
Toast.makeText(this, R.string.login_first, Toast.LENGTH_SHORT).show();
|
||||
return true;
|
||||
}
|
||||
BlockUser.blockUser(mRetrofit.getRetrofit(), mAccessToken, mUserData.getId(), false, new BlockUser.BlockUserListener() {
|
||||
@Override
|
||||
public void success() {
|
||||
isBlocked = false;
|
||||
Toast.makeText(ViewUserDetailActivity.this, R.string.unblock_user_success, Toast.LENGTH_SHORT).show();
|
||||
sectionsPagerAdapter.refresh();
|
||||
invalidateOptionsMenu();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void failed() {
|
||||
Toast.makeText(ViewUserDetailActivity.this, R.string.unblock_user_failed, Toast.LENGTH_SHORT).show();
|
||||
}
|
||||
});
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
@ -0,0 +1,377 @@
|
||||
package eu.toldi.infinityforlemmy.adapters;
|
||||
|
||||
import android.content.Intent;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
import com.bumptech.glide.Glide;
|
||||
import com.bumptech.glide.RequestManager;
|
||||
import com.bumptech.glide.request.RequestOptions;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.concurrent.Executor;
|
||||
|
||||
import butterknife.BindView;
|
||||
import butterknife.ButterKnife;
|
||||
import eu.toldi.infinityforlemmy.R;
|
||||
import eu.toldi.infinityforlemmy.RedditDataRoomDatabase;
|
||||
import eu.toldi.infinityforlemmy.activities.BaseActivity;
|
||||
import eu.toldi.infinityforlemmy.activities.ViewSubredditDetailActivity;
|
||||
import eu.toldi.infinityforlemmy.blockedcommunity.BlockedCommunityData;
|
||||
import eu.toldi.infinityforlemmy.customtheme.CustomThemeWrapper;
|
||||
import jp.wasabeef.glide.transformations.RoundedCornersTransformation;
|
||||
import me.zhanghai.android.fastscroll.PopupTextProvider;
|
||||
import pl.droidsonroids.gif.GifImageView;
|
||||
import retrofit2.Retrofit;
|
||||
|
||||
public class BlockedCommunitiesRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> implements PopupTextProvider {
|
||||
private static final int VIEW_TYPE_FAVORITE_SUBREDDIT_DIVIDER = 0;
|
||||
private static final int VIEW_TYPE_FAVORITE_SUBREDDIT = 1;
|
||||
private static final int VIEW_TYPE_SUBREDDIT_DIVIDER = 2;
|
||||
private static final int VIEW_TYPE_SUBREDDIT = 3;
|
||||
|
||||
private BaseActivity mActivity;
|
||||
private Executor mExecutor;
|
||||
private Retrofit mOauthRetrofit;
|
||||
private RedditDataRoomDatabase mRedditDataRoomDatabase;
|
||||
private List<BlockedCommunityData> mBlockedCommunityData;
|
||||
private List<BlockedCommunityData> mFavoriteBlockedCommunityData;
|
||||
private RequestManager glide;
|
||||
private ItemClickListener itemClickListener;
|
||||
|
||||
private String accessToken;
|
||||
private String username;
|
||||
private String userIconUrl;
|
||||
private boolean hasClearSelectionRow;
|
||||
|
||||
private int primaryTextColor;
|
||||
private int secondaryTextColor;
|
||||
|
||||
public BlockedCommunitiesRecyclerViewAdapter(BaseActivity activity, Executor executor, Retrofit oauthRetrofit,
|
||||
RedditDataRoomDatabase redditDataRoomDatabase,
|
||||
CustomThemeWrapper customThemeWrapper,
|
||||
String accessToken) {
|
||||
mActivity = activity;
|
||||
mExecutor = executor;
|
||||
glide = Glide.with(activity);
|
||||
mOauthRetrofit = oauthRetrofit;
|
||||
mRedditDataRoomDatabase = redditDataRoomDatabase;
|
||||
this.accessToken = accessToken;
|
||||
primaryTextColor = customThemeWrapper.getPrimaryTextColor();
|
||||
secondaryTextColor = customThemeWrapper.getSecondaryTextColor();
|
||||
}
|
||||
|
||||
public BlockedCommunitiesRecyclerViewAdapter(BaseActivity activity, Executor executor, Retrofit oauthRetrofit,
|
||||
RedditDataRoomDatabase redditDataRoomDatabase,
|
||||
CustomThemeWrapper customThemeWrapper,
|
||||
String accessToken, boolean hasClearSelectionRow,
|
||||
ItemClickListener itemClickListener) {
|
||||
this(activity, executor, oauthRetrofit, redditDataRoomDatabase, customThemeWrapper, accessToken);
|
||||
this.hasClearSelectionRow = hasClearSelectionRow;
|
||||
this.itemClickListener = itemClickListener;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getItemViewType(int position) {
|
||||
if (mFavoriteBlockedCommunityData != null && mFavoriteBlockedCommunityData.size() > 0) {
|
||||
if (itemClickListener != null && !hasClearSelectionRow) {
|
||||
if (position == 0) {
|
||||
return VIEW_TYPE_SUBREDDIT;
|
||||
} else if (position == 1) {
|
||||
return VIEW_TYPE_FAVORITE_SUBREDDIT_DIVIDER;
|
||||
} else if (position == mFavoriteBlockedCommunityData.size() + 2) {
|
||||
return VIEW_TYPE_SUBREDDIT_DIVIDER;
|
||||
} else if (position <= mFavoriteBlockedCommunityData.size() + 1) {
|
||||
return VIEW_TYPE_FAVORITE_SUBREDDIT;
|
||||
} else {
|
||||
return VIEW_TYPE_SUBREDDIT;
|
||||
}
|
||||
} else if (hasClearSelectionRow) {
|
||||
if (position == 0) {
|
||||
return VIEW_TYPE_SUBREDDIT;
|
||||
} else if (position == 1) {
|
||||
return VIEW_TYPE_SUBREDDIT;
|
||||
} else if (position == 2) {
|
||||
return VIEW_TYPE_FAVORITE_SUBREDDIT_DIVIDER;
|
||||
} else if (position == mFavoriteBlockedCommunityData.size() + 3) {
|
||||
return VIEW_TYPE_SUBREDDIT_DIVIDER;
|
||||
} else if (position <= mFavoriteBlockedCommunityData.size() + 2) {
|
||||
return VIEW_TYPE_FAVORITE_SUBREDDIT;
|
||||
} else {
|
||||
return VIEW_TYPE_SUBREDDIT;
|
||||
}
|
||||
} else {
|
||||
if (position == 0) {
|
||||
return VIEW_TYPE_FAVORITE_SUBREDDIT_DIVIDER;
|
||||
} else if (position == mFavoriteBlockedCommunityData.size() + 1) {
|
||||
return VIEW_TYPE_SUBREDDIT_DIVIDER;
|
||||
} else if (position <= mFavoriteBlockedCommunityData.size()) {
|
||||
return VIEW_TYPE_FAVORITE_SUBREDDIT;
|
||||
} else {
|
||||
return VIEW_TYPE_SUBREDDIT;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
return VIEW_TYPE_SUBREDDIT;
|
||||
}
|
||||
}
|
||||
|
||||
@NonNull
|
||||
@Override
|
||||
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
|
||||
switch (i) {
|
||||
case VIEW_TYPE_FAVORITE_SUBREDDIT_DIVIDER:
|
||||
return new FavoriteSubredditsDividerViewHolder(LayoutInflater.from(viewGroup.getContext())
|
||||
.inflate(R.layout.item_favorite_thing_divider, viewGroup, false));
|
||||
case VIEW_TYPE_FAVORITE_SUBREDDIT:
|
||||
return new FavoriteSubredditViewHolder(LayoutInflater.from(viewGroup.getContext())
|
||||
.inflate(R.layout.item_subscribed_thing, viewGroup, false));
|
||||
case VIEW_TYPE_SUBREDDIT_DIVIDER:
|
||||
return new AllSubredditsDividerViewHolder(LayoutInflater.from(viewGroup.getContext())
|
||||
.inflate(R.layout.item_favorite_thing_divider, viewGroup, false));
|
||||
default:
|
||||
return new SubredditViewHolder(LayoutInflater.from(viewGroup.getContext())
|
||||
.inflate(R.layout.item_subscribed_thing, viewGroup, false));
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onBindViewHolder(@NonNull final RecyclerView.ViewHolder viewHolder, int i) {
|
||||
if (viewHolder instanceof SubredditViewHolder) {
|
||||
String name;
|
||||
String fullname = "";
|
||||
String iconUrl;
|
||||
|
||||
if (hasClearSelectionRow && viewHolder.getBindingAdapterPosition() == 0) {
|
||||
((SubredditViewHolder) viewHolder).subredditNameTextView.setText(R.string.all_communities);
|
||||
viewHolder.itemView.setOnClickListener(view -> itemClickListener.onClick(null));
|
||||
return;
|
||||
} else {
|
||||
int offset = hasClearSelectionRow ? 1 : 0;
|
||||
BlockedCommunityData communityData = mBlockedCommunityData.get(viewHolder.getBindingAdapterPosition() - offset);
|
||||
name = mBlockedCommunityData.get(viewHolder.getBindingAdapterPosition() - offset).getName();
|
||||
fullname = mBlockedCommunityData.get(viewHolder.getBindingAdapterPosition() - offset).getQualified_name();
|
||||
iconUrl = mBlockedCommunityData.get(viewHolder.getBindingAdapterPosition() - offset).getIconUrl();
|
||||
|
||||
if (itemClickListener != null) {
|
||||
viewHolder.itemView.setOnClickListener(view -> itemClickListener.onClick(communityData));
|
||||
}
|
||||
}
|
||||
|
||||
if (itemClickListener == null) {
|
||||
String finalFullname = fullname;
|
||||
viewHolder.itemView.setOnClickListener(view -> {
|
||||
Intent intent = new Intent(mActivity, ViewSubredditDetailActivity.class);
|
||||
intent.putExtra(ViewSubredditDetailActivity.EXTRA_SUBREDDIT_NAME_KEY, name);
|
||||
intent.putExtra(ViewSubredditDetailActivity.EXTRA_COMMUNITY_FULL_NAME_KEY,
|
||||
finalFullname);
|
||||
mActivity.startActivity(intent);
|
||||
});
|
||||
}
|
||||
|
||||
if (iconUrl != null && !iconUrl.equals("")) {
|
||||
glide.load(iconUrl)
|
||||
.apply(RequestOptions.bitmapTransform(new RoundedCornersTransformation(72, 0)))
|
||||
.error(glide.load(R.drawable.subreddit_default_icon)
|
||||
.apply(RequestOptions.bitmapTransform(new RoundedCornersTransformation(72, 0))))
|
||||
.into(((SubredditViewHolder) viewHolder).iconGifImageView);
|
||||
} else {
|
||||
glide.load(R.drawable.subreddit_default_icon)
|
||||
.apply(RequestOptions.bitmapTransform(new RoundedCornersTransformation(72, 0)))
|
||||
.into(((SubredditViewHolder) viewHolder).iconGifImageView);
|
||||
}
|
||||
((SubredditViewHolder) viewHolder).subredditNameTextView.setText(name);
|
||||
} else if (viewHolder instanceof FavoriteSubredditViewHolder) {
|
||||
int offset;
|
||||
if (itemClickListener != null) {
|
||||
if (hasClearSelectionRow) {
|
||||
offset = 3;
|
||||
} else {
|
||||
offset = 2;
|
||||
}
|
||||
} else {
|
||||
offset = 1;
|
||||
}
|
||||
BlockedCommunityData communityData = mFavoriteBlockedCommunityData.get(viewHolder.getBindingAdapterPosition() - offset);
|
||||
String name = mFavoriteBlockedCommunityData.get(viewHolder.getBindingAdapterPosition() - offset).getName();
|
||||
String iconUrl = mFavoriteBlockedCommunityData.get(viewHolder.getBindingAdapterPosition() - offset).getIconUrl();
|
||||
|
||||
if (itemClickListener != null) {
|
||||
viewHolder.itemView.setOnClickListener(view -> itemClickListener.onClick(communityData));
|
||||
} else {
|
||||
viewHolder.itemView.setOnClickListener(view -> {
|
||||
Intent intent = new Intent(mActivity, ViewSubredditDetailActivity.class);
|
||||
intent.putExtra(ViewSubredditDetailActivity.EXTRA_SUBREDDIT_NAME_KEY, name);
|
||||
mActivity.startActivity(intent);
|
||||
});
|
||||
}
|
||||
|
||||
if (iconUrl != null && !iconUrl.equals("")) {
|
||||
glide.load(iconUrl)
|
||||
.apply(RequestOptions.bitmapTransform(new RoundedCornersTransformation(72, 0)))
|
||||
.error(glide.load(R.drawable.subreddit_default_icon)
|
||||
.apply(RequestOptions.bitmapTransform(new RoundedCornersTransformation(72, 0))))
|
||||
.into(((FavoriteSubredditViewHolder) viewHolder).iconGifImageView);
|
||||
} else {
|
||||
glide.load(R.drawable.subreddit_default_icon)
|
||||
.apply(RequestOptions.bitmapTransform(new RoundedCornersTransformation(72, 0)))
|
||||
.into(((FavoriteSubredditViewHolder) viewHolder).iconGifImageView);
|
||||
}
|
||||
((FavoriteSubredditViewHolder) viewHolder).subredditNameTextView.setText(name);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getItemCount() {
|
||||
if (mBlockedCommunityData != null) {
|
||||
|
||||
if (itemClickListener != null) {
|
||||
return mBlockedCommunityData.size() > 0 ? mBlockedCommunityData.size() + ((hasClearSelectionRow) ? 1 : 0) : 0;
|
||||
}
|
||||
|
||||
return mBlockedCommunityData.size();
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onViewRecycled(@NonNull RecyclerView.ViewHolder holder) {
|
||||
if (holder instanceof SubredditViewHolder) {
|
||||
glide.clear(((SubredditViewHolder) holder).iconGifImageView);
|
||||
} else if (holder instanceof FavoriteSubredditViewHolder) {
|
||||
glide.clear(((FavoriteSubredditViewHolder) holder).iconGifImageView);
|
||||
}
|
||||
}
|
||||
|
||||
public void setSubscribedSubreddits(List<BlockedCommunityData> subscribedSubreddits) {
|
||||
mBlockedCommunityData = subscribedSubreddits;
|
||||
notifyDataSetChanged();
|
||||
}
|
||||
|
||||
public void setFavoriteSubscribedSubreddits(List<BlockedCommunityData> favoriteBlockedCommunityData) {
|
||||
mFavoriteBlockedCommunityData = favoriteBlockedCommunityData;
|
||||
notifyDataSetChanged();
|
||||
}
|
||||
|
||||
public void addUser(String username, String userIconUrl) {
|
||||
this.username = username;
|
||||
this.userIconUrl = userIconUrl;
|
||||
}
|
||||
|
||||
@NonNull
|
||||
@Override
|
||||
public String getPopupText(int position) {
|
||||
switch (getItemViewType(position)) {
|
||||
case VIEW_TYPE_SUBREDDIT:
|
||||
if (hasClearSelectionRow && position == 0) {
|
||||
return "";
|
||||
} else if (itemClickListener != null && !hasClearSelectionRow && position == 0) {
|
||||
return "";
|
||||
} else if (hasClearSelectionRow && position == 1) {
|
||||
return "";
|
||||
} else {
|
||||
int offset;
|
||||
if (itemClickListener != null) {
|
||||
if (hasClearSelectionRow) {
|
||||
offset = (mFavoriteBlockedCommunityData != null && mFavoriteBlockedCommunityData.size() > 0) ?
|
||||
mFavoriteBlockedCommunityData.size() + 4 : 0;
|
||||
} else {
|
||||
offset = (mFavoriteBlockedCommunityData != null && mFavoriteBlockedCommunityData.size() > 0) ?
|
||||
mFavoriteBlockedCommunityData.size() + 3 : 0;
|
||||
}
|
||||
} else {
|
||||
offset = (mFavoriteBlockedCommunityData != null && mFavoriteBlockedCommunityData.size() > 0) ?
|
||||
mFavoriteBlockedCommunityData.size() + 2 : 0;
|
||||
}
|
||||
|
||||
return mBlockedCommunityData.get(position - offset).getName().substring(0, 1).toUpperCase();
|
||||
}
|
||||
case VIEW_TYPE_FAVORITE_SUBREDDIT:
|
||||
int offset;
|
||||
if (itemClickListener != null) {
|
||||
if (hasClearSelectionRow) {
|
||||
offset = 3;
|
||||
} else {
|
||||
offset = 2;
|
||||
}
|
||||
} else {
|
||||
offset = 1;
|
||||
}
|
||||
return mFavoriteBlockedCommunityData.get(position - offset).getName().substring(0, 1).toUpperCase();
|
||||
default:
|
||||
return "";
|
||||
}
|
||||
}
|
||||
|
||||
public interface ItemClickListener {
|
||||
void onClick(BlockedCommunityData subredditData);
|
||||
}
|
||||
|
||||
class SubredditViewHolder extends RecyclerView.ViewHolder {
|
||||
@BindView(R.id.thing_icon_gif_image_view_item_subscribed_thing)
|
||||
GifImageView iconGifImageView;
|
||||
@BindView(R.id.thing_name_text_view_item_subscribed_thing)
|
||||
TextView subredditNameTextView;
|
||||
|
||||
SubredditViewHolder(View itemView) {
|
||||
super(itemView);
|
||||
ButterKnife.bind(this, itemView);
|
||||
if (mActivity.typeface != null) {
|
||||
subredditNameTextView.setTypeface(mActivity.typeface);
|
||||
}
|
||||
subredditNameTextView.setTextColor(primaryTextColor);
|
||||
}
|
||||
}
|
||||
|
||||
class FavoriteSubredditViewHolder extends RecyclerView.ViewHolder {
|
||||
@BindView(R.id.thing_icon_gif_image_view_item_subscribed_thing)
|
||||
GifImageView iconGifImageView;
|
||||
@BindView(R.id.thing_name_text_view_item_subscribed_thing)
|
||||
TextView subredditNameTextView;
|
||||
|
||||
FavoriteSubredditViewHolder(View itemView) {
|
||||
super(itemView);
|
||||
ButterKnife.bind(this, itemView);
|
||||
if (mActivity.typeface != null) {
|
||||
subredditNameTextView.setTypeface(mActivity.typeface);
|
||||
}
|
||||
subredditNameTextView.setTextColor(primaryTextColor);
|
||||
}
|
||||
}
|
||||
|
||||
class FavoriteSubredditsDividerViewHolder extends RecyclerView.ViewHolder {
|
||||
@BindView(R.id.divider_text_view_item_favorite_thing_divider)
|
||||
TextView dividerTextView;
|
||||
|
||||
FavoriteSubredditsDividerViewHolder(@NonNull View itemView) {
|
||||
super(itemView);
|
||||
ButterKnife.bind(this, itemView);
|
||||
if (mActivity.typeface != null) {
|
||||
dividerTextView.setTypeface(mActivity.typeface);
|
||||
}
|
||||
dividerTextView.setText(R.string.favorites);
|
||||
dividerTextView.setTextColor(secondaryTextColor);
|
||||
}
|
||||
}
|
||||
|
||||
class AllSubredditsDividerViewHolder extends RecyclerView.ViewHolder {
|
||||
@BindView(R.id.divider_text_view_item_favorite_thing_divider)
|
||||
TextView dividerTextView;
|
||||
|
||||
AllSubredditsDividerViewHolder(@NonNull View itemView) {
|
||||
super(itemView);
|
||||
ButterKnife.bind(this, itemView);
|
||||
if (mActivity.typeface != null) {
|
||||
dividerTextView.setTypeface(mActivity.typeface);
|
||||
}
|
||||
dividerTextView.setText(R.string.all);
|
||||
dividerTextView.setTextColor(secondaryTextColor);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -0,0 +1,216 @@
|
||||
package eu.toldi.infinityforlemmy.adapters;
|
||||
|
||||
import android.content.Intent;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
import com.bumptech.glide.Glide;
|
||||
import com.bumptech.glide.RequestManager;
|
||||
import com.bumptech.glide.request.RequestOptions;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.concurrent.Executor;
|
||||
|
||||
import butterknife.BindView;
|
||||
import butterknife.ButterKnife;
|
||||
import eu.toldi.infinityforlemmy.R;
|
||||
import eu.toldi.infinityforlemmy.RedditDataRoomDatabase;
|
||||
import eu.toldi.infinityforlemmy.activities.BaseActivity;
|
||||
import eu.toldi.infinityforlemmy.activities.ViewUserDetailActivity;
|
||||
import eu.toldi.infinityforlemmy.blockeduser.BlockedUserData;
|
||||
import eu.toldi.infinityforlemmy.customtheme.CustomThemeWrapper;
|
||||
import jp.wasabeef.glide.transformations.RoundedCornersTransformation;
|
||||
import me.zhanghai.android.fastscroll.PopupTextProvider;
|
||||
import pl.droidsonroids.gif.GifImageView;
|
||||
import retrofit2.Retrofit;
|
||||
|
||||
public class BlockedUsersRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> implements PopupTextProvider {
|
||||
private static final int VIEW_TYPE_FAVORITE_USER_DIVIDER = 0;
|
||||
private static final int VIEW_TYPE_FAVORITE_USER = 1;
|
||||
private static final int VIEW_TYPE_USER_DIVIDER = 2;
|
||||
private static final int VIEW_TYPE_USER = 3;
|
||||
|
||||
private List<BlockedUserData> mBlockedUserData;
|
||||
private List<BlockedUserData> mFavoriteBlockedUserData;
|
||||
private BaseActivity mActivity;
|
||||
private Executor mExecutor;
|
||||
private Retrofit mOauthRetrofit;
|
||||
private RedditDataRoomDatabase mRedditDataRoomDatabase;
|
||||
private String mAccessToken;
|
||||
private RequestManager glide;
|
||||
private int mPrimaryTextColor;
|
||||
private int mSecondaryTextColor;
|
||||
|
||||
public BlockedUsersRecyclerViewAdapter(BaseActivity activity, Executor executor, Retrofit oauthRetrofit,
|
||||
RedditDataRoomDatabase redditDataRoomDatabase,
|
||||
CustomThemeWrapper customThemeWrapper,
|
||||
String accessToken) {
|
||||
mActivity = activity;
|
||||
mExecutor = executor;
|
||||
mOauthRetrofit = oauthRetrofit;
|
||||
mRedditDataRoomDatabase = redditDataRoomDatabase;
|
||||
mAccessToken = accessToken;
|
||||
glide = Glide.with(activity);
|
||||
mPrimaryTextColor = customThemeWrapper.getPrimaryTextColor();
|
||||
mSecondaryTextColor = customThemeWrapper.getSecondaryTextColor();
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getItemViewType(int position) {
|
||||
if (mFavoriteBlockedUserData != null && mFavoriteBlockedUserData.size() > 0) {
|
||||
if (position == 0) {
|
||||
return VIEW_TYPE_FAVORITE_USER_DIVIDER;
|
||||
} else if (position == mFavoriteBlockedUserData.size() + 1) {
|
||||
return VIEW_TYPE_USER_DIVIDER;
|
||||
} else if (position <= mFavoriteBlockedUserData.size()) {
|
||||
return VIEW_TYPE_FAVORITE_USER;
|
||||
} else {
|
||||
return VIEW_TYPE_USER;
|
||||
}
|
||||
} else {
|
||||
return VIEW_TYPE_USER;
|
||||
}
|
||||
}
|
||||
|
||||
@NonNull
|
||||
@Override
|
||||
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
|
||||
switch (i) {
|
||||
case VIEW_TYPE_FAVORITE_USER_DIVIDER:
|
||||
return new FavoriteUsersDividerViewHolder(LayoutInflater.from(viewGroup.getContext())
|
||||
.inflate(R.layout.item_favorite_thing_divider, viewGroup, false));
|
||||
case VIEW_TYPE_USER_DIVIDER:
|
||||
return new AllUsersDividerViewHolder(LayoutInflater.from(viewGroup.getContext())
|
||||
.inflate(R.layout.item_favorite_thing_divider, viewGroup, false));
|
||||
default:
|
||||
return new UserViewHolder(LayoutInflater.from(viewGroup.getContext())
|
||||
.inflate(R.layout.item_subscribed_thing, viewGroup, false));
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onBindViewHolder(@NonNull final RecyclerView.ViewHolder viewHolder, int i) {
|
||||
if (viewHolder instanceof UserViewHolder) {
|
||||
int offset = 0;
|
||||
|
||||
if (!mBlockedUserData.get(viewHolder.getBindingAdapterPosition() - offset).getAvatar().equals("")) {
|
||||
glide.load(mBlockedUserData.get(viewHolder.getBindingAdapterPosition() - offset).getAvatar())
|
||||
.apply(RequestOptions.bitmapTransform(new RoundedCornersTransformation(72, 0)))
|
||||
.error(glide.load(R.drawable.subreddit_default_icon)
|
||||
.apply(RequestOptions.bitmapTransform(new RoundedCornersTransformation(72, 0))))
|
||||
.into(((UserViewHolder) viewHolder).iconGifImageView);
|
||||
} else {
|
||||
glide.load(R.drawable.subreddit_default_icon)
|
||||
.apply(RequestOptions.bitmapTransform(new RoundedCornersTransformation(72, 0)))
|
||||
.into(((UserViewHolder) viewHolder).iconGifImageView);
|
||||
}
|
||||
((UserViewHolder) viewHolder).userNameTextView.setText(mBlockedUserData.get(viewHolder.getBindingAdapterPosition() - offset).getName());
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getItemCount() {
|
||||
if (mBlockedUserData != null && mBlockedUserData.size() > 0) {
|
||||
return mBlockedUserData.size();
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onViewRecycled(@NonNull RecyclerView.ViewHolder holder) {
|
||||
if (holder instanceof UserViewHolder) {
|
||||
glide.clear(((UserViewHolder) holder).iconGifImageView);
|
||||
}
|
||||
}
|
||||
|
||||
public void setSubscribedUsers(List<BlockedUserData> subscribedUsers) {
|
||||
mBlockedUserData = subscribedUsers;
|
||||
notifyDataSetChanged();
|
||||
}
|
||||
|
||||
public void setFavoriteSubscribedUsers(List<BlockedUserData> favoriteSubscribedUsers) {
|
||||
mFavoriteBlockedUserData = favoriteSubscribedUsers;
|
||||
notifyDataSetChanged();
|
||||
}
|
||||
|
||||
@NonNull
|
||||
@Override
|
||||
public String getPopupText(int position) {
|
||||
switch (getItemViewType(position)) {
|
||||
case VIEW_TYPE_USER:
|
||||
int offset = (mFavoriteBlockedUserData != null && mFavoriteBlockedUserData.size() > 0) ?
|
||||
mFavoriteBlockedUserData.size() + 2 : 0;
|
||||
return mBlockedUserData.get(position - offset).getName().substring(0, 1).toUpperCase();
|
||||
case VIEW_TYPE_FAVORITE_USER:
|
||||
return mFavoriteBlockedUserData.get(position - 1).getName().substring(0, 1).toUpperCase();
|
||||
default:
|
||||
return "";
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
class UserViewHolder extends RecyclerView.ViewHolder {
|
||||
@BindView(R.id.thing_icon_gif_image_view_item_subscribed_thing)
|
||||
GifImageView iconGifImageView;
|
||||
@BindView(R.id.thing_name_text_view_item_subscribed_thing)
|
||||
TextView userNameTextView;
|
||||
|
||||
UserViewHolder(View itemView) {
|
||||
super(itemView);
|
||||
ButterKnife.bind(this, itemView);
|
||||
if (mActivity.typeface != null) {
|
||||
userNameTextView.setTypeface(mActivity.typeface);
|
||||
}
|
||||
userNameTextView.setTextColor(mPrimaryTextColor);
|
||||
|
||||
itemView.setOnClickListener(view -> {
|
||||
int offset = (mFavoriteBlockedUserData != null && mFavoriteBlockedUserData.size() > 0) ?
|
||||
mFavoriteBlockedUserData.size() + 2 : 0;
|
||||
int position = getBindingAdapterPosition() - offset;
|
||||
if (position >= 0 && mBlockedUserData.size() > position) {
|
||||
Intent intent = new Intent(mActivity, ViewUserDetailActivity.class);
|
||||
intent.putExtra(ViewUserDetailActivity.EXTRA_USER_NAME_KEY, mBlockedUserData.get(position).getName());
|
||||
intent.putExtra(ViewUserDetailActivity.EXTRA_QUALIFIED_USER_NAME_KEY, mBlockedUserData.get(position).getQualifiedName());
|
||||
mActivity.startActivity(intent);
|
||||
}
|
||||
});
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
class FavoriteUsersDividerViewHolder extends RecyclerView.ViewHolder {
|
||||
@BindView(R.id.divider_text_view_item_favorite_thing_divider)
|
||||
TextView dividerTextView;
|
||||
|
||||
FavoriteUsersDividerViewHolder(@NonNull View itemView) {
|
||||
super(itemView);
|
||||
ButterKnife.bind(this, itemView);
|
||||
if (mActivity.typeface != null) {
|
||||
dividerTextView.setTypeface(mActivity.typeface);
|
||||
}
|
||||
dividerTextView.setText(R.string.favorites);
|
||||
dividerTextView.setTextColor(mSecondaryTextColor);
|
||||
}
|
||||
}
|
||||
|
||||
class AllUsersDividerViewHolder extends RecyclerView.ViewHolder {
|
||||
@BindView(R.id.divider_text_view_item_favorite_thing_divider)
|
||||
TextView dividerTextView;
|
||||
|
||||
AllUsersDividerViewHolder(@NonNull View itemView) {
|
||||
super(itemView);
|
||||
ButterKnife.bind(this, itemView);
|
||||
if (mActivity.typeface != null) {
|
||||
dividerTextView.setTypeface(mActivity.typeface);
|
||||
}
|
||||
dividerTextView.setText(R.string.all);
|
||||
dividerTextView.setTextColor(mSecondaryTextColor);
|
||||
}
|
||||
}
|
||||
}
|
@ -148,7 +148,7 @@ public class UserListingRecyclerViewAdapter extends PagedListAdapter<UserData, R
|
||||
|
||||
@Override
|
||||
public void isNotSubscribed() {
|
||||
((DataViewHolder) holder).subscribeButton.setVisibility(View.VISIBLE);
|
||||
|
||||
((DataViewHolder) holder).subscribeButton.setOnClickListener(view -> {
|
||||
UserFollowing.followUser(oauthRetrofit, retrofit,
|
||||
accessToken, userData.getName(), accountName, redditDataRoomDatabase,
|
||||
|
@ -25,7 +25,7 @@ public class AccountSectionRecyclerViewAdapter extends RecyclerView.Adapter<Recy
|
||||
private static final int VIEW_TYPE_MENU_GROUP_TITLE = 1;
|
||||
private static final int VIEW_TYPE_MENU_ITEM = 2;
|
||||
private static final int ACCOUNT_SECTION_ITEMS = 4;
|
||||
private static final int ANONYMOUS_ACCOUNT_SECTION_ITEMS = 2;
|
||||
private static final int ANONYMOUS_ACCOUNT_SECTION_ITEMS = 1;
|
||||
|
||||
private BaseActivity baseActivity;
|
||||
private int inboxCount;
|
||||
|
@ -18,13 +18,13 @@ import eu.toldi.infinityforlemmy.activities.BaseActivity;
|
||||
import eu.toldi.infinityforlemmy.customtheme.CustomThemeWrapper;
|
||||
import eu.toldi.infinityforlemmy.utils.SharedPreferencesUtils;
|
||||
|
||||
public class RedditSectionRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
|
||||
public class LemmySectionRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
|
||||
|
||||
private static final int VIEW_TYPE_MENU_GROUP_TITLE = 1;
|
||||
private static final int VIEW_TYPE_MENU_ITEM = 2;
|
||||
private static final int REDDIT_SECTION_ITEMS = 1;
|
||||
private static final int LEMMY_SECTION_ITEMS = 2;
|
||||
|
||||
private static final int REDDIT_SECTION_ANONYMOUS_ITEMS = 2;
|
||||
private static final int LEMMY_SECTION_ANONYMOUS_ITEMS = 1;
|
||||
private final boolean isLoggedIn;
|
||||
|
||||
private BaseActivity baseActivity;
|
||||
@ -34,9 +34,9 @@ public class RedditSectionRecyclerViewAdapter extends RecyclerView.Adapter<Recyc
|
||||
private boolean collapseRedditSection;
|
||||
private NavigationDrawerRecyclerViewMergedAdapter.ItemClickListener itemClickListener;
|
||||
|
||||
public RedditSectionRecyclerViewAdapter(BaseActivity baseActivity, CustomThemeWrapper customThemeWrapper,
|
||||
SharedPreferences navigationDrawerSharedPreferences,
|
||||
NavigationDrawerRecyclerViewMergedAdapter.ItemClickListener itemClickListener, boolean isLoggedIn) {
|
||||
public LemmySectionRecyclerViewAdapter(BaseActivity baseActivity, CustomThemeWrapper customThemeWrapper,
|
||||
SharedPreferences navigationDrawerSharedPreferences,
|
||||
NavigationDrawerRecyclerViewMergedAdapter.ItemClickListener itemClickListener, boolean isLoggedIn) {
|
||||
this.baseActivity = baseActivity;
|
||||
primaryTextColor = customThemeWrapper.getPrimaryTextColor();
|
||||
secondaryTextColor = customThemeWrapper.getSecondaryTextColor();
|
||||
@ -76,10 +76,10 @@ public class RedditSectionRecyclerViewAdapter extends RecyclerView.Adapter<Recyc
|
||||
holder.itemView.setOnClickListener(view -> {
|
||||
if (collapseRedditSection) {
|
||||
collapseRedditSection = !collapseRedditSection;
|
||||
notifyItemRangeInserted(holder.getBindingAdapterPosition() + 1, REDDIT_SECTION_ITEMS);
|
||||
notifyItemRangeInserted(holder.getBindingAdapterPosition() + 1, isLoggedIn ? LEMMY_SECTION_ITEMS : LEMMY_SECTION_ANONYMOUS_ITEMS);
|
||||
} else {
|
||||
collapseRedditSection = !collapseRedditSection;
|
||||
notifyItemRangeRemoved(holder.getBindingAdapterPosition() + 1, REDDIT_SECTION_ITEMS);
|
||||
notifyItemRangeRemoved(holder.getBindingAdapterPosition() + 1, isLoggedIn ? LEMMY_SECTION_ITEMS : LEMMY_SECTION_ANONYMOUS_ITEMS);
|
||||
}
|
||||
notifyItemChanged(holder.getBindingAdapterPosition());
|
||||
});
|
||||
@ -89,12 +89,13 @@ public class RedditSectionRecyclerViewAdapter extends RecyclerView.Adapter<Recyc
|
||||
|
||||
switch (position) {
|
||||
case 1:
|
||||
stringId = R.string.trending;
|
||||
drawableId = R.drawable.ic_trending_24dp;
|
||||
stringId = R.string.instance_info;
|
||||
drawableId = R.drawable.ic_baseline_info_24;
|
||||
break;
|
||||
case 2:
|
||||
stringId = R.string.anonymous_account_instance;
|
||||
drawableId = R.drawable.ic_account_circle_24dp;
|
||||
stringId = R.string.blocks;
|
||||
drawableId = R.drawable.ic_outline_lock_24dp;
|
||||
break;
|
||||
}
|
||||
|
||||
((MenuItemViewHolder) holder).menuTextView.setText(stringId);
|
||||
@ -106,7 +107,7 @@ public class RedditSectionRecyclerViewAdapter extends RecyclerView.Adapter<Recyc
|
||||
|
||||
@Override
|
||||
public int getItemCount() {
|
||||
return !collapseRedditSection ? (isLoggedIn ? REDDIT_SECTION_ITEMS + 1 : REDDIT_SECTION_ANONYMOUS_ITEMS + 1) : 1;
|
||||
return !collapseRedditSection ? (isLoggedIn ? LEMMY_SECTION_ITEMS + 1 : LEMMY_SECTION_ANONYMOUS_ITEMS + 1) : 1;
|
||||
}
|
||||
|
||||
class MenuGroupTitleViewHolder extends RecyclerView.ViewHolder {
|
@ -21,6 +21,7 @@ public class NavigationDrawerRecyclerViewMergedAdapter {
|
||||
private FavoriteSubscribedSubredditsSectionRecyclerViewAdapter favoriteSubscribedSubredditsSectionRecyclerViewAdapter;
|
||||
private SubscribedSubredditsRecyclerViewAdapter subscribedSubredditsRecyclerViewAdapter;
|
||||
private AccountManagementSectionRecyclerViewAdapter accountManagementSectionRecyclerViewAdapter;
|
||||
private LemmySectionRecyclerViewAdapter lemmySectionRecyclerViewAdapter;
|
||||
private ConcatAdapter mainPageConcatAdapter;
|
||||
|
||||
public NavigationDrawerRecyclerViewMergedAdapter(BaseActivity baseActivity, SharedPreferences sharedPreferences,
|
||||
@ -55,10 +56,13 @@ public class NavigationDrawerRecyclerViewMergedAdapter {
|
||||
customThemeWrapper, navigationDrawerSharedPreferences, itemClickListener);
|
||||
accountManagementSectionRecyclerViewAdapter = new AccountManagementSectionRecyclerViewAdapter(baseActivity,
|
||||
customThemeWrapper, glide, accountName != null, itemClickListener);
|
||||
lemmySectionRecyclerViewAdapter = new LemmySectionRecyclerViewAdapter(baseActivity, customThemeWrapper,
|
||||
navigationDrawerSharedPreferences, itemClickListener, accountName != null);
|
||||
|
||||
mainPageConcatAdapter = new ConcatAdapter(
|
||||
headerSectionRecyclerViewAdapter,
|
||||
accountSectionRecyclerViewAdapter,
|
||||
lemmySectionRecyclerViewAdapter,
|
||||
preferenceSectionRecyclerViewAdapter,
|
||||
favoriteSubscribedSubredditsSectionRecyclerViewAdapter,
|
||||
subscribedSubredditsRecyclerViewAdapter);
|
||||
@ -70,6 +74,7 @@ public class NavigationDrawerRecyclerViewMergedAdapter {
|
||||
|
||||
private void openAccountSection() {
|
||||
mainPageConcatAdapter.removeAdapter(accountSectionRecyclerViewAdapter);
|
||||
mainPageConcatAdapter.removeAdapter(lemmySectionRecyclerViewAdapter);
|
||||
mainPageConcatAdapter.removeAdapter(preferenceSectionRecyclerViewAdapter);
|
||||
mainPageConcatAdapter.removeAdapter(favoriteSubscribedSubredditsSectionRecyclerViewAdapter);
|
||||
mainPageConcatAdapter.removeAdapter(subscribedSubredditsRecyclerViewAdapter);
|
||||
@ -81,6 +86,7 @@ public class NavigationDrawerRecyclerViewMergedAdapter {
|
||||
mainPageConcatAdapter.removeAdapter(accountManagementSectionRecyclerViewAdapter);
|
||||
|
||||
mainPageConcatAdapter.addAdapter(accountSectionRecyclerViewAdapter);
|
||||
mainPageConcatAdapter.addAdapter(lemmySectionRecyclerViewAdapter);
|
||||
mainPageConcatAdapter.addAdapter(preferenceSectionRecyclerViewAdapter);
|
||||
mainPageConcatAdapter.addAdapter(favoriteSubscribedSubredditsSectionRecyclerViewAdapter);
|
||||
mainPageConcatAdapter.addAdapter(subscribedSubredditsRecyclerViewAdapter);
|
||||
|
@ -6,6 +6,7 @@ import com.google.common.util.concurrent.ListenableFuture;
|
||||
|
||||
import eu.toldi.infinityforlemmy.dto.AccountLoginDTO;
|
||||
import eu.toldi.infinityforlemmy.dto.AuthDTO;
|
||||
import eu.toldi.infinityforlemmy.dto.BlockCommunityDTO;
|
||||
import eu.toldi.infinityforlemmy.dto.CommentDTO;
|
||||
import eu.toldi.infinityforlemmy.dto.CommentVoteDTO;
|
||||
import eu.toldi.infinityforlemmy.dto.DeleteCommentDTO;
|
||||
@ -20,6 +21,7 @@ import eu.toldi.infinityforlemmy.dto.ReadPostDTO;
|
||||
import eu.toldi.infinityforlemmy.dto.SaveCommentDTO;
|
||||
import eu.toldi.infinityforlemmy.dto.SavePostDTO;
|
||||
import eu.toldi.infinityforlemmy.dto.SubmitPostDTO;
|
||||
import eu.toldi.infinityforlemmy.dto.UserBlockDTO;
|
||||
import eu.toldi.infinityforlemmy.message.MessageCount;
|
||||
import okhttp3.MultipartBody;
|
||||
import retrofit2.Call;
|
||||
@ -42,6 +44,10 @@ public interface LemmyAPI {
|
||||
@GET("api/v3/user")
|
||||
Call<String> userInfo(@Query("username") String username, @Query("auth") String access_token);
|
||||
|
||||
@Headers("Content-Type: application/json")
|
||||
@POST("api/v3/user/block")
|
||||
Call<String> userBlock(@Body UserBlockDTO params);
|
||||
|
||||
@GET("api/v3/user/mention")
|
||||
Call<String> userMentions(@Query("sort") String sort, @Query("page") Integer page, @Query("limit") Integer limit, @Query("unread_only") boolean unread_only, @Query("auth") String access_token);
|
||||
|
||||
@ -136,6 +142,10 @@ public interface LemmyAPI {
|
||||
@POST("api/v3/community/follow")
|
||||
Call<String> communityFollow(@Body FollowCommunityDTO params);
|
||||
|
||||
@Headers("Content-Type: application/json")
|
||||
@POST("api/v3/community/block")
|
||||
Call<String> communityBlock(@Body BlockCommunityDTO params);
|
||||
|
||||
@Headers("Content-Type: application/json")
|
||||
@PUT("api/v3/post/save")
|
||||
Call<String> postSave(@Body SavePostDTO params);
|
||||
|
@ -0,0 +1,130 @@
|
||||
package eu.toldi.infinityforlemmy.asynctasks;
|
||||
|
||||
import android.os.Handler;
|
||||
|
||||
import androidx.annotation.Nullable;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.Executor;
|
||||
|
||||
import eu.toldi.infinityforlemmy.RedditDataRoomDatabase;
|
||||
import eu.toldi.infinityforlemmy.blockedcommunity.BlockedCommunityDao;
|
||||
import eu.toldi.infinityforlemmy.blockedcommunity.BlockedCommunityData;
|
||||
import eu.toldi.infinityforlemmy.blockeduser.BlockedUserDao;
|
||||
import eu.toldi.infinityforlemmy.blockeduser.BlockedUserData;
|
||||
|
||||
|
||||
public class InsertBlockedThings {
|
||||
|
||||
public static void insertBlockedThings(Executor executor, Handler handler,
|
||||
RedditDataRoomDatabase redditDataRoomDatabase, @Nullable String accountName,
|
||||
List<BlockedCommunityData> blockedCommunityDataList,
|
||||
List<BlockedUserData> blockedUserDataDataList,
|
||||
|
||||
InsertBlockedThingListener insertSubscribedThingListener) {
|
||||
executor.execute(() -> {
|
||||
if (accountName != null && redditDataRoomDatabase.accountDao().getAccountData(accountName) == null) {
|
||||
handler.post(insertSubscribedThingListener::insertSuccess);
|
||||
return;
|
||||
}
|
||||
|
||||
BlockedUserDao blockedUserDao = redditDataRoomDatabase.blockedUserDao();
|
||||
BlockedCommunityDao blockedCommunityDao = redditDataRoomDatabase.blockedCommunityDao();
|
||||
|
||||
|
||||
if (blockedCommunityDataList != null) {
|
||||
List<BlockedCommunityData> existingBlockedCommunityDaoList =
|
||||
blockedCommunityDao.getAllBlockedCommunitiesList(accountName);
|
||||
Collections.sort(blockedCommunityDataList, (subscribedSubredditData, t1) -> subscribedSubredditData.getName().compareToIgnoreCase(t1.getName()));
|
||||
List<String> unsubscribedSubreddits = new ArrayList<>();
|
||||
compareTwoSubscribedSubredditList(blockedCommunityDataList, existingBlockedCommunityDaoList,
|
||||
unsubscribedSubreddits);
|
||||
|
||||
for (String unsubscribed : unsubscribedSubreddits) {
|
||||
blockedCommunityDao.deleteBlockedCommunity(unsubscribed, accountName);
|
||||
}
|
||||
|
||||
for (BlockedCommunityData s : blockedCommunityDataList) {
|
||||
blockedCommunityDao.insert(s);
|
||||
}
|
||||
}
|
||||
|
||||
if (blockedUserDataDataList != null) {
|
||||
List<BlockedUserData> existingBlockedUserDataList =
|
||||
blockedUserDao.getAllBlockedUsersList(accountName);
|
||||
Collections.sort(blockedUserDataDataList, (subscribedUserData, t1) -> subscribedUserData.getName().compareToIgnoreCase(t1.getName()));
|
||||
List<String> unsubscribedUsers = new ArrayList<>();
|
||||
compareTwoSubscribedUserList(blockedUserDataDataList, existingBlockedUserDataList,
|
||||
unsubscribedUsers);
|
||||
|
||||
for (String unsubscribed : unsubscribedUsers) {
|
||||
blockedUserDao.deleteBlockedUser(unsubscribed, accountName);
|
||||
}
|
||||
|
||||
for (BlockedUserData s : blockedUserDataDataList) {
|
||||
blockedUserDao.insert(s);
|
||||
}
|
||||
}
|
||||
|
||||
handler.post(insertSubscribedThingListener::insertSuccess);
|
||||
});
|
||||
}
|
||||
|
||||
private static void compareTwoSubscribedSubredditList(List<BlockedCommunityData> newSubscribedSubreddits,
|
||||
List<BlockedCommunityData> oldSubscribedSubreddits,
|
||||
List<String> unsubscribedSubredditNames) {
|
||||
int newIndex = 0;
|
||||
for (int oldIndex = 0; oldIndex < oldSubscribedSubreddits.size(); oldIndex++) {
|
||||
if (newIndex >= newSubscribedSubreddits.size()) {
|
||||
for (; oldIndex < oldSubscribedSubreddits.size(); oldIndex++) {
|
||||
unsubscribedSubredditNames.add(oldSubscribedSubreddits.get(oldIndex).getQualified_name());
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
BlockedCommunityData old = oldSubscribedSubreddits.get(oldIndex);
|
||||
for (; newIndex < newSubscribedSubreddits.size(); newIndex++) {
|
||||
if (newSubscribedSubreddits.get(newIndex).getQualified_name().compareToIgnoreCase(old.getQualified_name()) == 0) {
|
||||
newIndex++;
|
||||
break;
|
||||
}
|
||||
if (newSubscribedSubreddits.get(newIndex).getQualified_name().compareToIgnoreCase(old.getQualified_name()) > 0) {
|
||||
unsubscribedSubredditNames.add(old.getQualified_name());
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static void compareTwoSubscribedUserList(List<BlockedUserData> newSubscribedUsers,
|
||||
List<BlockedUserData> oldSubscribedUsers,
|
||||
List<String> unsubscribedUserNames) {
|
||||
int newIndex = 0;
|
||||
for (int oldIndex = 0; oldIndex < oldSubscribedUsers.size(); oldIndex++) {
|
||||
if (newIndex >= newSubscribedUsers.size()) {
|
||||
for (; oldIndex < oldSubscribedUsers.size(); oldIndex++) {
|
||||
unsubscribedUserNames.add(oldSubscribedUsers.get(oldIndex).getQualifiedName());
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
BlockedUserData old = oldSubscribedUsers.get(oldIndex);
|
||||
for (; newIndex < newSubscribedUsers.size(); newIndex++) {
|
||||
if (newSubscribedUsers.get(newIndex).getName().compareToIgnoreCase(old.getName()) == 0) {
|
||||
newIndex++;
|
||||
break;
|
||||
}
|
||||
if (newSubscribedUsers.get(newIndex).getName().compareToIgnoreCase(old.getName()) > 0) {
|
||||
unsubscribedUserNames.add(old.getQualifiedName());
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public interface InsertBlockedThingListener {
|
||||
void insertSuccess();
|
||||
}
|
||||
}
|
@ -0,0 +1,30 @@
|
||||
package eu.toldi.infinityforlemmy.blockedcommunity;
|
||||
|
||||
import androidx.lifecycle.LiveData;
|
||||
import androidx.room.Dao;
|
||||
import androidx.room.Insert;
|
||||
import androidx.room.OnConflictStrategy;
|
||||
import androidx.room.Query;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@Dao
|
||||
public interface BlockedCommunityDao {
|
||||
@Insert(onConflict = OnConflictStrategy.REPLACE)
|
||||
void insert(BlockedCommunityData communityData);
|
||||
|
||||
@Insert(onConflict = OnConflictStrategy.REPLACE)
|
||||
void insertAll(List<BlockedCommunityData> blockedCommunityDataList);
|
||||
|
||||
@Query("SELECT * FROM blocked_communities WHERE account_name = :accountName AND name LIKE '%' || :searchQuery || '%' COLLATE NOCASE ORDER BY name COLLATE NOCASE ASC")
|
||||
LiveData<List<BlockedCommunityData>> getAllBlockedCommunitiesWithSearchQuery(String accountName, String searchQuery);
|
||||
|
||||
@Query("SELECT * FROM blocked_communities WHERE account_name = :accountName COLLATE NOCASE ORDER BY name COLLATE NOCASE ASC")
|
||||
List<BlockedCommunityData> getAllBlockedCommunitiesList(String accountName);
|
||||
|
||||
@Query("SELECT * FROM blocked_communities WHERE name = :name COLLATE NOCASE AND account_name = :accountName COLLATE NOCASE LIMIT 1")
|
||||
BlockedCommunityData getBlockedCommunity(String name, String accountName);
|
||||
|
||||
@Query("DELETE FROM blocked_communities WHERE qualified_name = :name COLLATE NOCASE AND account_name = :accountName COLLATE NOCASE")
|
||||
void deleteBlockedCommunity(String name, String accountName);
|
||||
}
|
@ -0,0 +1,80 @@
|
||||
package eu.toldi.infinityforlemmy.blockedcommunity;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.room.ColumnInfo;
|
||||
import androidx.room.Entity;
|
||||
|
||||
import eu.toldi.infinityforlemmy.subreddit.SubredditData;
|
||||
import eu.toldi.infinityforlemmy.utils.LemmyUtils;
|
||||
|
||||
@Entity(tableName = "blocked_communities", primaryKeys = {"id", "account_name"})
|
||||
public class BlockedCommunityData {
|
||||
|
||||
@ColumnInfo(name = "id")
|
||||
private final int id;
|
||||
|
||||
@ColumnInfo(name = "name")
|
||||
private String name;
|
||||
|
||||
@ColumnInfo(name = "qualified_name")
|
||||
private String qualified_name;
|
||||
@ColumnInfo(name = "icon")
|
||||
private String iconUrl;
|
||||
|
||||
@NonNull
|
||||
@ColumnInfo(name = "account_name")
|
||||
private String accountName;
|
||||
|
||||
public BlockedCommunityData(int id, String name, String qualified_name, String iconUrl, @NonNull String accountName) {
|
||||
this.id = id;
|
||||
this.name = name;
|
||||
this.qualified_name = qualified_name;
|
||||
this.iconUrl = iconUrl;
|
||||
this.accountName = accountName;
|
||||
}
|
||||
|
||||
public int getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
public String getQualified_name() {
|
||||
return qualified_name;
|
||||
}
|
||||
|
||||
public String getIconUrl() {
|
||||
return iconUrl;
|
||||
}
|
||||
|
||||
@NonNull
|
||||
public String getAccountName() {
|
||||
return accountName;
|
||||
}
|
||||
|
||||
public void setName(String name) {
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
public void setQualified_name(String qualified_name) {
|
||||
this.qualified_name = qualified_name;
|
||||
}
|
||||
|
||||
public void setIconUrl(String iconUrl) {
|
||||
this.iconUrl = iconUrl;
|
||||
}
|
||||
|
||||
public void setAccountName(@NonNull String accountName) {
|
||||
this.accountName = accountName;
|
||||
}
|
||||
|
||||
public BlockedCommunityData(SubredditData subredditData, @NonNull String accountName) {
|
||||
this.id = subredditData.getId();
|
||||
this.name = subredditData.getName();
|
||||
this.qualified_name = LemmyUtils.actorID2FullName(subredditData.getActorId());
|
||||
this.iconUrl = subredditData.getIconUrl();
|
||||
this.accountName = accountName;
|
||||
}
|
||||
}
|
@ -0,0 +1,42 @@
|
||||
package eu.toldi.infinityforlemmy.blockedcommunity;
|
||||
|
||||
import android.os.AsyncTask;
|
||||
|
||||
import androidx.lifecycle.LiveData;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import eu.toldi.infinityforlemmy.RedditDataRoomDatabase;
|
||||
|
||||
public class BlockedCommunityRepository {
|
||||
private BlockedCommunityDao blockedCommunityDao;
|
||||
private String mAccountName;
|
||||
|
||||
BlockedCommunityRepository(RedditDataRoomDatabase redditDataRoomDatabase, String accountName) {
|
||||
mAccountName = accountName;
|
||||
blockedCommunityDao = redditDataRoomDatabase.blockedCommunityDao();
|
||||
}
|
||||
|
||||
LiveData<List<BlockedCommunityData>> getAllSubscribedSubredditsWithSearchQuery(String searchQuery) {
|
||||
return blockedCommunityDao.getAllBlockedCommunitiesWithSearchQuery(mAccountName, searchQuery);
|
||||
}
|
||||
|
||||
public void insert(BlockedCommunityData subscribedSubredditData) {
|
||||
new insertAsyncTask(blockedCommunityDao).execute(subscribedSubredditData);
|
||||
}
|
||||
|
||||
private static class insertAsyncTask extends AsyncTask<BlockedCommunityData, Void, Void> {
|
||||
|
||||
private BlockedCommunityDao mAsyncTaskDao;
|
||||
|
||||
insertAsyncTask(BlockedCommunityDao dao) {
|
||||
mAsyncTaskDao = dao;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Void doInBackground(final BlockedCommunityData... params) {
|
||||
mAsyncTaskDao.insert(params[0]);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,60 @@
|
||||
package eu.toldi.infinityforlemmy.blockedcommunity;
|
||||
|
||||
import android.app.Application;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.lifecycle.AndroidViewModel;
|
||||
import androidx.lifecycle.LiveData;
|
||||
import androidx.lifecycle.MutableLiveData;
|
||||
import androidx.lifecycle.Transformations;
|
||||
import androidx.lifecycle.ViewModel;
|
||||
import androidx.lifecycle.ViewModelProvider;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import eu.toldi.infinityforlemmy.RedditDataRoomDatabase;
|
||||
|
||||
public class BlockedCommunityViewModel extends AndroidViewModel {
|
||||
private BlockedCommunityRepository blockedCommunityRepository;
|
||||
private LiveData<List<BlockedCommunityData>> mAllBlockedCommunities;
|
||||
private MutableLiveData<String> searchQueryLiveData;
|
||||
|
||||
public BlockedCommunityViewModel(Application application, RedditDataRoomDatabase redditDataRoomDatabase, String accountName) {
|
||||
super(application);
|
||||
blockedCommunityRepository = new BlockedCommunityRepository(redditDataRoomDatabase, accountName);
|
||||
searchQueryLiveData = new MutableLiveData<>();
|
||||
searchQueryLiveData.postValue("");
|
||||
|
||||
mAllBlockedCommunities = Transformations.switchMap(searchQueryLiveData, searchQuery -> blockedCommunityRepository.getAllSubscribedSubredditsWithSearchQuery(searchQuery));
|
||||
}
|
||||
|
||||
public LiveData<List<BlockedCommunityData>> getAllBlockedCommunities() {
|
||||
return mAllBlockedCommunities;
|
||||
}
|
||||
|
||||
public void insert(BlockedCommunityData subscribedSubredditData) {
|
||||
blockedCommunityRepository.insert(subscribedSubredditData);
|
||||
}
|
||||
|
||||
public void setSearchQuery(String searchQuery) {
|
||||
searchQueryLiveData.postValue(searchQuery);
|
||||
}
|
||||
|
||||
public static class Factory extends ViewModelProvider.NewInstanceFactory {
|
||||
private Application mApplication;
|
||||
private RedditDataRoomDatabase mRedditDataRoomDatabase;
|
||||
private String mAccountName;
|
||||
|
||||
public Factory(Application application, RedditDataRoomDatabase redditDataRoomDatabase, String accountName) {
|
||||
this.mApplication = application;
|
||||
this.mRedditDataRoomDatabase = redditDataRoomDatabase;
|
||||
this.mAccountName = accountName;
|
||||
}
|
||||
|
||||
@NonNull
|
||||
@Override
|
||||
public <T extends ViewModel> T create(@NonNull Class<T> modelClass) {
|
||||
return (T) new BlockedCommunityViewModel(mApplication, mRedditDataRoomDatabase, mAccountName);
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,31 @@
|
||||
package eu.toldi.infinityforlemmy.blockeduser;
|
||||
|
||||
import androidx.lifecycle.LiveData;
|
||||
import androidx.room.Dao;
|
||||
import androidx.room.Insert;
|
||||
import androidx.room.OnConflictStrategy;
|
||||
import androidx.room.Query;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@Dao
|
||||
public interface BlockedUserDao {
|
||||
|
||||
@Insert(onConflict = OnConflictStrategy.REPLACE)
|
||||
void insert(BlockedUserData userData);
|
||||
|
||||
@Insert(onConflict = OnConflictStrategy.REPLACE)
|
||||
void insertAll(List<BlockedUserData> blockedUserDataDataList);
|
||||
|
||||
@Query("SELECT * FROM blocked_users WHERE account_name = :accountName AND name LIKE '%' || :searchQuery || '%' COLLATE NOCASE ORDER BY name COLLATE NOCASE ASC")
|
||||
LiveData<List<BlockedUserData>> getAllBlockedUsersWithSearchQuery(String accountName, String searchQuery);
|
||||
|
||||
@Query("SELECT * FROM blocked_users WHERE account_name = :accountName COLLATE NOCASE ORDER BY name COLLATE NOCASE ASC")
|
||||
List<BlockedUserData> getAllBlockedUsersList(String accountName);
|
||||
|
||||
@Query("SELECT * FROM blocked_users WHERE name = :name COLLATE NOCASE AND account_name = :accountName COLLATE NOCASE LIMIT 1")
|
||||
BlockedUserData getBlockedUser(String name, String accountName);
|
||||
|
||||
@Query("DELETE FROM blocked_users WHERE qualified_name = :name COLLATE NOCASE AND account_name = :accountName COLLATE NOCASE")
|
||||
void deleteBlockedUser(String name, String accountName);
|
||||
}
|
@ -0,0 +1,80 @@
|
||||
package eu.toldi.infinityforlemmy.blockeduser;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.room.ColumnInfo;
|
||||
import androidx.room.Entity;
|
||||
|
||||
import eu.toldi.infinityforlemmy.user.UserData;
|
||||
import eu.toldi.infinityforlemmy.utils.LemmyUtils;
|
||||
|
||||
@Entity(tableName = "blocked_users", primaryKeys = {"id", "account_name"})
|
||||
public class BlockedUserData {
|
||||
|
||||
@ColumnInfo(name = "id")
|
||||
private final int id;
|
||||
|
||||
@ColumnInfo(name = "name")
|
||||
private String name;
|
||||
|
||||
@ColumnInfo(name = "avatar")
|
||||
private String avatar;
|
||||
|
||||
@ColumnInfo(name = "qualified_name")
|
||||
private String qualifiedName;
|
||||
|
||||
@NonNull
|
||||
@ColumnInfo(name = "account_name")
|
||||
private String accountName;
|
||||
|
||||
public BlockedUserData(int id, String name, String avatar, String qualifiedName, String accountName) {
|
||||
this.id = id;
|
||||
this.name = name;
|
||||
this.avatar = avatar;
|
||||
this.qualifiedName = qualifiedName;
|
||||
this.accountName = accountName;
|
||||
}
|
||||
|
||||
public int getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
public void setName(String name) {
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
public String getAvatar() {
|
||||
return avatar;
|
||||
}
|
||||
|
||||
public void setAvatar(String avatar) {
|
||||
this.avatar = avatar;
|
||||
}
|
||||
|
||||
public String getQualifiedName() {
|
||||
return qualifiedName;
|
||||
}
|
||||
|
||||
public void setQualifiedName(String qualifiedName) {
|
||||
this.qualifiedName = qualifiedName;
|
||||
}
|
||||
|
||||
public String getAccountName() {
|
||||
return accountName;
|
||||
}
|
||||
|
||||
public void setAccountName(String accountName) {
|
||||
this.accountName = accountName;
|
||||
}
|
||||
|
||||
public BlockedUserData(UserData userData, @NonNull String accountName) {
|
||||
this.id = userData.getId();
|
||||
this.name = userData.getName();
|
||||
this.avatar = userData.getAvatar();
|
||||
this.qualifiedName = LemmyUtils.actorID2FullName(userData.getActorId());
|
||||
this.accountName = accountName;
|
||||
}
|
||||
}
|
@ -0,0 +1,47 @@
|
||||
package eu.toldi.infinityforlemmy.blockeduser;
|
||||
|
||||
import android.os.AsyncTask;
|
||||
|
||||
import androidx.lifecycle.LiveData;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import eu.toldi.infinityforlemmy.RedditDataRoomDatabase;
|
||||
|
||||
public class BlockedUserRepository {
|
||||
|
||||
private BlockedUserDao mBlockedUserDao;
|
||||
private String mAccountName;
|
||||
|
||||
BlockedUserRepository(RedditDataRoomDatabase redditDataRoomDatabase, String accountName) {
|
||||
mBlockedUserDao = redditDataRoomDatabase.blockedUserDao();
|
||||
mAccountName = accountName;
|
||||
}
|
||||
|
||||
LiveData<List<BlockedUserData>> getAllBlockedUsersWithSearchQuery(String searchQuery) {
|
||||
return mBlockedUserDao.getAllBlockedUsersWithSearchQuery(mAccountName, searchQuery);
|
||||
}
|
||||
|
||||
LiveData<List<BlockedUserData>> getAllFavoriteSubscribedUsersWithSearchQuery(String searchQuery) {
|
||||
return mBlockedUserDao.getAllBlockedUsersWithSearchQuery(mAccountName, searchQuery);
|
||||
}
|
||||
|
||||
public void insert(BlockedUserData BlockedUserData) {
|
||||
new BlockedUserRepository.insertAsyncTask(mBlockedUserDao).execute(BlockedUserData);
|
||||
}
|
||||
|
||||
private static class insertAsyncTask extends AsyncTask<BlockedUserData, Void, Void> {
|
||||
|
||||
private BlockedUserDao mAsyncTaskDao;
|
||||
|
||||
insertAsyncTask(BlockedUserDao dao) {
|
||||
mAsyncTaskDao = dao;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Void doInBackground(final BlockedUserData... params) {
|
||||
mAsyncTaskDao.insert(params[0]);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,61 @@
|
||||
package eu.toldi.infinityforlemmy.blockeduser;
|
||||
|
||||
import android.app.Application;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.lifecycle.AndroidViewModel;
|
||||
import androidx.lifecycle.LiveData;
|
||||
import androidx.lifecycle.MutableLiveData;
|
||||
import androidx.lifecycle.Transformations;
|
||||
import androidx.lifecycle.ViewModel;
|
||||
import androidx.lifecycle.ViewModelProvider;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import eu.toldi.infinityforlemmy.RedditDataRoomDatabase;
|
||||
|
||||
public class BlockedUserViewModel extends AndroidViewModel {
|
||||
private BlockedUserRepository blockedUserRepository;
|
||||
private LiveData<List<BlockedUserData>> mAllSubscribedUsers;
|
||||
private MutableLiveData<String> searchQueryLiveData;
|
||||
|
||||
public BlockedUserViewModel(Application application, RedditDataRoomDatabase redditDataRoomDatabase, String accountName) {
|
||||
super(application);
|
||||
blockedUserRepository = new BlockedUserRepository(redditDataRoomDatabase, accountName);
|
||||
searchQueryLiveData = new MutableLiveData<>();
|
||||
searchQueryLiveData.postValue("");
|
||||
|
||||
mAllSubscribedUsers = Transformations.switchMap(searchQueryLiveData, searchQuery -> blockedUserRepository.getAllFavoriteSubscribedUsersWithSearchQuery(searchQuery));
|
||||
}
|
||||
|
||||
public LiveData<List<BlockedUserData>> getAllSubscribedUsers() {
|
||||
return mAllSubscribedUsers;
|
||||
}
|
||||
|
||||
|
||||
public void insert(BlockedUserData BlockedUserData) {
|
||||
blockedUserRepository.insert(BlockedUserData);
|
||||
}
|
||||
|
||||
public void setSearchQuery(String searchQuery) {
|
||||
searchQueryLiveData.postValue(searchQuery);
|
||||
}
|
||||
|
||||
public static class Factory extends ViewModelProvider.NewInstanceFactory {
|
||||
private Application mApplication;
|
||||
private RedditDataRoomDatabase mRedditDataRoomDatabase;
|
||||
private String mAccountName;
|
||||
|
||||
public Factory(Application application, RedditDataRoomDatabase redditDataRoomDatabase, String accountName) {
|
||||
mApplication = application;
|
||||
mRedditDataRoomDatabase = redditDataRoomDatabase;
|
||||
mAccountName = accountName;
|
||||
}
|
||||
|
||||
@NonNull
|
||||
@Override
|
||||
public <T extends ViewModel> T create(@NonNull Class<T> modelClass) {
|
||||
return (T) new BlockedUserViewModel(mApplication, mRedditDataRoomDatabase, mAccountName);
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,202 @@
|
||||
package eu.toldi.infinityforlemmy.fragments;
|
||||
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.SharedPreferences;
|
||||
import android.content.res.Resources;
|
||||
import android.os.Build;
|
||||
import android.os.Bundle;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.ImageView;
|
||||
import android.widget.LinearLayout;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.fragment.app.Fragment;
|
||||
import androidx.lifecycle.ViewModelProvider;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
|
||||
|
||||
import com.bumptech.glide.Glide;
|
||||
import com.bumptech.glide.RequestManager;
|
||||
|
||||
import java.util.concurrent.Executor;
|
||||
|
||||
import javax.inject.Inject;
|
||||
import javax.inject.Named;
|
||||
|
||||
import butterknife.BindView;
|
||||
import butterknife.ButterKnife;
|
||||
import eu.toldi.infinityforlemmy.FragmentCommunicator;
|
||||
import eu.toldi.infinityforlemmy.Infinity;
|
||||
import eu.toldi.infinityforlemmy.R;
|
||||
import eu.toldi.infinityforlemmy.RedditDataRoomDatabase;
|
||||
import eu.toldi.infinityforlemmy.activities.BaseActivity;
|
||||
import eu.toldi.infinityforlemmy.activities.SubscribedThingListingActivity;
|
||||
import eu.toldi.infinityforlemmy.adapters.BlockedCommunitiesRecyclerViewAdapter;
|
||||
import eu.toldi.infinityforlemmy.blockedcommunity.BlockedCommunityViewModel;
|
||||
import eu.toldi.infinityforlemmy.customtheme.CustomThemeWrapper;
|
||||
import eu.toldi.infinityforlemmy.customviews.LinearLayoutManagerBugFixed;
|
||||
import eu.toldi.infinityforlemmy.utils.SharedPreferencesUtils;
|
||||
import me.zhanghai.android.fastscroll.FastScrollerBuilder;
|
||||
import retrofit2.Retrofit;
|
||||
|
||||
|
||||
/**
|
||||
* A simple {@link Fragment} subclass.
|
||||
*/
|
||||
public class BlockedCommunitiesListingFragment extends Fragment implements FragmentCommunicator {
|
||||
|
||||
public static final String EXTRA_ACCOUNT_NAME = "EAN";
|
||||
public static final String EXTRA_ACCESS_TOKEN = "EAT";
|
||||
public static final String EXTRA_ACCOUNT_PROFILE_IMAGE_URL = "EAPIU";
|
||||
public static final String EXTRA_IS_SUBREDDIT_SELECTION = "EISS";
|
||||
public static final String EXTRA_EXTRA_CLEAR_SELECTION = "EECS";
|
||||
public static final String EXTRA_ACCOUNT_QUALIFIED_NAME = "EAQN";
|
||||
|
||||
@BindView(R.id.swipe_refresh_layout_subscribed_subreddits_listing_fragment)
|
||||
SwipeRefreshLayout mSwipeRefreshLayout;
|
||||
@BindView(R.id.recycler_view_subscribed_subreddits_listing_fragment)
|
||||
RecyclerView mRecyclerView;
|
||||
@BindView(R.id.no_subscriptions_linear_layout_subreddits_listing_fragment)
|
||||
LinearLayout mLinearLayout;
|
||||
@BindView(R.id.no_subscriptions_image_view_subreddits_listing_fragment)
|
||||
ImageView mImageView;
|
||||
@BindView(R.id.error_text_view_subscribed_subreddits_listing_fragment)
|
||||
TextView mErrorTextView;
|
||||
@Inject
|
||||
@Named("oauth")
|
||||
Retrofit mOauthRetrofit;
|
||||
@Inject
|
||||
@Named("default")
|
||||
SharedPreferences mSharedPreferences;
|
||||
@Inject
|
||||
RedditDataRoomDatabase mRedditDataRoomDatabase;
|
||||
@Inject
|
||||
CustomThemeWrapper mCustomThemeWrapper;
|
||||
@Inject
|
||||
Executor mExecutor;
|
||||
public BlockedCommunityViewModel mSubscribedSubredditViewModel;
|
||||
private BaseActivity mActivity;
|
||||
private RequestManager mGlide;
|
||||
private LinearLayoutManagerBugFixed mLinearLayoutManager;
|
||||
|
||||
public BlockedCommunitiesListingFragment() {
|
||||
// Required empty public constructor
|
||||
}
|
||||
|
||||
@Override
|
||||
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
|
||||
Bundle savedInstanceState) {
|
||||
View rootView = inflater.inflate(R.layout.fragment_subscribed_subreddits_listing, container, false);
|
||||
|
||||
ButterKnife.bind(this, rootView);
|
||||
|
||||
((Infinity) mActivity.getApplication()).getAppComponent().inject(this);
|
||||
|
||||
applyTheme();
|
||||
|
||||
if ((mActivity instanceof BaseActivity && ((BaseActivity) mActivity).isImmersiveInterface())) {
|
||||
mRecyclerView.setPadding(0, 0, 0, ((BaseActivity) mActivity).getNavBarHeight());
|
||||
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O
|
||||
&& mSharedPreferences.getBoolean(SharedPreferencesUtils.IMMERSIVE_INTERFACE_KEY, true)) {
|
||||
Resources resources = getResources();
|
||||
int navBarResourceId = resources.getIdentifier("navigation_bar_height", "dimen", "android");
|
||||
if (navBarResourceId > 0) {
|
||||
mRecyclerView.setPadding(0, 0, 0, resources.getDimensionPixelSize(navBarResourceId));
|
||||
}
|
||||
}
|
||||
|
||||
String accountName = getArguments().getString(EXTRA_ACCOUNT_NAME, "-");
|
||||
String accountQualifiedName = getArguments().getString(EXTRA_ACCOUNT_QUALIFIED_NAME, "-");
|
||||
String accessToken = getArguments().getString(EXTRA_ACCESS_TOKEN);
|
||||
|
||||
if (accessToken == null) {
|
||||
mSwipeRefreshLayout.setEnabled(false);
|
||||
}
|
||||
|
||||
mGlide = Glide.with(this);
|
||||
|
||||
mLinearLayoutManager = new LinearLayoutManagerBugFixed(mActivity);
|
||||
mRecyclerView.setLayoutManager(mLinearLayoutManager);
|
||||
|
||||
BlockedCommunitiesRecyclerViewAdapter adapter = new BlockedCommunitiesRecyclerViewAdapter(mActivity, mExecutor, mOauthRetrofit, mRedditDataRoomDatabase,
|
||||
mCustomThemeWrapper, accessToken);
|
||||
|
||||
|
||||
mRecyclerView.setAdapter(adapter);
|
||||
new FastScrollerBuilder(mRecyclerView).useMd2Style().build();
|
||||
|
||||
mSubscribedSubredditViewModel = new ViewModelProvider(this,
|
||||
new BlockedCommunityViewModel.Factory(mActivity.getApplication(), mRedditDataRoomDatabase, accountQualifiedName))
|
||||
.get(BlockedCommunityViewModel.class);
|
||||
mSubscribedSubredditViewModel.getAllBlockedCommunities().observe(getViewLifecycleOwner(), subscribedSubredditData -> {
|
||||
mSwipeRefreshLayout.setRefreshing(false);
|
||||
if (subscribedSubredditData == null || subscribedSubredditData.size() == 0) {
|
||||
mRecyclerView.setVisibility(View.GONE);
|
||||
mLinearLayout.setVisibility(View.VISIBLE);
|
||||
mGlide.load(R.drawable.error_image).into(mImageView);
|
||||
} else {
|
||||
mLinearLayout.setVisibility(View.GONE);
|
||||
mRecyclerView.setVisibility(View.VISIBLE);
|
||||
mGlide.clear(mImageView);
|
||||
}
|
||||
|
||||
if (accessToken != null) {
|
||||
adapter.addUser(accountName, getArguments().getString(EXTRA_ACCOUNT_PROFILE_IMAGE_URL));
|
||||
}
|
||||
adapter.setSubscribedSubreddits(subscribedSubredditData);
|
||||
});
|
||||
|
||||
/* mSubscribedSubredditViewModel.getAllFavoriteSubscribedSubreddits().observe(getViewLifecycleOwner(), favoriteSubscribedSubredditData -> {
|
||||
mSwipeRefreshLayout.setRefreshing(false);
|
||||
if (favoriteSubscribedSubredditData != null && favoriteSubscribedSubredditData.size() > 0) {
|
||||
mLinearLayout.setVisibility(View.GONE);
|
||||
mRecyclerView.setVisibility(View.VISIBLE);
|
||||
mGlide.clear(mImageView);
|
||||
}
|
||||
|
||||
adapter.setFavoriteSubscribedSubreddits(favoriteSubscribedSubredditData);
|
||||
});*/
|
||||
|
||||
return rootView;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onAttach(@NonNull Context context) {
|
||||
super.onAttach(context);
|
||||
mActivity = (BaseActivity) context;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void stopRefreshProgressbar() {
|
||||
mSwipeRefreshLayout.setRefreshing(false);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void applyTheme() {
|
||||
if (mActivity instanceof SubscribedThingListingActivity) {
|
||||
mSwipeRefreshLayout.setOnRefreshListener(() -> ((SubscribedThingListingActivity) mActivity).loadSubscriptions(true));
|
||||
mSwipeRefreshLayout.setProgressBackgroundColorSchemeColor(mCustomThemeWrapper.getCircularProgressBarBackground());
|
||||
mSwipeRefreshLayout.setColorSchemeColors(mCustomThemeWrapper.getColorAccent());
|
||||
} else {
|
||||
mSwipeRefreshLayout.setEnabled(false);
|
||||
}
|
||||
mErrorTextView.setTextColor(mCustomThemeWrapper.getSecondaryTextColor());
|
||||
if (mActivity.typeface != null) {
|
||||
mErrorTextView.setTypeface(mActivity.contentTypeface);
|
||||
}
|
||||
}
|
||||
|
||||
public void goBackToTop() {
|
||||
if (mLinearLayoutManager != null) {
|
||||
mLinearLayoutManager.scrollToPositionWithOffset(0, 0);
|
||||
}
|
||||
}
|
||||
|
||||
public void changeSearchQuery(String searchQuery) {
|
||||
mSubscribedSubredditViewModel.setSearchQuery(searchQuery);
|
||||
}
|
||||
}
|
@ -0,0 +1,172 @@
|
||||
package eu.toldi.infinityforlemmy.fragments;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.SharedPreferences;
|
||||
import android.content.res.Resources;
|
||||
import android.os.Build;
|
||||
import android.os.Bundle;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.ImageView;
|
||||
import android.widget.LinearLayout;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.fragment.app.Fragment;
|
||||
import androidx.lifecycle.ViewModelProvider;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
|
||||
|
||||
import com.bumptech.glide.Glide;
|
||||
import com.bumptech.glide.RequestManager;
|
||||
|
||||
import java.util.concurrent.Executor;
|
||||
|
||||
import javax.inject.Inject;
|
||||
import javax.inject.Named;
|
||||
|
||||
import butterknife.BindView;
|
||||
import butterknife.ButterKnife;
|
||||
import eu.toldi.infinityforlemmy.FragmentCommunicator;
|
||||
import eu.toldi.infinityforlemmy.Infinity;
|
||||
import eu.toldi.infinityforlemmy.R;
|
||||
import eu.toldi.infinityforlemmy.RedditDataRoomDatabase;
|
||||
import eu.toldi.infinityforlemmy.activities.BaseActivity;
|
||||
import eu.toldi.infinityforlemmy.activities.BlockedThingListingActivity;
|
||||
import eu.toldi.infinityforlemmy.adapters.BlockedUsersRecyclerViewAdapter;
|
||||
import eu.toldi.infinityforlemmy.blockeduser.BlockedUserViewModel;
|
||||
import eu.toldi.infinityforlemmy.customtheme.CustomThemeWrapper;
|
||||
import eu.toldi.infinityforlemmy.customviews.LinearLayoutManagerBugFixed;
|
||||
import eu.toldi.infinityforlemmy.utils.SharedPreferencesUtils;
|
||||
import me.zhanghai.android.fastscroll.FastScrollerBuilder;
|
||||
import retrofit2.Retrofit;
|
||||
|
||||
public class BlockedUsersListingFragment extends Fragment implements FragmentCommunicator {
|
||||
public static final String EXTRA_ACCOUNT_NAME = "EAN";
|
||||
public static final String EXTRA_ACCESS_TOKEN = "EAT";
|
||||
|
||||
@BindView(R.id.swipe_refresh_layout_followed_users_listing_fragment)
|
||||
SwipeRefreshLayout mSwipeRefreshLayout;
|
||||
@BindView(R.id.recycler_view_followed_users_listing_fragment)
|
||||
RecyclerView mRecyclerView;
|
||||
@BindView(R.id.no_subscriptions_linear_layout_followed_users_listing_fragment)
|
||||
LinearLayout mLinearLayout;
|
||||
@BindView(R.id.no_subscriptions_image_view_followed_users_listing_fragment)
|
||||
ImageView mImageView;
|
||||
@BindView(R.id.error_text_view_followed_users_listing_fragment)
|
||||
TextView mErrorTextView;
|
||||
@Inject
|
||||
@Named("oauth")
|
||||
Retrofit mOauthRetrofit;
|
||||
@Inject
|
||||
@Named("default")
|
||||
SharedPreferences mSharedPreferences;
|
||||
@Inject
|
||||
RedditDataRoomDatabase mRedditDataRoomDatabase;
|
||||
@Inject
|
||||
CustomThemeWrapper mCustomThemeWrapper;
|
||||
@Inject
|
||||
Executor mExecutor;
|
||||
BlockedUserViewModel blockedUserViewModel;
|
||||
private BaseActivity mActivity;
|
||||
private RequestManager mGlide;
|
||||
private LinearLayoutManagerBugFixed mLinearLayoutManager;
|
||||
|
||||
public BlockedUsersListingFragment() {
|
||||
// Required empty public constructor
|
||||
}
|
||||
|
||||
@Override
|
||||
public View onCreateView(LayoutInflater inflater, ViewGroup container,
|
||||
Bundle savedInstanceState) {
|
||||
View rootView = inflater.inflate(R.layout.fragment_followed_users_listing, container, false);
|
||||
|
||||
ButterKnife.bind(this, rootView);
|
||||
|
||||
((Infinity) mActivity.getApplication()).getAppComponent().inject(this);
|
||||
|
||||
applyTheme();
|
||||
|
||||
Resources resources = getResources();
|
||||
|
||||
if ((mActivity instanceof BaseActivity && ((BaseActivity) mActivity).isImmersiveInterface())) {
|
||||
mRecyclerView.setPadding(0, 0, 0, ((BaseActivity) mActivity).getNavBarHeight());
|
||||
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O
|
||||
&& mSharedPreferences.getBoolean(SharedPreferencesUtils.IMMERSIVE_INTERFACE_KEY, true)) {
|
||||
int navBarResourceId = resources.getIdentifier("navigation_bar_height", "dimen", "android");
|
||||
if (navBarResourceId > 0) {
|
||||
mRecyclerView.setPadding(0, 0, 0, resources.getDimensionPixelSize(navBarResourceId));
|
||||
}
|
||||
}
|
||||
|
||||
mGlide = Glide.with(this);
|
||||
|
||||
String accessToken = getArguments().getString(EXTRA_ACCESS_TOKEN);
|
||||
if (accessToken == null) {
|
||||
mSwipeRefreshLayout.setEnabled(false);
|
||||
}
|
||||
mLinearLayoutManager = new LinearLayoutManagerBugFixed(mActivity);
|
||||
mRecyclerView.setLayoutManager(mLinearLayoutManager);
|
||||
BlockedUsersRecyclerViewAdapter adapter = new BlockedUsersRecyclerViewAdapter(mActivity,
|
||||
mExecutor, mOauthRetrofit, mRedditDataRoomDatabase, mCustomThemeWrapper, accessToken);
|
||||
mRecyclerView.setAdapter(adapter);
|
||||
new FastScrollerBuilder(mRecyclerView).useMd2Style().build();
|
||||
|
||||
blockedUserViewModel = new ViewModelProvider(this,
|
||||
new BlockedUserViewModel.Factory(mActivity.getApplication(), mRedditDataRoomDatabase, getArguments().getString(EXTRA_ACCOUNT_NAME)))
|
||||
.get(BlockedUserViewModel.class);
|
||||
|
||||
blockedUserViewModel.getAllSubscribedUsers().observe(getViewLifecycleOwner(), subscribedUserData -> {
|
||||
mSwipeRefreshLayout.setRefreshing(false);
|
||||
if (subscribedUserData == null || subscribedUserData.size() == 0) {
|
||||
mRecyclerView.setVisibility(View.GONE);
|
||||
mLinearLayout.setVisibility(View.VISIBLE);
|
||||
mGlide.load(R.drawable.error_image).into(mImageView);
|
||||
} else {
|
||||
mLinearLayout.setVisibility(View.GONE);
|
||||
mRecyclerView.setVisibility(View.VISIBLE);
|
||||
mGlide.clear(mImageView);
|
||||
}
|
||||
adapter.setSubscribedUsers(subscribedUserData);
|
||||
});
|
||||
|
||||
return rootView;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onAttach(@NonNull Context context) {
|
||||
super.onAttach(context);
|
||||
mActivity = (BaseActivity) context;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void stopRefreshProgressbar() {
|
||||
mSwipeRefreshLayout.setRefreshing(false);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void applyTheme() {
|
||||
if (mActivity instanceof BlockedThingListingActivity) {
|
||||
mSwipeRefreshLayout.setOnRefreshListener(() -> ((BlockedThingListingActivity) mActivity).loadBlocks(true));
|
||||
mSwipeRefreshLayout.setProgressBackgroundColorSchemeColor(mCustomThemeWrapper.getCircularProgressBarBackground());
|
||||
mSwipeRefreshLayout.setColorSchemeColors(mCustomThemeWrapper.getColorAccent());
|
||||
} else {
|
||||
mSwipeRefreshLayout.setEnabled(false);
|
||||
}
|
||||
mErrorTextView.setTextColor(mCustomThemeWrapper.getSecondaryTextColor());
|
||||
if (mActivity.typeface != null) {
|
||||
mErrorTextView.setTypeface(mActivity.typeface);
|
||||
}
|
||||
}
|
||||
|
||||
public void goBackToTop() {
|
||||
if (mLinearLayoutManager != null) {
|
||||
mLinearLayoutManager.scrollToPositionWithOffset(0, 0);
|
||||
}
|
||||
}
|
||||
|
||||
public void changeSearchQuery(String searchQuery) {
|
||||
blockedUserViewModel.setSearchQuery(searchQuery);
|
||||
}
|
||||
}
|
@ -27,7 +27,7 @@ public class ParseSubredditData {
|
||||
}
|
||||
|
||||
@Nullable
|
||||
private static SubredditData parseSubredditData(JSONObject subredditDataJsonObject, boolean nsfw) throws JSONException {
|
||||
public static SubredditData parseSubredditData(JSONObject subredditDataJsonObject, boolean nsfw) throws JSONException {
|
||||
JSONObject community = subredditDataJsonObject.getJSONObject("community");
|
||||
boolean isNSFW = community.getBoolean("nsfw");
|
||||
if (!nsfw && isNSFW) {
|
||||
@ -69,9 +69,10 @@ public class ParseSubredditData {
|
||||
boolean hidden = community.getBoolean("hidden");
|
||||
boolean postingRestrictedToMods = community.getBoolean("posting_restricted_to_mods");
|
||||
int instanceId = community.getInt("instance_id");
|
||||
int subscribers = subredditDataJsonObject.getJSONObject("counts").getInt("subscribers");
|
||||
int subscribers = (subredditDataJsonObject.has("counts")) ? subredditDataJsonObject.getJSONObject("counts").getInt("subscribers") : 0;
|
||||
boolean blocked = (subredditDataJsonObject.has("blocked")) ? subredditDataJsonObject.getBoolean("blocked") : true;
|
||||
|
||||
return new SubredditData(id,name,title,description,removed,published,updated,deleted,isNSFW,actorId,local,iconUrl,bannerImageUrl,hidden,postingRestrictedToMods,instanceId,subscribers);
|
||||
return new SubredditData(id, name, title, description, removed, published, updated, deleted, isNSFW, actorId, local, iconUrl, bannerImageUrl, hidden, postingRestrictedToMods, instanceId, subscribers, blocked);
|
||||
}
|
||||
|
||||
interface ParseSubredditDataListener {
|
||||
|
@ -61,6 +61,9 @@ public class SubredditData {
|
||||
@ColumnInfo(name = "subscribers")
|
||||
private int subscribers;
|
||||
|
||||
@ColumnInfo(name = "blocked")
|
||||
private boolean blocked;
|
||||
|
||||
|
||||
@Ignore
|
||||
private boolean isSelected;
|
||||
@ -201,7 +204,7 @@ public class SubredditData {
|
||||
this.subscribers = subscribers;
|
||||
}
|
||||
|
||||
public SubredditData(int id, String name, String title, String description, boolean removed, String published, String updated, boolean deleted, boolean nsfw, String actorId, boolean local, String icon, String banner, boolean hidden, boolean postingRestrictedToMods, int instanceId, int subscribers) {
|
||||
public SubredditData(int id, String name, String title, String description, boolean removed, String published, String updated, boolean deleted, boolean nsfw, String actorId, boolean local, String icon, String banner, boolean hidden, boolean postingRestrictedToMods, int instanceId, int subscribers, boolean blocked) {
|
||||
this.id = id;
|
||||
this.name = name;
|
||||
this.title = title;
|
||||
@ -219,6 +222,7 @@ public class SubredditData {
|
||||
this.postingRestrictedToMods = postingRestrictedToMods;
|
||||
this.instanceId = instanceId;
|
||||
this.subscribers = subscribers;
|
||||
this.blocked = blocked;
|
||||
}
|
||||
|
||||
public boolean isNSFW() {
|
||||
@ -250,6 +254,14 @@ public class SubredditData {
|
||||
}
|
||||
|
||||
public void setSelected(boolean b) {
|
||||
isSelected =b;
|
||||
isSelected = b;
|
||||
}
|
||||
|
||||
public boolean isBlocked() {
|
||||
return blocked;
|
||||
}
|
||||
|
||||
public void setBlocked(boolean blocked) {
|
||||
this.blocked = blocked;
|
||||
}
|
||||
}
|
||||
|
@ -2,11 +2,8 @@ package eu.toldi.infinityforlemmy.user;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
import eu.toldi.infinityforlemmy.apis.RedditAPI;
|
||||
import eu.toldi.infinityforlemmy.utils.APIUtils;
|
||||
import eu.toldi.infinityforlemmy.apis.LemmyAPI;
|
||||
import eu.toldi.infinityforlemmy.dto.UserBlockDTO;
|
||||
import retrofit2.Call;
|
||||
import retrofit2.Callback;
|
||||
import retrofit2.Response;
|
||||
@ -15,13 +12,13 @@ import retrofit2.Retrofit;
|
||||
public class BlockUser {
|
||||
public interface BlockUserListener {
|
||||
void success();
|
||||
|
||||
void failed();
|
||||
}
|
||||
|
||||
public static void blockUser(Retrofit oauthRetrofit, String accessToken, String username, BlockUserListener blockUserListener) {
|
||||
Map<String, String> params = new HashMap<>();
|
||||
params.put(APIUtils.NAME_KEY, username);
|
||||
oauthRetrofit.create(RedditAPI.class).blockUser(APIUtils.getOAuthHeader(accessToken), params).enqueue(new Callback<String>() {
|
||||
public static void blockUser(Retrofit retrofit, String accessToken, int userID, boolean block, BlockUserListener blockUserListener) {
|
||||
LemmyAPI api = retrofit.create(LemmyAPI.class);
|
||||
api.userBlock(new UserBlockDTO(userID, block, accessToken)).enqueue(new Callback<>() {
|
||||
@Override
|
||||
public void onResponse(@NonNull Call<String> call, @NonNull Response<String> response) {
|
||||
if (response.isSuccessful()) {
|
||||
|
@ -21,7 +21,7 @@ public class ParseUserData {
|
||||
new ParseUserListingDataAsyncTask(response, parseUserListingDataListener).execute();
|
||||
}
|
||||
|
||||
private static UserData parseUserDataBase(JSONObject userDataJson, boolean parseFullKarma) throws JSONException {
|
||||
public static UserData parseUserDataBase(JSONObject userDataJson, boolean parseFullKarma) throws JSONException {
|
||||
if (userDataJson == null) {
|
||||
return null;
|
||||
}
|
||||
@ -38,10 +38,7 @@ public class ParseUserData {
|
||||
if (!personJson.isNull("banner")) {
|
||||
bannerImageUrl = personJson.getString("banner");
|
||||
}
|
||||
JSONObject countsJson = (userDataJson.has("person_view")) ? userDataJson.getJSONObject("person_view").getJSONObject("counts") : userDataJson.getJSONObject("counts");
|
||||
|
||||
int linkKarma = countsJson.getInt(JSONUtils.POST_SCORE_KEY);
|
||||
int commentKarma = countsJson.getInt(JSONUtils.COMMENT_SCORE_KEY);
|
||||
int account_id = personJson.getInt("id");
|
||||
int instance_id = personJson.getInt("instance_id");
|
||||
|
||||
|
@ -0,0 +1,64 @@
|
||||
package eu.toldi.infinityforlemmy.community
|
||||
|
||||
import eu.toldi.infinityforlemmy.apis.LemmyAPI
|
||||
import eu.toldi.infinityforlemmy.dto.BlockCommunityDTO
|
||||
import retrofit2.Call
|
||||
import retrofit2.Callback
|
||||
import retrofit2.Response
|
||||
import retrofit2.Retrofit
|
||||
|
||||
object BlockCommunity {
|
||||
|
||||
fun blockCommunity(
|
||||
retrofit: Retrofit,
|
||||
communityId: Int,
|
||||
auth: String,
|
||||
blockCommunityListener: BlockCommunityListener
|
||||
) {
|
||||
val api = retrofit.create(LemmyAPI::class.java)
|
||||
api.communityBlock(BlockCommunityDTO(communityId, true, auth))?.enqueue(
|
||||
object : Callback<String> {
|
||||
override fun onResponse(call: Call<String>, response: Response<String>) {
|
||||
if (response.isSuccessful) {
|
||||
blockCommunityListener.onBlockCommunitySuccess()
|
||||
} else {
|
||||
blockCommunityListener.onBlockCommunityError()
|
||||
}
|
||||
}
|
||||
|
||||
override fun onFailure(call: Call<String>, t: Throwable) {
|
||||
blockCommunityListener.onBlockCommunityError()
|
||||
}
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
fun unBlockCommunity(
|
||||
retrofit: Retrofit,
|
||||
communityId: Int,
|
||||
auth: String,
|
||||
blockCommunityListener: BlockCommunityListener
|
||||
) {
|
||||
val api = retrofit.create(LemmyAPI::class.java)
|
||||
api.communityBlock(BlockCommunityDTO(communityId, false, auth))?.enqueue(
|
||||
object : Callback<String> {
|
||||
override fun onResponse(call: Call<String>, response: Response<String>) {
|
||||
if (response.isSuccessful) {
|
||||
blockCommunityListener.onBlockCommunitySuccess()
|
||||
} else {
|
||||
blockCommunityListener.onBlockCommunityError()
|
||||
}
|
||||
}
|
||||
|
||||
override fun onFailure(call: Call<String>, t: Throwable) {
|
||||
blockCommunityListener.onBlockCommunityError()
|
||||
}
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
interface BlockCommunityListener {
|
||||
fun onBlockCommunitySuccess()
|
||||
fun onBlockCommunityError()
|
||||
}
|
||||
}
|
@ -0,0 +1,3 @@
|
||||
package eu.toldi.infinityforlemmy.dto
|
||||
|
||||
data class BlockCommunityDTO(val community_id: Int, val block: Boolean, val auth: String)
|
@ -0,0 +1,4 @@
|
||||
package eu.toldi.infinityforlemmy.dto
|
||||
|
||||
data class UserBlockDTO(val person_id: Int, val block: Boolean, val auth: String)
|
||||
|
10
app/src/main/res/drawable/ic_baseline_info_24.xml
Normal file
10
app/src/main/res/drawable/ic_baseline_info_24.xml
Normal file
@ -0,0 +1,10 @@
|
||||
<vector android:height="24dp"
|
||||
android:tint="#000000"
|
||||
android:viewportHeight="24"
|
||||
android:viewportWidth="24"
|
||||
android:width="24dp"
|
||||
xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<path
|
||||
android:fillColor="@android:color/white"
|
||||
android:pathData="M12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM13,17h-2v-6h2v6zM13,9h-2L11,7h2v2z" />
|
||||
</vector>
|
@ -30,17 +30,18 @@
|
||||
app:showAsAction="never" />
|
||||
|
||||
<item
|
||||
android:id="@+id/action_select_user_flair_view_subreddit_detail_activity"
|
||||
android:id="@+id/block_community_view_subreddit_detail_activity"
|
||||
android:orderInCategory="5"
|
||||
android:title="@string/action_select_user_flair"
|
||||
android:title="@string/block_community"
|
||||
app:showAsAction="never" />
|
||||
|
||||
<item
|
||||
android:id="@+id/action_add_to_multireddit_view_subreddit_detail_activity"
|
||||
android:orderInCategory="6"
|
||||
android:title="@string/action_add_to_multireddit"
|
||||
android:id="@+id/unblock_community_view_subreddit_detail_activity"
|
||||
android:orderInCategory="5"
|
||||
android:title="@string/unblock_community"
|
||||
app:showAsAction="never" />
|
||||
|
||||
|
||||
<item
|
||||
android:id="@+id/action_add_to_post_filter_view_subreddit_detail_activity"
|
||||
android:orderInCategory="7"
|
||||
@ -53,11 +54,6 @@
|
||||
android:title="@string/action_share"
|
||||
app:showAsAction="never" />
|
||||
|
||||
<item
|
||||
android:id="@+id/action_go_to_wiki_view_subreddit_detail_activity"
|
||||
android:orderInCategory="9"
|
||||
android:title="@string/action_go_to_wiki"
|
||||
app:showAsAction="never" />
|
||||
|
||||
<item
|
||||
android:id="@+id/action_contact_mods_view_subreddit_detail_activity"
|
||||
|
@ -38,12 +38,6 @@
|
||||
android:title="@string/action_share"
|
||||
app:showAsAction="never" />
|
||||
|
||||
<item
|
||||
android:id="@+id/action_add_to_multireddit_view_user_detail_activity"
|
||||
android:orderInCategory="7"
|
||||
android:title="@string/action_add_to_multireddit"
|
||||
app:showAsAction="never" />
|
||||
|
||||
<item
|
||||
android:id="@+id/action_add_to_post_filter_view_user_detail_activity"
|
||||
android:orderInCategory="8"
|
||||
@ -60,6 +54,12 @@
|
||||
android:orderInCategory="10"
|
||||
android:title="@string/action_block_user" />
|
||||
|
||||
<item
|
||||
android:id="@+id/action_unblock_user_view_user_detail_activity"
|
||||
android:visible="false"
|
||||
android:orderInCategory="10"
|
||||
android:title="@string/action_unblock_user" />
|
||||
|
||||
<item
|
||||
android:id="@+id/action_edit_profile_view_user_detail_activity"
|
||||
android:orderInCategory="11"
|
||||
|
2
app/src/main/res/values-bn/strings.xml
Normal file
2
app/src/main/res/values-bn/strings.xml
Normal file
@ -0,0 +1,2 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources></resources>
|
@ -1092,4 +1092,44 @@
|
||||
<string name="comment_karma">Karma za komentarze:</string>
|
||||
<string name="awarder_karma">Karma za nagradzanie:</string>
|
||||
<string name="awardee_karma">Karma za bycie nagradzanym:</string>
|
||||
<string name="blocks">Zablokowani</string>
|
||||
<string name="block_community_success">Społeczność została zablokowana!</string>
|
||||
<string name="unblock_community">Odblokuj społeczność</string>
|
||||
<string name="instance_info">Informacje o instancji</string>
|
||||
<string name="blocked_communities">Zablokowane społeczości</string>
|
||||
<string name="blocked_users">Zablokowani użytkownicy</string>
|
||||
<string name="action_block_user">Zablokuj użytkownika</string>
|
||||
<string name="settings_link_handler_value_custom_tab">Niestandardowa zakładka</string>
|
||||
<string name="history_activity_label">Historia</string>
|
||||
<string name="edit_profile_activity_label">Edytuj profil</string>
|
||||
<string name="action_more_options">Więcej opcji</string>
|
||||
<string name="history">Historia</string>
|
||||
<string name="settings_nsfw_download_location_title">Lokalizacja pobierania NSFW</string>
|
||||
<string name="settings_show_fewer_toolbar_options_threshold_summary">Poziom %1$d</string>
|
||||
<string name="block_user">Zablokuj użytkownika</string>
|
||||
<string name="block_user_success">Zablokowane</string>
|
||||
<string name="edited">Edytowano</string>
|
||||
<string name="post_filter_usage_community">Społeczność: %1$s</string>
|
||||
<string name="extra_small">Bardzo małe</string>
|
||||
<string name="display_name_text">Wyświetlana nazwa</string>
|
||||
<string name="user_agreement_dialog_title">Zgoda użytkownika</string>
|
||||
<string name="invalid_link">Nieprawidłowy link</string>
|
||||
<string name="image_index_in_gallery">%1$d/%2$d</string>
|
||||
<string name="go_to_settings">Ustawienia</string>
|
||||
<string name="user_username">Nazwa użytkownika</string>
|
||||
<string name="user_password">Hasło</string>
|
||||
<string name="user_login">Login</string>
|
||||
<string name="i_understand">Rozumiem</string>
|
||||
<string name="instance_url">Link do instancji</string>
|
||||
<string name="sort_time_6hours">6 godzin</string>
|
||||
<string name="sort_time_12hours">12 godzin</string>
|
||||
<string name="mentions">Wzmianka</string>
|
||||
<string name="replies">Odpowiedzi</string>
|
||||
<string name="sort_time_3months">3 miesiące</string>
|
||||
<string name="sort_time_6months">6 miesięcy</string>
|
||||
<string name="sort_time_9months">9 miesięcy</string>
|
||||
<string name="block_community">Zablokuj społeczność
|
||||
\n</string>
|
||||
<string name="unblock_community_success">Społeczność została odblokowana!</string>
|
||||
<string name="action_create_github_issue">Stwórz zgłoszenie na Codeberg</string>
|
||||
</resources>
|
@ -4,26 +4,26 @@
|
||||
<string name="comment_activity_label">Отправить комментарий</string>
|
||||
<string name="comment_activity_label_is_replying">Ответить</string>
|
||||
<string name="post_text_activity_label">Текстовый пост</string>
|
||||
<string name="community_selection_activity_label">Выберите сабреддит</string>
|
||||
<string name="community_selection_activity_label">Выберите сообщество</string>
|
||||
<string name="post_link_activity_label">Пост со ссылкой</string>
|
||||
<string name="post_image_activity_label">Пост с изображением</string>
|
||||
<string name="post_video_activity_label">Пост с видео</string>
|
||||
<string name="rules_activity_label">Правила</string>
|
||||
<string name="search_community_activity_label">Сабреддиты</string>
|
||||
<string name="search_community_activity_label">Сообщества</string>
|
||||
<string name="edit_post_activity_label">Изменить пост</string>
|
||||
<string name="edit_comment_activity_label">Изменить комментарий</string>
|
||||
<string name="view_message_activity_label">Входящие</string>
|
||||
<string name="settings_activity_label">Настройки</string>
|
||||
<string name="account_saved_thing_activity_label">Сохранено</string>
|
||||
<string name="create_multi_reddit_activity_label">Создать мультиреддит</string>
|
||||
<string name="community_multiselection_activity_label">Выберите сабреддиты</string>
|
||||
<string name="create_multi_reddit_activity_label">Создать мультисообщество</string>
|
||||
<string name="community_multiselection_activity_label">Выберите сообщества</string>
|
||||
<string name="custom_theme_listing_activity_label">Пользовательские темы</string>
|
||||
<string name="customize_theme_activity_label">Изменить тему</string>
|
||||
<string name="customize_theme_activity_create_theme_label">Создать тему</string>
|
||||
<string name="theme_preview_activity_label">Предпросмотр темы</string>
|
||||
<string name="edit_multi_reddit_activity_label">Изменить мультиреддит</string>
|
||||
<string name="edit_multi_reddit_activity_label">Изменить мультисообщество</string>
|
||||
<!-- This is a duplicate, and I forgot to add another "д" -->
|
||||
<string name="selected_subeddits_activity_label">Выбранные сабреддиты</string>
|
||||
<string name="selected_subeddits_activity_label">Выбранные сообщества</string>
|
||||
<string name="report_activity_label">Пожаловаться</string>
|
||||
<!-- Idk what this is supposed to be in english -->
|
||||
<string name="view_imgur_media_activity_image_label">Изображение %1$d/%2$d</string>
|
||||
@ -35,7 +35,7 @@
|
||||
<string name="view_reddit_gallery_activity_video_label">Видео %1$d/%2$d</string>
|
||||
<string name="navigation_drawer_open">Открыть панель навигации</string>
|
||||
<string name="navigation_drawer_close">Закрыть панель навигации</string>
|
||||
<string name="action_download">Загрузить</string>
|
||||
<string name="action_download">Скачать</string>
|
||||
<string name="action_refresh">Обновить</string>
|
||||
<string name="action_add_comment">Добавить комментарий</string>
|
||||
<string name="action_save_post">Сохранить пост</string>
|
||||
@ -56,8 +56,8 @@
|
||||
<string name="action_edit_flair">Изменить флейр</string>
|
||||
<string name="action_change_post_layout">Выбрать вид поста</string>
|
||||
<string name="action_save">Сохранить</string>
|
||||
<string name="action_edit_multi_reddit">Изменить мультиреддит</string>
|
||||
<string name="action_delete_multi_reddit">Удалить мультиреддит</string>
|
||||
<string name="action_edit_multi_reddit">Изменить мультисообщество</string>
|
||||
<string name="action_delete_multi_reddit">Удалить мультисообщество</string>
|
||||
<string name="action_share">Поделиться</string>
|
||||
<string name="action_preview">Предпросмотр</string>
|
||||
<string name="action_report">Пожаловаться</string>
|
||||
@ -71,19 +71,20 @@
|
||||
<string name="parse_user_info_error">Произошла ошибка во время обработки информации о пользователе</string>
|
||||
<string name="no_system_webview_error">Ошибка открытия системного WebView</string>
|
||||
<string name="error_loading_image_tap_to_retry">Произошла ошибка при загрузке изображения. Нажмите, чтобы повторить попытку.</string>
|
||||
<string name="load_posts_error">Произошла ошибка при загрузке постов. Нажмите, чтобы повторить попытку.</string>
|
||||
<string name="load_posts_error">Произошла ошибка при загрузке постов.
|
||||
\nНажмите, чтобы повторить попытку.</string>
|
||||
<string name="load_more_posts_error">Произошла ошибка при загрузке постов.</string>
|
||||
<string name="load_post_error">Произошла ошибка при загрузке поста.
|
||||
\nНажмите, чтобы повторить попытку.</string>
|
||||
<string name="search_communities_error">Произошла ошибка при поиске сабреддитов.
|
||||
<string name="search_communities_error">Произошла ошибка при поиске сообществ.
|
||||
\nНажмите, чтобы повторить попытку.</string>
|
||||
<string name="search_users_error">Произошла ошибка при поиске пользователей.
|
||||
\nНажмите, чтобы повторить попытку.</string>
|
||||
<string name="no_posts">Посты не найдены</string>
|
||||
<string name="no_comments">Комментарии не найдены</string>
|
||||
<string name="no_communities">Сабреддиты не найдены</string>
|
||||
<string name="no_communities">Сообщества не найдены</string>
|
||||
<string name="no_users">Пользователи не найдены</string>
|
||||
<string name="no_multi_reddits">Мультиреддиты не найдены</string>
|
||||
<string name="no_multi_reddits">Мультисообщества не найдены</string>
|
||||
<string name="no_storage_permission">Отсутствует доступ к хранилищу для сохранения этого файла</string>
|
||||
<string name="load_comments_failed">Произошла ошибка при загрузке комментариев.
|
||||
\nНажмите, чтобы повторить попытку.</string>
|
||||
@ -91,8 +92,9 @@
|
||||
<string name="comments">Комментарии</string>
|
||||
<string name="no_comments_yet">Комментариев ещё нет. Написать комментарий\?</string>
|
||||
<string name="vote_failed">Невозможно проголосовать</string>
|
||||
<string name="refresh_post_failed">Произошла ошибка при обновлении поста.</string>
|
||||
<string name="load_messages_failed">Ошибка загрузки сообщений. Нажмите для повтора.</string>
|
||||
<string name="refresh_post_failed">Произошла ошибка при обновлении поста</string>
|
||||
<string name="load_messages_failed">Ошибка загрузки сообщений.
|
||||
\nНажмите для повтора.</string>
|
||||
<string name="no_messages">Пусто</string>
|
||||
<string name="nsfw">NSFW</string>
|
||||
<string name="karma_info">Карма: %1$d</string>
|
||||
@ -103,7 +105,7 @@
|
||||
<string name="since">Создан:</string>
|
||||
<string name="profile">Профиль</string>
|
||||
<string name="subscriptions">Подписки</string>
|
||||
<string name="multi_reddit">Мультиреддит</string>
|
||||
<string name="multi_reddit">Мультисообщество</string>
|
||||
<string name="inbox">Входящие</string>
|
||||
<string name="upvoted">Голос+</string>
|
||||
<string name="downvoted">Голос-</string>
|
||||
@ -113,27 +115,27 @@
|
||||
<string name="settings">Настройки</string>
|
||||
<string name="subscribers_number_detail">Подписчики: %1$d</string>
|
||||
<string name="online_subscribers_number_detail">Онлайн: %1$d</string>
|
||||
<string name="cannot_fetch_community_info">Невозможно получить информацию о сабреддите</string>
|
||||
<string name="cannot_fetch_community_info">Невозможно получить информацию о сообществе</string>
|
||||
<string name="cannot_fetch_user_info">Невозможно получить информацию о пользователе</string>
|
||||
<string name="cannot_fetch_sidebar">Невозможно получить боковую панель</string>
|
||||
<string name="cannot_fetch_multireddit">Невозможно получить информацию о мультиреддите</string>
|
||||
<string name="cannot_fetch_multireddit">Невозможно получить информацию о мультисообществе</string>
|
||||
<string name="subscribe">Подписаться</string>
|
||||
<string name="unsubscribe">Отписаться</string>
|
||||
<string name="subscribed">Вы подписаны</string>
|
||||
<string name="subscribe_failed">Невозможно подписаться</string>
|
||||
<string name="subscribe_failed">Не удалось подписаться</string>
|
||||
<string name="unsubscribed">Вы отписались</string>
|
||||
<string name="unsubscribe_failed">Ну удалось отписаться</string>
|
||||
<string name="unsubscribe_failed">Не удалось отписаться</string>
|
||||
<string name="follow">Следить</string>
|
||||
<string name="unfollow">Не следить</string>
|
||||
<string name="followed">Вы следите</string>
|
||||
<string name="follow_failed">Невозможно начать следить</string>
|
||||
<string name="unfollowed">Вы не следите</string>
|
||||
<string name="unfollow_failed">Невозможно отписаться</string>
|
||||
<string name="content_description_banner_imageview">Изображение баннера сабреддита</string>
|
||||
<string name="content_description_banner_imageview">Изображение баннера сообщества</string>
|
||||
<string name="app_label">Infinity</string>
|
||||
<string name="search_hint">Ищите что угодно</string>
|
||||
<string name="no_posts_no_lazy_mode">Нет доступных постов</string>
|
||||
<string name="lazy_mode_start">Ленивый режим начнётся через %1$.1fs</string>
|
||||
<string name="lazy_mode_start">Ленивый режим начнётся через %1$.1fc</string>
|
||||
<string name="lazy_mode_stop">Ленивый режим остановлен</string>
|
||||
<string name="write_comment_hint">Ваши интересные мысли здесь</string>
|
||||
<string name="comment_content_required">А где ваши интересные размышления\?</string>
|
||||
@ -151,7 +153,7 @@
|
||||
<string name="sending_message">Отправляем</string>
|
||||
<string name="send_message_success">Сообщение отправлено</string>
|
||||
<string name="send_message_failed">Невозможно отправить это сообщение</string>
|
||||
<string name="select_a_community">Пожалуйста, сначала выберите сабреддит</string>
|
||||
<string name="select_a_community">Пожалуйста, сначала выберите сообщество</string>
|
||||
<!-- Fuzzy -->
|
||||
<string name="title_required">Требуется заголовок поста</string>
|
||||
<string name="link_required">А где ссылка\?</string>
|
||||
@ -162,16 +164,16 @@
|
||||
<string name="error_processing_video">Ошибка при обработке видео</string>
|
||||
<string name="download_started">Загрузка началась. Проверьте уведомления для отслеживания прогресса.</string>
|
||||
<string name="comment_load_more_comments">Загрузить больше комментариев</string>
|
||||
<string name="comment_load_more_comments_failed">Загрузка не выполнена. Нажмите для повторной загрузки.</string>
|
||||
<string name="comment_load_more_comments_failed">Загрузка не удалась. Нажмите для повторной загрузки.</string>
|
||||
<string name="loading">Загрузка</string>
|
||||
<string name="post_title_hint">Заголовок</string>
|
||||
<string name="post_text_content_hint">Контент</string>
|
||||
<string name="choose_a_communities">Выбрать сабреддит</string>
|
||||
<string name="choose_a_communities">Выбрать сообщество</string>
|
||||
<string name="rules">Правила</string>
|
||||
<string name="post_link_hint">Ссылка</string>
|
||||
<string name="communities">Сабреддиты</string>
|
||||
<string name="communities">Сообщества</string>
|
||||
<string name="users">Пользователи</string>
|
||||
<string name="multi_reddits">Мультиреддиты</string>
|
||||
<string name="multi_reddits">МультиСообщества</string>
|
||||
<string name="bottom_sheet_post_text">Текст</string>
|
||||
<string name="bottom_sheet_post_link">Ссылка</string>
|
||||
<string name="bottom_sheet_post_image">Изображение</string>
|
||||
@ -185,29 +187,29 @@
|
||||
<string name="video_is_processing">Видео обрабатывается. Пожалуйста, подождите.</string>
|
||||
<string name="image_is_processing">Изображение обрабатывается. Пожалуйста, подождите.</string>
|
||||
<string name="gif_is_processing">GIF обрабатывается. Пожалуйста, подождите.</string>
|
||||
<string name="flair">Стиль</string>
|
||||
<string name="flair">Флейр</string>
|
||||
<string name="spoiler">Спойлер</string>
|
||||
<string name="no_flair">Нет стиля</string>
|
||||
<string name="error_loading_flairs">Ошибка загрузки стилей.
|
||||
<string name="no_flair">Нет флейра</string>
|
||||
<string name="error_loading_flairs">Ошибка загрузки флейров.
|
||||
\nНажмите, чтобы перезагрузить.</string>
|
||||
<string name="no_rule">Правил нет</string>
|
||||
<string name="error_loading_rules">Ошибка загрузки правил.
|
||||
\nНажмите, чтобы перезагрузить.</string>
|
||||
<string name="error_loading_rules_without_retry">Ошибка загрузки правил</string>
|
||||
<string name="search_in">Искать в</string>
|
||||
<string name="all_communities">Все сабреддиты</string>
|
||||
<string name="sort_best">Лучшее</string>
|
||||
<string name="all_communities">Все сообщества</string>
|
||||
<string name="sort_best">Активное</string>
|
||||
<string name="sort_hot">Горячее</string>
|
||||
<string name="sort_new">Новое</string>
|
||||
<string name="sort_random">Случайный</string>
|
||||
<string name="sort_random">Случайное</string>
|
||||
<string name="sort_rising">Набирающее популярность</string>
|
||||
<string name="sort_top">Топовое</string>
|
||||
<string name="sort_controversial">Обсуждаемое</string>
|
||||
<string name="sort_controversial">Спорное</string>
|
||||
<string name="sort_relevance">Релевантное</string>
|
||||
<string name="sort_comments">Комментарии</string>
|
||||
<string name="sort_activity">Активность</string>
|
||||
<string name="sort_confidence">Доверенное</string>
|
||||
<string name="sort_old">Старый</string>
|
||||
<string name="sort_old">Старые</string>
|
||||
<string name="sort_qa">ЧаВО</string>
|
||||
<string name="sort_live">Непрерывно</string>
|
||||
<string name="sort_time_hour">Час</string>
|
||||
@ -216,7 +218,7 @@
|
||||
<string name="sort_time_month">Месяц</string>
|
||||
<string name="sort_time_year">Год</string>
|
||||
<string name="sort_time_all_time">За всё время</string>
|
||||
<string name="no_activity_found_for_share">Нечем обработать действие «Поделиться».</string>
|
||||
<string name="no_activity_found_for_share">Нет приложения, способного обработать действие «Поделиться»</string>
|
||||
<string name="archived_post_vote_unavailable">Архивный пост. Голосование недоступно.</string>
|
||||
<string name="archived_post_comment_unavailable">Архивный пост. Комментирование недоступно.</string>
|
||||
<string name="archived_post_reply_unavailable">Архивный пост. Ответ невозможен.</string>
|
||||
@ -233,7 +235,7 @@
|
||||
<string name="posting_video">Видео публикуется</string>
|
||||
<string name="posting_image">Изображение публикуется</string>
|
||||
<!-- Fuzzy -->
|
||||
<string name="please_wait">Пожалуйста, подождите.</string>
|
||||
<string name="please_wait">Пожалуйста, подождите</string>
|
||||
<!-- Fuzzy -->
|
||||
<string name="add_account">Добавить аккаунт</string>
|
||||
<string name="anonymous_account">Аноним</string>
|
||||
@ -247,8 +249,8 @@
|
||||
<string name="post_hide_success">Пост скрыт</string>
|
||||
<string name="post_hide_failed">Невозможно скрыть пост</string>
|
||||
<string name="post_unhide_success">Пост раскрыт</string>
|
||||
<string name="thing_favorite_failed">Невозможно добавить в избранное</string>
|
||||
<string name="thing_unfavorite_failed">Невозможно удалить из избранного</string>
|
||||
<string name="thing_favorite_failed">Не удалось добавить в избранное</string>
|
||||
<string name="thing_unfavorite_failed">Не удалось удалить из избранного</string>
|
||||
<string name="post_unhide_failed">Невозможно показать пост</string>
|
||||
<string name="delete_this_post">Удалить этот пост</string>
|
||||
<string name="delete_this_comment">Удалить этот комментарий</string>
|
||||
@ -259,12 +261,12 @@
|
||||
<string name="fetching_removed_comment">Получение удалённого комментария</string>
|
||||
<string name="show_removed_comment_failed">Невозможно найти удалённый комментарий</string>
|
||||
<string name="fetching_removed_post">Получение удалённого сообщения</string>
|
||||
<string name="show_removed_post_failed">Невозможно найти удалённую запись</string>
|
||||
<string name="cancel">Отменить</string>
|
||||
<string name="show_removed_post_failed">Невозможно найти удалённый пост</string>
|
||||
<string name="cancel">Отмена</string>
|
||||
<string name="ok">ОК</string>
|
||||
<string name="edit_success">Редактирование успешно</string>
|
||||
<string name="delete_post_success">Удалено успешно</string>
|
||||
<string name="delete_post_failed">Невозможно удалить</string>
|
||||
<string name="delete_post_failed">Не удалось удалить</string>
|
||||
<string name="mark_nsfw_success">Успешно отмечено как NSFW</string>
|
||||
<string name="mark_nsfw_failed">Невозможно отметить как NSFW</string>
|
||||
<string name="unmark_nsfw_success">Отметка NSFW снята успешно</string>
|
||||
@ -280,9 +282,9 @@
|
||||
<string name="view_all_comments">Нажмите здесь, чтобы посмотреть все комментарии</string>
|
||||
<string name="notification_summary_account">Аккаунт</string>
|
||||
<string name="notification_summary_message">Новое сообщение</string>
|
||||
<string name="notification_summary_community">Сабреддит</string>
|
||||
<string name="notification_summary_community">Сообщество</string>
|
||||
<string name="notification_summary_award">Награда</string>
|
||||
<string name="notification_new_messages">Новых сообщений: %1$d</string>
|
||||
<string name="notification_new_messages">%1$d новых сообщений</string>
|
||||
<string name="label_account">Аккаунт</string>
|
||||
<string name="label_post">Пост</string>
|
||||
<string name="label_preferences">Настройки</string>
|
||||
@ -317,7 +319,7 @@
|
||||
<string name="settings_mute_video_title">Видео без звука</string>
|
||||
<string name="settings_mute_nsfw_video_title">NSFW-видео без звука</string>
|
||||
<!-- Fuzzy -->
|
||||
<string name="settings_automatically_try_redgifs_title">Автопопытка доступа к Redgifs, если видео на Gfycat удалены.</string>
|
||||
<string name="settings_automatically_try_redgifs_title">Пытаться использовать Redgifs, если видео на Gfycat удалены.</string>
|
||||
<string name="settings_video_player_ignore_nav_bar_title">Не использовать панель навигации в видеоплеере</string>
|
||||
<string name="settings_video_player_ignore_nav_bar_summary">Предотвратить случайные нажатия</string>
|
||||
<string name="settings_confirm_to_exit">Подтверждать выход</string>
|
||||
@ -374,18 +376,18 @@
|
||||
<string name="settings_credits_best_rocket_icon_summary">Значок создан Freepik из www.flaticon.com</string>
|
||||
<string name="settings_credits_material_icons_title">Значки Material</string>
|
||||
<string name="settings_open_source_title">Открытый исходный код</string>
|
||||
<string name="settings_open_source_summary">Оцените его на Github, если вам нравится это приложение</string>
|
||||
<string name="settings_rate_title">Оцените на Google Play</string>
|
||||
<string name="settings_open_source_summary">Оцените его на Codeberg, если вам нравится это приложение</string>
|
||||
<string name="settings_rate_title">Оцените в Google Play</string>
|
||||
<string name="settings_rate_summary">Поставьте мне оценку 5 звёзд, и я буду очень счастлив</string>
|
||||
<string name="settings_email_title">Электронная почта</string>
|
||||
<string name="settings_email_summary">docilealligator.app@gmail.com</string>
|
||||
<string name="settings_reddit_account_title">Аккаунт Reddit</string>
|
||||
<string name="settings_reddit_account_summary">u/Hostilenemy</string>
|
||||
<string name="settings_community_title">Сабреддит</string>
|
||||
<string name="settings_email_title">Mastodon</string>
|
||||
<string name="settings_email_summary">\@bazsalanszky@fosstodon.org</string>
|
||||
<string name="settings_reddit_account_title">Аккаунт Lemmy</string>
|
||||
<string name="settings_reddit_account_summary">\@bazsalanszky@lemmy.toldi.eu</string>
|
||||
<string name="settings_community_title">Сообщество</string>
|
||||
<string name="settings_community_summary">!infinityforlemmy@lemdro.id</string>
|
||||
<string name="settings_share_title">Поделиться</string>
|
||||
<string name="settings_share_summary">Поделитесь этим приложением с другими людьми, если оно вам нравится</string>
|
||||
<string name="settings_version_title">Infinity для Reddit</string>
|
||||
<string name="settings_version_title">Infinity для Lemmy</string>
|
||||
<string name="settings_version_summary">Версия %s</string>
|
||||
<string name="settings_category_customization_title">Персонализация</string>
|
||||
<string name="settings_customize_light_theme_title">Светлая тема</string>
|
||||
@ -393,7 +395,7 @@
|
||||
<string name="settings_customize_amoled_theme_title">Тема AMOLED</string>
|
||||
<string name="settings_manage_themes_title">Менеджер тем</string>
|
||||
<string name="settings_advanced_master_title">Дополнительные</string>
|
||||
<string name="settings_delete_all_communities_data_in_database_title">Удалить все сабреддиты из базы данных</string>
|
||||
<string name="settings_delete_all_communities_data_in_database_title">Удалить все сообщества из базы данных</string>
|
||||
<string name="settings_delete_all_users_data_in_database_title">Удалить всех пользователей из базы данных</string>
|
||||
<string name="settings_delete_all_sort_type_data_in_database_title">Удалить все типы сортировки из базы данных</string>
|
||||
<string name="settings_delete_all_post_layout_data_in_database_title">Удалить все макеты постов в базе данных</string>
|
||||
@ -405,17 +407,17 @@
|
||||
<string name="settings_tab_3_summary">Вкладка 3</string>
|
||||
<string name="settings_tab_title">Название</string>
|
||||
<string name="settings_tab_post_type">Тип</string>
|
||||
<string name="settings_tab_community_name">Название сабреддита (без префикса r/)</string>
|
||||
<string name="settings_tab_community_name">Название сообщества (без префикса @)</string>
|
||||
<!-- Fuzzy -->
|
||||
<string name="settings_tab_multi_reddit_name">Путь мультиреддита (/user/yourusername/m/yourmultiredditname)</string>
|
||||
<string name="settings_tab_multi_reddit_name">Путь мультисообщества (/user/yourusername/m/yourmulticommunityname)</string>
|
||||
<string name="settings_tab_username">Имя пользователя (без префикса u/)</string>
|
||||
<string name="no_developer_easter_egg">Здесь нет вариантов разработчика</string>
|
||||
<string name="no_developer_easter_egg">Здесь нет настроек для разработчика</string>
|
||||
<string name="no_link_available">Не могу получить ссылку</string>
|
||||
<string name="exit_when_submit">Выйти\?</string>
|
||||
<string name="exit_when_submit_post_detail">Пост всё равно будет отправлен, даже если вы уйдёте отсюда.</string>
|
||||
<string name="exit_when_edit_post_detail">Пост может быть отправлено, даже если вы уйдёте отсюда.</string>
|
||||
<string name="exit_when_edit_post_detail">Пост может быть отправлен, даже если вы уйдёте отсюда.</string>
|
||||
<string name="exit_when_edit_comment_detail">Комментарий всё ещё может быть отправлен, даже если вы уйдёте отсюда.</string>
|
||||
<string name="discard">Отменить\?</string>
|
||||
<string name="discard">Удалить\?</string>
|
||||
<string name="discard_detail">Все черновики НЕ будут сохранены.</string>
|
||||
<string name="yes">Да</string>
|
||||
<string name="no">Нет</string>
|
||||
@ -436,9 +438,9 @@
|
||||
<string name="post_layout_compact">Компактный стиль</string>
|
||||
<string name="elapsed_time_just_now">Только что</string>
|
||||
<string name="elapsed_time_a_minute_ago">1 минута</string>
|
||||
<string name="elapsed_time_minutes_ago">%1$d мин.</string>
|
||||
<string name="elapsed_time_minutes_ago">%1$d минут</string>
|
||||
<string name="elapsed_time_an_hour_ago">1 час</string>
|
||||
<string name="elapsed_time_hours_ago">%1$d час.</string>
|
||||
<string name="elapsed_time_hours_ago">%1$d часов</string>
|
||||
<string name="elapsed_time_yesterday">Вчера</string>
|
||||
<!-- I am not sure how to unify this one. Plural form differs depending on numerals. -->
|
||||
<string name="elapsed_time_days_ago">%1$d дн.</string>
|
||||
@ -446,12 +448,12 @@
|
||||
<string name="elapsed_time_months_ago">%1$d мес.</string>
|
||||
<string name="elapsed_time_a_year_ago">1 год</string>
|
||||
<string name="elapsed_time_years_ago">%1$d лет</string>
|
||||
<string name="error_getting_multi_reddit_data">Ошибка при получении данных о мультиреддите</string>
|
||||
<string name="error_loading_multi_reddit_list">Невозможно синхронизировать мультиреддиты</string>
|
||||
<string name="error_getting_multi_reddit_data">Ошибка при получении данных о мультисообществе</string>
|
||||
<string name="error_loading_multi_reddit_list">Невозможно синхронизировать мультисообщества</string>
|
||||
<string name="error_loading_subscriptions">Невозможно синхронизировать подписки</string>
|
||||
<string name="share_this_app">Попробуйте Infinity для Reddit, отличный клиент для Реддита!
|
||||
<string name="share_this_app">Попробуйте Infinity для Lemmy, отличный клиент для Lemmy!
|
||||
\nhttps://play.google.com/store/apps/details\?id=eu.toldi.infinityforlemmy</string>
|
||||
<string name="error_getting_community_name">Ошибка при получении названия сабреддита</string>
|
||||
<string name="error_getting_community_name">Ошибка при получении названия сообщества</string>
|
||||
<string name="share_post_link">Поделиться ссылкой на пост</string>
|
||||
<string name="share_image_link">Поделиться ссылкой на изображение</string>
|
||||
<string name="share_gif_link">Поделиться ссылкой на GIF</string>
|
||||
@ -477,9 +479,9 @@
|
||||
<string name="multi_reddit_description_hint">Описание</string>
|
||||
<string name="private_multi_reddit">Приватный</string>
|
||||
<string name="no_multi_reddit_name">Где название\?</string>
|
||||
<string name="create_multi_reddit_failed">Невозможно создать мультиреддит</string>
|
||||
<string name="duplicate_multi_reddit">Мультиреддит уже существует</string>
|
||||
<string name="edit_multi_reddit_failed">Невозможно изменить мультиреддит</string>
|
||||
<string name="create_multi_reddit_failed">Невозможно создать мультисообщество</string>
|
||||
<string name="duplicate_multi_reddit">Мультисообщество уже существует</string>
|
||||
<string name="edit_multi_reddit_failed">Невозможно изменить мультисообщество</string>
|
||||
<string name="delete_multi_reddit_success">Успешно удалено</string>
|
||||
<string name="delete_multi_reddit_failed">Ошибка удаления</string>
|
||||
<string name="delete_multi_reddit_dialog_message">Вы уверены\?</string>
|
||||
@ -490,7 +492,7 @@
|
||||
<string name="cannot_get_storage">Нет доступа к хранилищу</string>
|
||||
<string name="save_image_first">Изображение сохраняется. Пожалуйста, подождите.</string>
|
||||
<string name="save_gif_first">GIF сохраняется. Пожалуйста, подождите.</string>
|
||||
<string name="theme_name_description">Нажмите, чтобы поменять название темы</string>
|
||||
<string name="theme_name_description">Нажмите, чтобы изменить название темы.</string>
|
||||
<string name="theme_item_is_light_theme">Установить как светлую тему</string>
|
||||
<string name="theme_item_is_dark_theme">Установить как тёмную тему</string>
|
||||
<string name="theme_item_is_amoled_theme">Установить как тему AMOLED</string>
|
||||
@ -539,7 +541,7 @@
|
||||
<string name="theme_item_bottom_app_bar_background_color">Цвет нижней панели навигации</string>
|
||||
<string name="theme_item_bottom_app_bar_background_color_detail">Применяется к: кнопки панели навигации</string>
|
||||
<string name="theme_item_primary_icon_color">Цвет основного значка</string>
|
||||
<string name="theme_item_primary_icon_color_detail">Применяется к: значки в панели навигации</string>
|
||||
<string name="theme_item_primary_icon_color_detail">Применяется к: значки в панели навигации.</string>
|
||||
<string name="theme_item_bottom_app_bar_icon_color">Цвет значка нижней панели</string>
|
||||
<string name="theme_item_bottom_app_bar_icon_color_detail">Применяется к: значки на нижней панели навигации</string>
|
||||
<string name="theme_item_post_icon_and_info_color">Значок поста и цвет информации</string>
|
||||
@ -558,9 +560,9 @@
|
||||
<string name="theme_item_circular_progress_bar_background_color_detail">Применяется к: фон кругового индикатора выполнения</string>
|
||||
<string name="theme_item_tab_layout_with_expanded_collapsing_toolbar_tab_background">Цвет фона макета вкладки свёрнутой панели инструментов</string>
|
||||
<string name="theme_item_tab_layout_with_expanded_collapsing_toolbar_tab_background_detail">Применяется к: фон макета вкладки (свёрнутая панель инструментов)</string>
|
||||
<string name="theme_item_tab_layout_with_expanded_collapsing_toolbar_text_color">Цвет текста макета вкладки свёрнутой панели инструментов</string>
|
||||
<string name="theme_item_tab_layout_with_expanded_collapsing_toolbar_text_color_detail">Применяется к: цвет текста макета вкладки (свёрнутая панель инструментов)</string>
|
||||
<string name="theme_item_tab_layout_with_expanded_collapsing_toolbar_tab_indicator">Цвет индикатора вкладки в макете вкладки свёрнутой панели инструментов</string>
|
||||
<string name="theme_item_tab_layout_with_expanded_collapsing_toolbar_text_color">Цвет текста макета вкладки раскрытой панели инструментов</string>
|
||||
<string name="theme_item_tab_layout_with_expanded_collapsing_toolbar_text_color_detail">Применяется к: цвет текста макета вкладки (раскрытая панель инструментов)</string>
|
||||
<string name="theme_item_tab_layout_with_expanded_collapsing_toolbar_tab_indicator">Цвет индикатора вкладки в макете вкладки раскрытой панели инструментов</string>
|
||||
<string name="theme_item_tab_layout_with_expanded_collapsing_toolbar_tab_indicator_detail">Применяется к: цвет индикатора вкладки в макете вкладки (свёрнутая панель инструментов)</string>
|
||||
<string name="theme_item_tab_layout_with_collapsed_collapsing_toolbar_tab_background">Цвет фона вкладки макета свёрнутой панели инструментов</string>
|
||||
<string name="theme_item_tab_layout_with_collapsed_collapsing_toolbar_tab_background_detail">Применяется к: фон макета вкладки (свёрнутая панель инструментов)</string>
|
||||
@ -600,14 +602,14 @@
|
||||
<string name="theme_item_crosspost_icon_tint_detail">Применяется к: значок кросспоста</string>
|
||||
<string name="theme_item_stickied_post_icon_tint">Цвет значка прикреплённого сообщения</string>
|
||||
<string name="theme_item_stickied_post_icon_tint_detail">Применяется к: значок прикреплённого сообщения</string>
|
||||
<string name="theme_item_subscribed_color">Подписаться</string>
|
||||
<string name="theme_item_subscribed_color">Подписан</string>
|
||||
<string name="theme_item_subscribed_color_detail">Применяется к: кнопка «Отписаться»</string>
|
||||
<string name="theme_item_unsubscribed_color">Отписаться</string>
|
||||
<string name="theme_item_unsubscribed_color_detail">Применяется к: кнопка «Подписаться»</string>
|
||||
<string name="theme_item_username_color">Цвет имени пользователя</string>
|
||||
<string name="theme_item_username_color_detail">Применяется к: имя пользователя</string>
|
||||
<string name="theme_item_community_color">Цвет сабреддита</string>
|
||||
<string name="theme_item_community_color_detail">Применяется к: название сабреддита</string>
|
||||
<string name="theme_item_community_color">Цвет сообщества</string>
|
||||
<string name="theme_item_community_color_detail">Применяется к: название сообщества</string>
|
||||
<string name="theme_item_author_flair_text_color">Цвет автора флейра</string>
|
||||
<string name="theme_item_author_flair_text_color_detail">Применяется к: автор флейра в комментариях</string>
|
||||
<string name="theme_item_submitter_color">Отправитель</string>
|
||||
@ -691,8 +693,8 @@
|
||||
<string name="delete_all_themes_success">Все темы успешно удалены</string>
|
||||
<string name="delete_all_front_page_scrolled_positions_success">Все позиции прокрутки главной страницы в базе данных успешно удалены</string>
|
||||
<string name="reset_all_settings_success">Все настройки успешно сброшены</string>
|
||||
<string name="username_preview">u/Hostilenemy</string>
|
||||
<string name="community_preview">r/Infinity_For_Reddit</string>
|
||||
<string name="username_preview">\@bazsalanszky@lemmy.toldi.eu</string>
|
||||
<string name="community_preview">!infinityforlemmy@lemdro.id</string>
|
||||
<string name="primary_text_preview">Основной текст</string>
|
||||
<string name="secondary_text_preview">Дополнительный текст</string>
|
||||
<string name="post_title_preview">Это пост</string>
|
||||
@ -703,21 +705,21 @@
|
||||
<string name="author_flair_preview">Флейр автора</string>
|
||||
<string name="comment_content_preview">Я подарил своей девушке карточку «Поправляйся скорее».
|
||||
\nОна не больна или что-то вроде того, но определённо может поправиться.</string>
|
||||
<string name="edit_multi_reddit">Изменить мультиреддит</string>
|
||||
<string name="delete_multi_reddit">Удалить мультиреддит</string>
|
||||
<string name="n_awards">%1$d наград</string>
|
||||
<string name="edit_multi_reddit">Изменить мультисообщество</string>
|
||||
<string name="delete_multi_reddit">Удалить мультисообщество</string>
|
||||
<string name="n_awards">%1$,d наград</string>
|
||||
<string name="one_award">1 награда</string>
|
||||
<string name="report">Пожаловаться</string>
|
||||
<string name="reporting">Жалоба отправляется</string>
|
||||
<string name="report_successful">Жалоба отправлена</string>
|
||||
<string name="report_failed">Ошибка отправления жалобы</string>
|
||||
<string name="report_failed">Не удалось отправить жалобу</string>
|
||||
<string name="report_reason_not_selected">Вы не выбрали причину</string>
|
||||
<string name="report_reason_general_spam">Спам</string>
|
||||
<string name="report_reason_general_copyright_issue">Содержит нарушение авторских прав</string>
|
||||
<string name="report_reason_general_child_pornography">Содержит детскую порнографию</string>
|
||||
<string name="report_reason_general_abusive_content">Содержит оскорбительный контент</string>
|
||||
<string name="subscribed_feed">Главная</string>
|
||||
<string name="local">Популярное</string>
|
||||
<string name="subscribed_feed">Подписки</string>
|
||||
<string name="local">Локальное</string>
|
||||
<string name="notifications">Уведомления</string>
|
||||
<string name="messages">Сообщения</string>
|
||||
<string name="message">Сообщение</string>
|
||||
@ -744,8 +746,7 @@
|
||||
<string name="default_font_font_preview">По умолчанию</string>
|
||||
<string name="load_video_in_redgifs">Попробуйте загрузить видео на Redgifs</string>
|
||||
<string name="top_score">%1$s пойнтов</string>
|
||||
<string name="login_activity_2fa_prompt">Если у вас включена двухфакторная аутентификация, введите пароль, как показано ниже: <password>:<2FA code>.
|
||||
\nПример: yourpass:123456</string>
|
||||
<string name="login_activity_2fa_prompt">Если у вас включена двухфакторная аутентификация, введите 2FA токен в поле. Иначе оставьте его пустым</string>
|
||||
<string name="submit_crosspost_activity_label">Кросспост</string>
|
||||
<string name="give_award_activity_label">Наградить</string>
|
||||
<string name="action_crosspost">Кросспост</string>
|
||||
@ -758,19 +759,19 @@
|
||||
<string name="settings_number_of_columns_in_post_feed_landscape_title">Альбом</string>
|
||||
<string name="settings_nsfw_and_spoiler_title">NSFW и спойлеры</string>
|
||||
<string name="settings_delete_all_legacy_settings_title">Удалить все устаревшие настройки</string>
|
||||
<string name="restart_app_see_changes">Перезапустите приложение, чтобы увидеть изменения.</string>
|
||||
<string name="restart_app_see_changes">Перезапустите приложение, чтобы увидеть изменения</string>
|
||||
<string name="settings_tab_count">Количество вкладок</string>
|
||||
<string name="settings_show_tab_names">Показать заголовок вкладок</string>
|
||||
<string name="settings_more_tabs_summary">Больше вкладок</string>
|
||||
<string name="settings_more_tabs_info_summary">Включение следующих параметров вызовет непредвиденное поведение:
|
||||
\nВкладки могут потерять все содержимое после переключения на другие. Это то же, что и обновление страницы.</string>
|
||||
<string name="settings_more_tabs_show_favorite_subscribed_communities_title">Показать избранные сабреддиты из подписок</string>
|
||||
<string name="settings_more_tabs_show_subscribed_communities_title">Показывать сабреддиты из подписок</string>
|
||||
<string name="settings_more_tabs_show_favorite_subscribed_communities_title">Показать избранные сообщества из подписок</string>
|
||||
<string name="settings_more_tabs_show_subscribed_communities_title">Показывать сообщества из подписок</string>
|
||||
<string name="settings_download_location_title">Папка для загрузок</string>
|
||||
<string name="settings_image_download_location_title">Папка для изображений</string>
|
||||
<string name="settings_gif_download_location_title">Папка для GIF</string>
|
||||
<string name="settings_video_download_location_title">Папка для видео</string>
|
||||
<string name="settings_separate_folder_for_each_community">Отдельная папка для каждого сабреддита</string>
|
||||
<string name="settings_separate_folder_for_each_community">Отдельная папка для каждого сообщества</string>
|
||||
<string name="settings_swipe_action_title">Жест</string>
|
||||
<string name="settings_disable_swiping_between_tabs_title">Отключить перелистывание вкладок</string>
|
||||
<string name="settings_enable_swipe_action_title">Включить жест</string>
|
||||
@ -789,10 +790,7 @@
|
||||
<string name="settings_bottom_app_bar_option_4">Действие 4</string>
|
||||
<string name="settings_bottom_app_bar_fab">Плавающая кнопка действий</string>
|
||||
<string name="settings_data_saving_mode">Режим экономии трафика</string>
|
||||
<string name="settings_data_saving_mode_info_summary">В режиме экономии трафика:
|
||||
\nПросмотр изображений – уменьшенное разрешение.
|
||||
\nВидео Reddit – уменьшенное разрешение.
|
||||
\nАвтовоспроизведение видео отключено.</string>
|
||||
<string name="settings_data_saving_mode_info_summary">В режиме экономии трафика: Предпросмотр изображений – уменьшенное разрешение. Видео Lemmy – уменьшенное разрешение. Автовоспроизведение видео отключено.</string>
|
||||
<string name="settings_translation_title">Перевод</string>
|
||||
<string name="settings_translation_summary">Переводите это приложение на POEditor. Благодарю всех за ваш вклад.</string>
|
||||
<string name="settings_credits_national_flags">Национальные флаги</string>
|
||||
@ -824,30 +822,30 @@
|
||||
<string name="give_award_success">Награда выдана</string>
|
||||
<string name="give_award_failed">Ошибка</string>
|
||||
<string name="warning">Предупреждение</string>
|
||||
<string name="this_is_a_nsfw_community">Это NSFW-сабреддит</string>
|
||||
<string name="this_user_has_nsfw_content">У пользователь есть NSFW-контент</string>
|
||||
<string name="this_is_a_nsfw_community">Это NSFW-сообщество.</string>
|
||||
<string name="this_user_has_nsfw_content">У пользователя есть NSFW-контент</string>
|
||||
<string name="dismiss">Отклонить</string>
|
||||
<string name="leave">Покинуть</string>
|
||||
<string name="go_to_community">Перейти к сабреддиту</string>
|
||||
<string name="go_to_community">Перейти к сообществу</string>
|
||||
<string name="go_to_user">Перейти к пользователю</string>
|
||||
<string name="go_to_thing_hint">Имя</string>
|
||||
<string name="random">Случайно</string>
|
||||
<string name="random_community">Случайный сабреддит</string>
|
||||
<string name="random_nsfw_community">Случайный NSFW-сабреддит</string>
|
||||
<string name="random_community">Случайное сообщество</string>
|
||||
<string name="random_nsfw_community">Случайное NSFW-сообщество</string>
|
||||
<string name="random_post">Случайный пост</string>
|
||||
<string name="random_nsfw_post">Случайный NSFW-пост</string>
|
||||
<string name="fetch_random_thing_failed">Попробуйте позже</string>
|
||||
<string name="downloading">Скачивание</string>
|
||||
<string name="community_filter_popular_and_all_activity_label">r/all и r/popular</string>
|
||||
<string name="settings_miscellaneous_title">Прочее</string>
|
||||
<string name="settings_respect_community_recommended_comment_sort_type_title">Учитывать рекомендуемый тип сортировки сабреддита</string>
|
||||
<string name="settings_respect_community_recommended_comment_sort_type_title">Учитывать рекомендуемый тип сортировки сообщества</string>
|
||||
<string name="settings_respect_community_recommended_comment_sort_type_summary">Тип сортировки комментариев не будет сохранен</string>
|
||||
<string name="settings_community_filter_category">Спрятать сабреддиты</string>
|
||||
<string name="settings_community_filter_category">Спрятать сообщества</string>
|
||||
<string name="settings_community_filter_popular_and_all">В r/popular и r/all</string>
|
||||
<string name="settings_credits_ufo_capturing_animation_title">Анимация захвата НЛО</string>
|
||||
<string name="select_video_quality">Выбрать качество видео</string>
|
||||
<string name="settings_swipe_action_haptic_feedback_title">Тактильная отдача</string>
|
||||
<string name="settings_hide_community_description_title">Скрыть описание сабреддитов</string>
|
||||
<string name="settings_hide_community_description_title">Скрыть описание сообществ</string>
|
||||
<string name="settings_disable_image_preview_title">Отключить предпросмотр изображения в режиме экономии трафика</string>
|
||||
<string name="settings_swipe_action_swipe_left_title">Жест влево</string>
|
||||
<string name="settings_swipe_action_swipe_right_title">Жест вправо</string>
|
||||
@ -861,11 +859,11 @@
|
||||
<string name="filtered_posts_activity_subtitle">Фильтрованные посты</string>
|
||||
<string name="post_filter_preference_activity_label">Фильтр постов</string>
|
||||
<string name="search_users_result_activity_label">Пользователи</string>
|
||||
<string name="multireddit_selection_activity_label">Выберите мультиреддит</string>
|
||||
<string name="multireddit_selection_activity_label">Выберите мультисообщество</string>
|
||||
<string name="action_save_to_database">Сохранить в базе данных</string>
|
||||
<string name="action_read_all_messages">Прочитать все сообщения</string>
|
||||
<string name="action_add_to_multireddit">Добавить в мультиреддит</string>
|
||||
<string name="search_only_communities_hint">Искать сабреддиты</string>
|
||||
<string name="action_add_to_multireddit">Добавить в мультисообщество</string>
|
||||
<string name="search_only_communities_hint">Искать сообщества</string>
|
||||
<string name="search_only_users_hint">Искать пользователя</string>
|
||||
<string name="post_type_gif">GIF</string>
|
||||
<string name="post_type_gallery">Галерея</string>
|
||||
@ -875,15 +873,15 @@
|
||||
<string name="settings_post_filter_title">Фильтр постов</string>
|
||||
<string name="settings_only_disable_preview_in_video_and_gif_posts_title">Отключить предпросмотр только в постах с видео и GIF</string>
|
||||
<string name="settings_enable_search_history_title">Включить историю поиска</string>
|
||||
<string name="settings_post_history_title">История поста</string>
|
||||
<string name="settings_post_history_title">История постов</string>
|
||||
<string name="settings_mark_posts_as_read_title">Отметить посты как прочтённые</string>
|
||||
<string name="settings_mark_posts_as_read_after_voting_title">Отмечать посты прочтёнными после голосования</string>
|
||||
<string name="settings_mark_posts_as_read_on_scroll_title">Отмечать посты прочтёнными при прокрутке</string>
|
||||
<string name="settings_hide_read_posts_automatically_title">Автоматически скрывать прочтённые посты</string>
|
||||
<string name="settings_sort_type_title">Тип сортировки</string>
|
||||
<string name="settings_save_sort_type_title">Сохранить тип сортировки</string>
|
||||
<string name="settings_community_default_sort_type_title">Тип сортировки в сабреддите</string>
|
||||
<string name="settings_community_default_sort_time_title">Время сортировки в сабреддите</string>
|
||||
<string name="settings_community_default_sort_type_title">Тип сортировки в сообществе</string>
|
||||
<string name="settings_community_default_sort_time_title">Время сортировки в сообществе</string>
|
||||
<string name="settings_user_default_sort_type_title">Тип сортировки пользователя</string>
|
||||
<string name="settings_user_default_sort_time_title">Время сортировки пользователя</string>
|
||||
<string name="open_link">Открыть ссылку</string>
|
||||
@ -901,7 +899,7 @@
|
||||
<string name="only_spoiler">Только спойлер</string>
|
||||
<string name="title_excludes_strings_hint">Заголовок: исключая ключевые слова (key1,key2)</string>
|
||||
<string name="title_excludes_regex_hint">Заголовок: исключая регулярное выражение</string>
|
||||
<string name="exclude_communities_hint">Исключить сабреддиты (например: funny,AskReddit)</string>
|
||||
<string name="exclude_communities_hint">Исключить сообщества (например: memes,AskLemmy)</string>
|
||||
<string name="exclude_users_hint">Исключить пользователей (например: Hostilenemy,random)</string>
|
||||
<string name="exclude_flairs_hint">Исключить флейры (например: flair1,flair2)</string>
|
||||
<string name="contain_flairs_hint">Содержит флейры (например: flair1,flair2)</string>
|
||||
@ -914,29 +912,29 @@
|
||||
<string name="post_filter_name_hint">Название фильтра постов</string>
|
||||
<string name="post_filter_requires_a_name">Как называется этот фильтр постов\?</string>
|
||||
<string name="duplicate_post_filter_dialog_title">«%1$s» уже существует</string>
|
||||
<string name="duplicate_post_filter_dialog_message">Переопределить это\?</string>
|
||||
<string name="duplicate_post_filter_dialog_message">Перезаписать его\?</string>
|
||||
<string name="apply_post_filter_to">Применить к</string>
|
||||
<string name="post_filter_usage_home">Домашняя</string>
|
||||
<string name="post_filter_usage_community">Сабреддит: %1$s</string>
|
||||
<string name="post_filter_usage_community_all">Сабреддит</string>
|
||||
<string name="post_filter_usage_community">Сообщество: %1$s</string>
|
||||
<string name="post_filter_usage_community_all">Сообщество</string>
|
||||
<string name="post_filter_usage_user">Пользователь: %1$s</string>
|
||||
<string name="post_filter_usage_user_all">Пользователь</string>
|
||||
<string name="post_filter_usage_multireddit">Мультиреддит: %1$s</string>
|
||||
<string name="post_filter_usage_multireddit_all">Мультиреддит</string>
|
||||
<string name="post_filter_usage_multireddit">Мультисообщество: %1$s</string>
|
||||
<string name="post_filter_usage_multireddit_all">Мультисообщество</string>
|
||||
<string name="post_filter_usage_search">Поиск</string>
|
||||
<string name="community">Сабреддит</string>
|
||||
<string name="community">Сообщество</string>
|
||||
<string name="user">Пользователь</string>
|
||||
<string name="edit_post_filter_name_of_usage_info">Оставьте пустым, чтобы применить этот фильтр постов ко всем сабреддитам / пользователям / мультиреддитам</string>
|
||||
<string name="read_all_messages_time_limit">Вы делаете это слишком часто. Попробуйте позже. Это ограничение скорости Reddit API.</string>
|
||||
<string name="read_all_messages_success">Все сообщения успешно прочтены</string>
|
||||
<string name="read_all_messages_failed">Невозможно прочитать все сообщения</string>
|
||||
<string name="add_community_or_user_to_multireddit_success">%1$s добавлен в мультиреддит %2$s</string>
|
||||
<string name="add_community_or_user_to_multireddit_failed">Невозможно добавить %1$s в мультиреддит %2$s</string>
|
||||
<string name="add_community_or_user_to_multireddit_success">%1$s добавлен в мультисообщество %2$s</string>
|
||||
<string name="add_community_or_user_to_multireddit_failed">Невозможно добавить %1$s в мультисообщество %2$s</string>
|
||||
<string name="choose_a_user">Выберите пользователя</string>
|
||||
<string name="settings_click_to_show_media_in_gallery_layout">Открывать мультимедиа нажатием в режиме галереи</string>
|
||||
<string name="settings_hide_post_type">Скрыть тип поста</string>
|
||||
<string name="settings_hide_the_number_of_awards">Скрыть количество наград</string>
|
||||
<string name="settings_hide_community_and_user_prefix">Скрыть префикс сабреддита и пользователя</string>
|
||||
<string name="settings_hide_community_and_user_prefix">Скрыть префикс сообщества и пользователя</string>
|
||||
<string name="settings_hide_the_number_of_votes">Скрыть количество голосов</string>
|
||||
<string name="settings_hide_the_number_of_comments">Скрыть количество комментариев</string>
|
||||
<string name="post_layout_gallery">Галерея</string>
|
||||
@ -947,7 +945,7 @@
|
||||
<string name="action_share_link">Поделиться ссылкой</string>
|
||||
<string name="action_copy_link">Скопировать ссылку</string>
|
||||
<string name="action_add_to_post_filter">Добавить пост в фильтр</string>
|
||||
<string name="settings_do_not_blur_nsfw_in_nsfw_communities_title">NSFW-посты в NSFW-сабреддитах без размытия</string>
|
||||
<string name="settings_do_not_blur_nsfw_in_nsfw_communities_title">NSFW посты в NSFW сообществах без размытия</string>
|
||||
<string name="settings_show_avatar_on_the_right">Показывать аватар справа</string>
|
||||
<string name="settings_backup_settings_title">Резервное копирование настроек</string>
|
||||
<string name="settings_restore_settings_title">Восстановить настройки</string>
|
||||
@ -957,22 +955,22 @@
|
||||
<string name="settings_collapse_account_section_title">Свернуть раздел аккаунта</string>
|
||||
<string name="settings_collapse_post_section_title">Свернуть раздел поста</string>
|
||||
<string name="settings_collapse_preferences_section_title">Свернуть раздел настроек</string>
|
||||
<string name="settings_collapse_favorite_communities_section_title">Свернуть раздел избранных сабреддитов</string>
|
||||
<string name="settings_collapse_subscribed_communities_section_title">Свернуть раздел сабреддитов в подписках</string>
|
||||
<string name="settings_hide_favorite_communities_sections_title">Скрыть раздел избранных сабреддитов</string>
|
||||
<string name="settings_hide_subscribed_communities_sections_title">Скрыть раздел сабреддитов с подпиской</string>
|
||||
<string name="settings_collapse_favorite_communities_section_title">Свернуть раздел избранных сообществ</string>
|
||||
<string name="settings_collapse_subscribed_communities_section_title">Свернуть раздел сообществ в подписках</string>
|
||||
<string name="settings_hide_favorite_communities_sections_title">Скрыть раздел избранных сообществ</string>
|
||||
<string name="settings_hide_subscribed_communities_sections_title">Скрыть раздел сообществ с подпиской</string>
|
||||
<string name="settings_default_search_result_tab">Вкладка результатов поиска</string>
|
||||
<string name="device_default">По умолчанию устройства</string>
|
||||
<string name="device_default">Как в системе</string>
|
||||
<string name="set_by_battery_saver">Устанавливается функцией экономии заряда батареи</string>
|
||||
<string name="theme_item_upvote_ratio_icon_tint">Цвет значка соотношения голосов</string>
|
||||
<string name="theme_item_upvote_ratio_icon_tint_detail">Применяется к: значок соотношения голосов</string>
|
||||
<string name="theme_item_current_user_color">Текущий пользователь</string>
|
||||
<string name="theme_item_current_user_color_detail">Применяется к: текущий пользователь в комментариях</string>
|
||||
<string name="exclude_domains_hint">Исключить домены</string>
|
||||
<string name="anonymous_front_page_no_subscriptions">Начните с присоединения к сабреддиту!</string>
|
||||
<string name="anonymous_front_page_no_subscriptions">Начните с присоединения к сообществу!</string>
|
||||
<string name="backup_settings_success">Настройки успешно экспортированы в выбранную папку. Пароль созданного zip-архива – 123321. Пожалуйста, не изменяйте zip-файл.</string>
|
||||
<string name="create_zip_in_destination_directory_failed">Невозможно создать zip-архив с резервной копией настроек в выбранной папке.</string>
|
||||
<string name="backup_some_settings_failed">Невозможно создать резервную копию некоторых настроек, но другие были успешно экспортированы в выбранную папку.</string>
|
||||
<string name="create_zip_in_destination_directory_failed">Невозможно создать zip-архив с резервной копией в выбранной папке</string>
|
||||
<string name="backup_some_settings_failed">Невозможно создать резервную копию некоторых настроек, но другие были успешно экспортированы в выбранную папку</string>
|
||||
<string name="restore_settings_success">Настройки успешно восстановлены. Перезапустите приложение, чтобы увидеть изменения.</string>
|
||||
<string name="restore_settings_partially_failed">Некоторые настройки не могут быть восстановлены. Перезапустите приложение, чтобы увидеть изменения.</string>
|
||||
<string name="restore_settings_failed_file_corrupted">Невозможно восстановить настройки. Возможно, файл повреждён.</string>
|
||||
@ -995,7 +993,7 @@
|
||||
<string name="upvote">Голос+</string>
|
||||
<string name="downvote">Голос-</string>
|
||||
<string name="select">Выбрать</string>
|
||||
<string name="exclude_community">Исключить этот сабреддит</string>
|
||||
<string name="exclude_community">Исключить это сообщество</string>
|
||||
<string name="exclude_user">Исключить этого пользователя</string>
|
||||
<string name="exclude_flair">Исключить этот флейр</string>
|
||||
<string name="contain_flair">Содержит флейр</string>
|
||||
@ -1004,10 +1002,10 @@
|
||||
<string name="suggest_title">Предложить название</string>
|
||||
<string name="suggest_title_failed">Невозможно предложить название</string>
|
||||
<string name="action_delete_logs">Удалить журнал</string>
|
||||
<string name="inbox_with_count">Входящие (%1$d)</string>
|
||||
<string name="inbox_with_count">Входящие (%1$,d)</string>
|
||||
<string name="comment_continue_thread">Продолжить обсуждение</string>
|
||||
<!-- Fuzzy -->
|
||||
<string name="settings_swipe_vertically_to_go_back_from_media_title">Вертикальный жест для закрытия медиафайла</string>
|
||||
<string name="settings_swipe_vertically_to_go_back_from_media_title">Смахивать вертикально для закрытия изображения или GIF</string>
|
||||
<string name="settings_hide_post_flair">Скрыть флейр поста</string>
|
||||
<string name="settings_crash_reports_title">Отчёты о сбоях</string>
|
||||
<string name="settings_nsfw_and_spoiler_dangerous_group_title">Опасные</string>
|
||||
@ -1015,8 +1013,8 @@
|
||||
<string name="settings_show_only_one_comment_level_indicator">Показывать только один индикатор уровня комментария</string>
|
||||
<string name="save_comment">Сохранить</string>
|
||||
<string name="unsave_comment">Удалить</string>
|
||||
<string name="copy_multi_reddit_path">Скопировать путь мультиреддита</string>
|
||||
<string name="copy_multi_reddit_path_failed">Невозможно скопировать путь мультиреддита</string>
|
||||
<string name="copy_multi_reddit_path">Скопировать путь мультисообщества</string>
|
||||
<string name="copy_multi_reddit_path_failed">Невозможно скопировать путь мультисообщества</string>
|
||||
<string name="crash_reports_deleted">Отчёты о сбоях удалены</string>
|
||||
<string name="disable_nsfw_forever_message">После включения NSFW будет навсегда отключено, независимо от того, включён параметр NSFW или нет. И эта функция необратима, единственный способ снова включить NSFW – это очистить данные приложения.
|
||||
\n
|
||||
@ -1029,7 +1027,7 @@
|
||||
<string name="receive_post_reply_notifications">Получать уведомления об ответах на пост</string>
|
||||
<string name="bottom_sheet_post_gallery">Галерея</string>
|
||||
<string name="posting_gallery">Галерея постов</string>
|
||||
<string name="label_reddit">Reddit</string>
|
||||
<string name="label_reddit">Lemmy</string>
|
||||
<string name="settings_default_link_post_layout">Вид поста со ссылками по умолчанию</string>
|
||||
<string name="settings_category_material_you_title">Material You</string>
|
||||
<string name="settings_enable_material_you_warning_summary">Убедитесь, что у вас нет тем с именами
|
||||
@ -1041,9 +1039,9 @@
|
||||
<string name="settings_enable_material_you_summary">Персонализация Infinity на основе фонового изображения рабочего экрана</string>
|
||||
<string name="settings_apply_material_you_title">Применить «Material You»</string>
|
||||
<string name="settings_apply_material_you_summary">В случае, если приложение Infinity не изменило тему</string>
|
||||
<string name="settings_more_tabs_show_favorite_multireddits_title">Показывать избранные мультиреддиты</string>
|
||||
<string name="settings_more_tabs_show_multireddits_title">Показывать мультиреддиты</string>
|
||||
<string name="settings_collapse_reddit_section_title">Свернуть раздел Reddit</string>
|
||||
<string name="settings_more_tabs_show_favorite_multireddits_title">Показывать избранные мультисообщества</string>
|
||||
<string name="settings_more_tabs_show_multireddits_title">Показывать мультисообщества</string>
|
||||
<string name="settings_collapse_reddit_section_title">Свернуть раздел Lemmy</string>
|
||||
<string name="settings_video_player_automatic_landscape_orientation">Автоматически переключаться на альбомную ориентацию в видеопроигрывателе</string>
|
||||
<string name="settings_remember_muting_option_in_post_feed">Запоминать отключение звука в ленте постов</string>
|
||||
<string name="link_post_layout_auto">Автовыбор</string>
|
||||
@ -1072,11 +1070,11 @@
|
||||
<string name="settings_secure_mode_summary">Снимки и запись экрана запрещены. Infinity не отображается в списке недавних приложений.</string>
|
||||
<string name="discard_dialog_button">Отмена</string>
|
||||
<string name="error_loading_wiki">Ошибка загрузки вики</string>
|
||||
<string name="no_wiki">У сабреддита нет вики-страницы</string>
|
||||
<string name="no_wiki">У сообщества нет вики-страницы</string>
|
||||
<string name="material_you_notification_title">Применение «Material You»</string>
|
||||
<string name="action_go_to_wiki">Перейти к Вики</string>
|
||||
<string name="action_playback_speed">Скорость воспроизведения</string>
|
||||
<string name="about">О программе</string>
|
||||
<string name="about">О приложении</string>
|
||||
<string name="settings_link_handler_title">Обработчик ссылок</string>
|
||||
<string name="settings_main_page_back_button_action">Действие кнопки возврата на главную страницу</string>
|
||||
<string name="settings_open_navigation_drawer">Открыть панель навигации</string>
|
||||
@ -1104,7 +1102,7 @@
|
||||
<string name="title_contains_strings_hint">Название: содержит ключевые слова (ключ1,ключ2)</string>
|
||||
<string name="title_contains_regex_hint">Название: содержит регулярное выражение</string>
|
||||
<string name="contain_domains_hint">Содержат домены</string>
|
||||
<string name="anonymous_multireddit_no_community">У этого мультиреддита нет сабреддита!</string>
|
||||
<string name="anonymous_multireddit_no_community">У этого мультисообщества нет сообщества!</string>
|
||||
<string name="error_fetching_v_redd_it_video_cannot_get_video_url">Ошибка извлечения видео v.redd.it: невозможно получить URL видео</string>
|
||||
<string name="contain_domain">Содержат этот домен</string>
|
||||
<string name="lock_screen_text">Эй, там!!!</string>
|
||||
@ -1141,7 +1139,7 @@
|
||||
<string name="display_name_hint">Отображается на странице вашего профиля</string>
|
||||
<string name="display_name_description">Будет видно посетителям страницы вашего профиля и не изменит имя пользователя.</string>
|
||||
<string name="about_you_text">О себе</string>
|
||||
<string name="about_you_hint">Небольшое резюме</string>
|
||||
<string name="about_you_hint">Немного о себе</string>
|
||||
<string name="message_remove_avatar_success">Аватар успешно удалён</string>
|
||||
<string name="message_remove_avatar_failed">Невозможно удалить аватар %s</string>
|
||||
<string name="message_remove_banner_success">Баннер успешно удалён</string>
|
||||
@ -1152,12 +1150,12 @@
|
||||
<string name="message_change_banner_failed">Невозможно изменить баннер %s</string>
|
||||
<string name="message_save_profile_success">Профиль успешно сохранён</string>
|
||||
<string name="message_save_profile_failed">Невозможно сохранить профиль %s</string>
|
||||
<string name="post_poll_activity_label">Пост для опроса</string>
|
||||
<string name="post_poll_activity_label">Пост с опросом</string>
|
||||
<string name="action_open_external_browser">Открыть в браузере</string>
|
||||
<string name="voting_length">Продолжительность голосования: %1$d дн.</string>
|
||||
<string name="voting_length">Продолжительность голосования: %1$d дней</string>
|
||||
<string name="two_options_required">Хороший опрос требует двух или более вариантов!</string>
|
||||
<string name="bottom_sheet_post_poll">Опрос</string>
|
||||
<string name="no_activity_found_for_external_browser">Внешнее приложение отсутствует</string>
|
||||
<string name="no_activity_found_for_external_browser">Нет приложения, способного обработать \"Открыть в внешнем приложении\"</string>
|
||||
<string name="settings_require_authentication_to_show_accounts">Для отображения аккаунтов необходима аутентификация</string>
|
||||
<string name="settings_custom_font_family_title">Пользовательское семейство шрифтов</string>
|
||||
<string name="settings_custom_title_font_family_title">Пользовательское семейство шрифтов заголовка</string>
|
||||
@ -1168,7 +1166,7 @@
|
||||
<string name="settings_show_fewer_toolbar_options_threshold_title">Показывать меньше параметров панели инструментов, начиная с</string>
|
||||
<string name="settings_show_fewer_toolbar_options_threshold_summary">Уровень %1$d</string>
|
||||
<string name="settings_show_author_avatar_title">Показывать аватар автора</string>
|
||||
<string name="settings_reddit_user_agreement_title">Пользовательское соглашение Reddit</string>
|
||||
<string name="settings_reddit_user_agreement_title">Пользовательское соглашение Lemmy</string>
|
||||
<string name="settings_always_show_child_comment_count_title">Всегда показывать количество дочерних комментариев</string>
|
||||
<string name="settings_hide_upvote_ratio_title">Скрыть соотношение голосов</string>
|
||||
<string name="settings_miscellaneous_dangerous_group_title">Опасно</string>
|
||||
@ -1196,4 +1194,58 @@
|
||||
<string name="comment_karma">Карма комментария:</string>
|
||||
<string name="awarder_karma">Карма наградителя:</string>
|
||||
<string name="awardee_karma">Карма награждённого:</string>
|
||||
<string name="extra_small">Очень маленький</string>
|
||||
<string name="invalid_link">Неправильная ссылка</string>
|
||||
<string name="history_activity_label">История</string>
|
||||
<string name="action_block_user">Заблокировать пользователя</string>
|
||||
<string name="action_more_options">Больше настроек</string>
|
||||
<string name="anonymous_homepage_not_implemented">Анонимная домашняя страница пока не реализована</string>
|
||||
<string name="history">История</string>
|
||||
<string name="invalid_response">Неправильный ответ от сервера</string>
|
||||
<string name="invalid_username_or_password">Неправильный логин или пароль</string>
|
||||
<string name="settings_backup_settings_summary">Пароль от резервной копии - \"123321\".</string>
|
||||
<string name="settings_comment_divider_type">Разделитель комментариев</string>
|
||||
<string name="block_user">Заблокировать пользователя</string>
|
||||
<string name="block_user_success">Заблокирован</string>
|
||||
<string name="block_user_failed">Не удалось заблокировать пользователя</string>
|
||||
<string name="clear_user_flair">Очистить флейр</string>
|
||||
<string name="clear_user_flair_success">Флейр пользователя очищен</string>
|
||||
<string name="edited">Отредактирован</string>
|
||||
<string name="edited_time">Отредактирован в %s</string>
|
||||
<string name="error_unsupported_audio">Медиафайл содержит аудиодорожку, но она не поддерживается на этом устройстве</string>
|
||||
<string name="storage_permission_denied">В доступе к хранилищу отказано</string>
|
||||
<string name="invalid_regex">Неверное регулярное выражение</string>
|
||||
<string name="no_more_posts">Больше постов нет</string>
|
||||
<string name="image_index_in_gallery">%1$d/%2$d</string>
|
||||
<string name="go_to_settings">Настройки</string>
|
||||
<string name="instance_url">URL сервера</string>
|
||||
<string name="user_username">Логин</string>
|
||||
<string name="user_password">Пароль</string>
|
||||
<string name="user_2fa_token">2FA токен (если есть)</string>
|
||||
<string name="user_login">Войти</string>
|
||||
<string name="sort_time_6hours">6 часов</string>
|
||||
<string name="sort_time_12hours">12 часов</string>
|
||||
<string name="sort_time_3months">3 месяца</string>
|
||||
<string name="sort_time_6months">6 месяцев</string>
|
||||
<string name="sort_time_9months">9 месяцев</string>
|
||||
<string name="anonymous_account_instance">Сервер для анонимного аккаунта</string>
|
||||
<string name="could_not_resolve_link">Не удалось подключиться к серверу :(</string>
|
||||
<string name="mark_post_as_read_failed">Не удалось пометить пост как прочитанный</string>
|
||||
<string name="upload_image">Загрузить излбражение</string>
|
||||
<string name="mentions">Упоминания</string>
|
||||
<string name="replies">Ответы</string>
|
||||
<string name="not_implemented">Функция ещё не реализована :(</string>
|
||||
<string name="username_cannot_be_empty">Поле логина не может быть пустым.</string>
|
||||
<string name="password_cannot_be_empty">Поле пароля не может быть пустым.</string>
|
||||
<string name="separate_down_and_up_votes">Разделить голоса + и -</string>
|
||||
<string name="url_cannot_be_null_or_empty">Ссылка не может быть пустой</string>
|
||||
<string name="action_create_github_issue">Создать задачу на Codeberg</string>
|
||||
<string name="block_community">Заблокировать сообщество
|
||||
\n</string>
|
||||
<string name="error_unsupported_video">Медиафайл содержит видеодорожку, но она не поддерживается на этом устройстве</string>
|
||||
<string name="load_more_posts_failed">Не удалось загрузить больше постов.
|
||||
\nНажмите для повтора.</string>
|
||||
<string name="denied_notification_permission">Разрешение на уведомления не выдано</string>
|
||||
<string name="instance_url_hint">Ссылка на выбранный вами сервер Lemmy с или без https://</string>
|
||||
<string name="instance_cannot_be_empty">Поле сервера не может быть пустым.</string>
|
||||
</resources>
|
@ -1353,4 +1353,16 @@
|
||||
<string name="username_cannot_be_empty">The username field cannot be left empty.</string>
|
||||
<string name="password_cannot_be_empty">The password field cannot be left empty.</string>
|
||||
<string name="separate_down_and_up_votes">Separate Up and Down votes</string>
|
||||
<string name="block_community_success">Community blocked!</string>
|
||||
<string name="block_community_failed">Failed to block community</string>
|
||||
<string name="unblock_community">Unblock Community</string>
|
||||
<string name="unblock_community_success">Community unblocked!</string>
|
||||
<string name="unblock_community_failed">Failed to unblock community</string>
|
||||
<string name="instance_info">Instance Info</string>
|
||||
<string name="blocked_communities">Blocked Communities</string>
|
||||
<string name="blocked_users">Blocked users</string>
|
||||
<string name="blocks">Blocks</string>
|
||||
<string name="action_unblock_user">Unblock User</string>
|
||||
<string name="unblock_user_success">Unblocked</string>
|
||||
<string name="unblock_user_failed">Failed to unblock user</string>
|
||||
</resources>
|
||||
|
Loading…
x
Reference in New Issue
Block a user