Continue adding comment filter.

This commit is contained in:
Docile-Alligator
2023-10-16 22:28:09 -04:00
parent a8d5112955
commit b2cf64db9d
40 changed files with 669 additions and 42 deletions

View File

@ -23,8 +23,7 @@
android:maxSdkVersion="28" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.POST_NOTIFICATIONS"/>
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
<application
android:name=".Infinity"
@ -36,6 +35,15 @@
android:theme="@style/AppTheme"
android:usesCleartextTraffic="true"
tools:replace="android:label">
<activity
android:name=".activities.CommentFilterUsageListingActivity"
android:exported="false" />
<activity
android:name=".activities.CustomizeCommentFilterActivity"
android:exported="false" />
<activity
android:name=".activities.CommentFilterPreferenceActivity"
android:exported="false" />
<activity
android:name=".activities.HistoryActivity"
android:exported="false"

View File

@ -9,6 +9,7 @@ import dagger.Component;
import ml.docilealligator.infinityforreddit.activities.AccountPostsActivity;
import ml.docilealligator.infinityforreddit.activities.AccountSavedThingActivity;
import ml.docilealligator.infinityforreddit.activities.CommentActivity;
import ml.docilealligator.infinityforreddit.activities.CommentFilterPreferenceActivity;
import ml.docilealligator.infinityforreddit.activities.CreateMultiRedditActivity;
import ml.docilealligator.infinityforreddit.activities.CustomThemeListingActivity;
import ml.docilealligator.infinityforreddit.activities.CustomThemePreviewActivity;
@ -307,6 +308,8 @@ public interface AppComponent {
void inject(MorePostsInfoFragment morePostsInfoFragment);
void inject(CommentFilterPreferenceActivity commentFilterPreferenceActivity);
@Component.Factory
interface Factory {
AppComponent create(@BindsInstance Application application);

View File

@ -14,7 +14,9 @@ import androidx.sqlite.db.SupportSQLiteDatabase;
import ml.docilealligator.infinityforreddit.account.Account;
import ml.docilealligator.infinityforreddit.account.AccountDao;
import ml.docilealligator.infinityforreddit.commentfilter.CommentFilter;
import ml.docilealligator.infinityforreddit.commentfilter.CommentFilterDao;
import ml.docilealligator.infinityforreddit.commentfilter.CommentFilterUsage;
import ml.docilealligator.infinityforreddit.commentfilter.CommentFilterUsageDao;
import ml.docilealligator.infinityforreddit.customtheme.CustomTheme;
import ml.docilealligator.infinityforreddit.customtheme.CustomThemeDao;
import ml.docilealligator.infinityforreddit.multireddit.AnonymousMultiredditSubreddit;
@ -80,6 +82,10 @@ public abstract class RedditDataRoomDatabase extends RoomDatabase {
public abstract AnonymousMultiredditSubredditDao anonymousMultiredditSubredditDao();
public abstract CommentFilterDao commentFilterDao();
public abstract CommentFilterUsageDao commentFilterUsageDao();
private static final Migration MIGRATION_1_2 = new Migration(1, 2) {
@Override
public void migrate(SupportSQLiteDatabase database) {

View File

@ -0,0 +1,125 @@
package ml.docilealligator.infinityforreddit.activities;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.MenuItem;
import androidx.annotation.NonNull;
import androidx.lifecycle.ViewModelProvider;
import java.util.concurrent.Executor;
import javax.inject.Inject;
import javax.inject.Named;
import butterknife.ButterKnife;
import ml.docilealligator.infinityforreddit.Infinity;
import ml.docilealligator.infinityforreddit.RedditDataRoomDatabase;
import ml.docilealligator.infinityforreddit.adapters.CommentFilterWithUsageRecyclerViewAdapter;
import ml.docilealligator.infinityforreddit.bottomsheetfragments.CommentFilterOptionsBottomSheetFragment;
import ml.docilealligator.infinityforreddit.commentfilter.CommentFilter;
import ml.docilealligator.infinityforreddit.commentfilter.CommentFilterWithUsageViewModel;
import ml.docilealligator.infinityforreddit.commentfilter.DeleteCommentFilter;
import ml.docilealligator.infinityforreddit.customtheme.CustomThemeWrapper;
import ml.docilealligator.infinityforreddit.databinding.ActivityCommentFilterPreferenceBinding;
public class CommentFilterPreferenceActivity extends BaseActivity {
private ActivityCommentFilterPreferenceBinding binding;
@Inject
@Named("default")
SharedPreferences sharedPreferences;
@Inject
RedditDataRoomDatabase redditDataRoomDatabase;
@Inject
CustomThemeWrapper customThemeWrapper;
@Inject
Executor executor;
public CommentFilterWithUsageViewModel commentFilterWithUsageViewModel;
private CommentFilterWithUsageRecyclerViewAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
((Infinity) getApplication()).getAppComponent().inject(this);
setImmersiveModeNotApplicable();
super.onCreate(savedInstanceState);
binding = ActivityCommentFilterPreferenceBinding.inflate(getLayoutInflater());
setContentView(binding.getRoot());
ButterKnife.bind(this);
applyCustomTheme();
setSupportActionBar(binding.toolbarCommentFilterPreferenceActivity);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
binding.fabCommentFilterPreferenceActivity.setOnClickListener(view -> {
Intent intent = new Intent(this, CustomizeCommentFilterActivity.class);
intent.putExtra(CustomizeCommentFilterActivity.EXTRA_FROM_SETTINGS, true);
startActivity(intent);
});
adapter = new CommentFilterWithUsageRecyclerViewAdapter(this, commentFilter -> {
CommentFilterOptionsBottomSheetFragment commentFilterOptionsBottomSheetFragment = new CommentFilterOptionsBottomSheetFragment();
Bundle bundle = new Bundle();
bundle.putParcelable(CommentFilterOptionsBottomSheetFragment.EXTRA_POST_FILTER, commentFilter);
commentFilterOptionsBottomSheetFragment.setArguments(bundle);
commentFilterOptionsBottomSheetFragment.show(getSupportFragmentManager(), commentFilterOptionsBottomSheetFragment.getTag());
});
binding.recyclerViewCommentFilterPreferenceActivity.setAdapter(adapter);
commentFilterWithUsageViewModel = new ViewModelProvider(this,
new CommentFilterWithUsageViewModel.Factory(redditDataRoomDatabase)).get(CommentFilterWithUsageViewModel.class);
commentFilterWithUsageViewModel.getCommentFilterWithUsageListLiveData().observe(this, commentFilterWithUsages -> adapter.setCommentFilterWithUsageList(commentFilterWithUsages));
}
public void editCommentFilter(CommentFilter commentFilter) {
Intent intent = new Intent(this, CustomizeCommentFilterActivity.class);
intent.putExtra(CustomizeCommentFilterActivity.EXTRA_POST_FILTER, commentFilter);
intent.putExtra(CustomizeCommentFilterActivity.EXTRA_FROM_SETTINGS, true);
startActivity(intent);
}
public void applyCommentFilterTo(CommentFilter commentFilter) {
Intent intent = new Intent(this, CommentFilterUsageListingActivity.class);
intent.putExtra(CommentFilterUsageListingActivity.EXTRA_POST_FILTER, commentFilter);
startActivity(intent);
}
public void deleteCommentFilter(CommentFilter commentFilter) {
DeleteCommentFilter.deleteCommentFilter(redditDataRoomDatabase, executor, commentFilter);
}
@Override
protected SharedPreferences getDefaultSharedPreferences() {
return sharedPreferences;
}
@Override
protected CustomThemeWrapper getCustomThemeWrapper() {
return customThemeWrapper;
}
@Override
protected void applyCustomTheme() {
applyAppBarLayoutAndCollapsingToolbarLayoutAndToolbarTheme(binding.appbarLayoutCommentFilterPreferenceActivity, binding.collapsingToolbarLayoutCommentFilterPreferenceActivity, binding.toolbarCommentFilterPreferenceActivity);
applyFABTheme(binding.fabCommentFilterPreferenceActivity);
binding.getRoot().setBackgroundColor(customThemeWrapper.getBackgroundColor());
}
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
if (item.getItemId() == android.R.id.home) {
finish();
return true;
}
return false;
}
}

View File

@ -0,0 +1,18 @@
package ml.docilealligator.infinityforreddit.activities;
import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;
import ml.docilealligator.infinityforreddit.R;
public class CommentFilterUsageListingActivity extends AppCompatActivity {
public static final String EXTRA_POST_FILTER = "EPF";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_comment_filter_usage_listing);
}
}

View File

@ -0,0 +1,19 @@
package ml.docilealligator.infinityforreddit.activities;
import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;
import ml.docilealligator.infinityforreddit.R;
public class CustomizeCommentFilterActivity extends AppCompatActivity {
public static final String EXTRA_POST_FILTER = "EPF";
public static final String EXTRA_FROM_SETTINGS = "EFS";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_customize_comment_filter);
}
}

View File

@ -0,0 +1,79 @@
package ml.docilealligator.infinityforreddit.adapters;
import android.view.LayoutInflater;
import android.view.ViewGroup;
import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import java.util.List;
import ml.docilealligator.infinityforreddit.R;
import ml.docilealligator.infinityforreddit.activities.BaseActivity;
import ml.docilealligator.infinityforreddit.commentfilter.CommentFilterUsage;
import ml.docilealligator.infinityforreddit.databinding.ItemCommentFilterUsageEmbeddedBinding;
public class CommentFilterUsageEmbeddedRecyclerViewAdapter extends RecyclerView.Adapter<CommentFilterUsageEmbeddedRecyclerViewAdapter.EntryViewHolder> {
private BaseActivity baseActivity;
private List<CommentFilterUsage> commentFilterUsageList;
public CommentFilterUsageEmbeddedRecyclerViewAdapter(BaseActivity baseActivity) {
this.baseActivity = baseActivity;
}
@NonNull
@Override
public EntryViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
return new EntryViewHolder(ItemCommentFilterUsageEmbeddedBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false));
}
@Override
public void onBindViewHolder(@NonNull EntryViewHolder holder, int position) {
if (commentFilterUsageList == null || commentFilterUsageList.isEmpty()) {
holder.textView.setText(R.string.click_to_apply_post_filter);
} else if (holder.getBindingAdapterPosition() > 4) {
holder.textView.setText(baseActivity.getString(R.string.post_filter_usage_embedded_more_count, commentFilterUsageList.size() - 5));
} else {
CommentFilterUsage commentFilterUsage = commentFilterUsageList.get(holder.getBindingAdapterPosition());
switch (commentFilterUsage.usage) {
case CommentFilterUsage.SUBREDDIT_TYPE:
holder.textView.setText("r/" + commentFilterUsage.nameOfUsage);
break;
case CommentFilterUsage.USER_TYPE:
holder.textView.setText("u/" + commentFilterUsage.nameOfUsage);
break;
}
}
}
@Override
public int getItemCount() {
return commentFilterUsageList == null || commentFilterUsageList.isEmpty() ? 1 : (commentFilterUsageList.size() > 5 ? 6 : commentFilterUsageList.size());
}
public void setCommentFilterUsageList(List<CommentFilterUsage> commentFilterUsageList) {
this.commentFilterUsageList = commentFilterUsageList;
notifyDataSetChanged();
}
class EntryViewHolder extends RecyclerView.ViewHolder {
TextView textView;
public EntryViewHolder(@NonNull ItemCommentFilterUsageEmbeddedBinding binding) {
super(binding.getRoot());
textView = binding.getRoot();
textView.setTextColor(baseActivity.customThemeWrapper.getSecondaryTextColor());
if (baseActivity.typeface != null) {
textView.setTypeface(baseActivity.typeface);
}
textView.setOnClickListener(view -> {
Toast.makeText(baseActivity, textView.getText(), Toast.LENGTH_SHORT).show();
});
}
}
}

View File

@ -0,0 +1,80 @@
package ml.docilealligator.infinityforreddit.adapters;
import android.view.LayoutInflater;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import java.util.List;
import ml.docilealligator.infinityforreddit.activities.BaseActivity;
import ml.docilealligator.infinityforreddit.commentfilter.CommentFilter;
import ml.docilealligator.infinityforreddit.commentfilter.CommentFilterWithUsage;
import ml.docilealligator.infinityforreddit.customviews.LinearLayoutManagerBugFixed;
import ml.docilealligator.infinityforreddit.databinding.ItemCommentFilterWithUsageBinding;
public class CommentFilterWithUsageRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private BaseActivity activity;
private final OnItemClickListener onItemClickListener;
private List<CommentFilterWithUsage> commentFilterWithUsageList;
private RecyclerView.RecycledViewPool recycledViewPool;
public interface OnItemClickListener {
void onItemClick(CommentFilter commentFilter);
}
public CommentFilterWithUsageRecyclerViewAdapter(BaseActivity activity, OnItemClickListener onItemClickListener) {
this.activity = activity;
this.recycledViewPool = new RecyclerView.RecycledViewPool();
this.onItemClickListener = onItemClickListener;
}
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
return new CommentFilterViewHolder(ItemCommentFilterWithUsageBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false));
}
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
if (holder instanceof CommentFilterViewHolder) {
((CommentFilterViewHolder) holder).binding.commentFilterNameTextViewItemCommentFilter.setText(commentFilterWithUsageList.get(position - 1).commentFilter.name);
((CommentFilterViewHolder) holder).adapter.setCommentFilterUsageList(commentFilterWithUsageList.get(position - 1).commentFilterUsageList);
}
}
@Override
public int getItemCount() {
return commentFilterWithUsageList == null ? 1 : 1 + commentFilterWithUsageList.size();
}
public void setCommentFilterWithUsageList(List<CommentFilterWithUsage> commentFilterWithUsageList) {
this.commentFilterWithUsageList = commentFilterWithUsageList;
notifyDataSetChanged();
}
private class CommentFilterViewHolder extends RecyclerView.ViewHolder {
ItemCommentFilterWithUsageBinding binding;
CommentFilterUsageEmbeddedRecyclerViewAdapter adapter;
public CommentFilterViewHolder(@NonNull ItemCommentFilterWithUsageBinding binding) {
super(binding.getRoot());
this.binding = binding;
binding.commentFilterNameTextViewItemCommentFilter.setTextColor(activity.customThemeWrapper.getPrimaryTextColor());
if (activity.typeface != null) {
binding.commentFilterNameTextViewItemCommentFilter.setTypeface(activity.typeface);
}
binding.getRoot().setOnClickListener(view -> {
onItemClickListener.onItemClick(commentFilterWithUsageList.get(getBindingAdapterPosition() - 1).commentFilter);
});
binding.commentFilterUsageRecyclerViewItemCommentFilter.setRecycledViewPool(recycledViewPool);
binding.commentFilterUsageRecyclerViewItemCommentFilter.setLayoutManager(new LinearLayoutManagerBugFixed(activity));
adapter = new CommentFilterUsageEmbeddedRecyclerViewAdapter(activity);
binding.commentFilterUsageRecyclerViewItemCommentFilter.setAdapter(adapter);
}
}
}

View File

@ -0,0 +1,63 @@
package ml.docilealligator.infinityforreddit.bottomsheetfragments;
import android.content.Context;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
import ml.docilealligator.infinityforreddit.R;
import ml.docilealligator.infinityforreddit.activities.CommentFilterPreferenceActivity;
import ml.docilealligator.infinityforreddit.commentfilter.CommentFilter;
import ml.docilealligator.infinityforreddit.customviews.LandscapeExpandedRoundedBottomSheetDialogFragment;
import ml.docilealligator.infinityforreddit.databinding.FragmentCommentFilterOptionsBottomSheetBinding;
import ml.docilealligator.infinityforreddit.utils.Utils;
public class CommentFilterOptionsBottomSheetFragment extends LandscapeExpandedRoundedBottomSheetDialogFragment {
public static final String EXTRA_POST_FILTER = "EPF";
private CommentFilterPreferenceActivity activity;
public CommentFilterOptionsBottomSheetFragment() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
FragmentCommentFilterOptionsBottomSheetBinding binding = FragmentCommentFilterOptionsBottomSheetBinding.inflate(inflater, container, false);
CommentFilter commentFilter = getArguments().getParcelable(EXTRA_POST_FILTER);
binding.editTextViewCommentFilterOptionsBottomSheetFragment.setOnClickListener(view -> {
activity.editCommentFilter(commentFilter);
dismiss();
});
binding.applyToTextViewCommentFilterOptionsBottomSheetFragment.setOnClickListener(view -> {
activity.applyCommentFilterTo(commentFilter);
dismiss();
});
binding.deleteTextViewCommentFilterOptionsBottomSheetFragment.setOnClickListener(view -> {
activity.deleteCommentFilter(commentFilter);
dismiss();
});
if (activity.typeface != null) {
Utils.setFontToAllTextViews(binding.getRoot(), activity.typeface);
}
return binding.getRoot();
}
@Override
public void onAttach(@NonNull Context context) {
super.onAttach(context);
activity = (CommentFilterPreferenceActivity) context;
}
}

View File

@ -5,26 +5,17 @@ import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import androidx.annotation.NonNull;
import butterknife.BindView;
import butterknife.ButterKnife;
import ml.docilealligator.infinityforreddit.R;
import ml.docilealligator.infinityforreddit.activities.PostFilterPreferenceActivity;
import ml.docilealligator.infinityforreddit.customviews.LandscapeExpandedRoundedBottomSheetDialogFragment;
import ml.docilealligator.infinityforreddit.databinding.FragmentPostFilterOptionsBottomSheetBinding;
import ml.docilealligator.infinityforreddit.postfilter.PostFilter;
import ml.docilealligator.infinityforreddit.utils.Utils;
public class PostFilterOptionsBottomSheetFragment extends LandscapeExpandedRoundedBottomSheetDialogFragment {
@BindView(R.id.edit_text_view_post_filter_options_bottom_sheet_fragment)
TextView editTextView;
@BindView(R.id.apply_to_text_view_post_filter_options_bottom_sheet_fragment)
TextView applyToTextView;
@BindView(R.id.delete_text_view_post_filter_options_bottom_sheet_fragment)
TextView deleteTextView;
public static final String EXTRA_POST_FILTER = "EPF";
private PostFilterPreferenceActivity activity;
@ -36,32 +27,30 @@ public class PostFilterOptionsBottomSheetFragment extends LandscapeExpandedRound
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View rootView = inflater.inflate(R.layout.fragment_post_filter_options_bottom_sheet, container, false);
ButterKnife.bind(this, rootView);
FragmentPostFilterOptionsBottomSheetBinding binding = FragmentPostFilterOptionsBottomSheetBinding.inflate(inflater, container, false);
PostFilter postFilter = getArguments().getParcelable(EXTRA_POST_FILTER);
editTextView.setOnClickListener(view -> {
binding.editTextViewPostFilterOptionsBottomSheetFragment.setOnClickListener(view -> {
activity.editPostFilter(postFilter);
dismiss();
});
applyToTextView.setOnClickListener(view -> {
binding.applyToTextViewPostFilterOptionsBottomSheetFragment.setOnClickListener(view -> {
activity.applyPostFilterTo(postFilter);
dismiss();
});
deleteTextView.setOnClickListener(view -> {
binding.deleteTextViewPostFilterOptionsBottomSheetFragment.setOnClickListener(view -> {
activity.deletePostFilter(postFilter);
dismiss();
});
if (activity.typeface != null) {
Utils.setFontToAllTextViews(rootView, activity.typeface);
Utils.setFontToAllTextViews(binding.getRoot(), activity.typeface);
}
return rootView;
return binding.getRoot();
}
@Override

View File

@ -1,5 +1,16 @@
package ml.docilealligator.infinityforreddit.commentfilter;
public class CommentFilterWithUsage {
import androidx.room.Embedded;
import androidx.room.Relation;
import java.util.List;
public class CommentFilterWithUsage {
@Embedded
public CommentFilter commentFilter;
@Relation(
parentColumn = "name",
entityColumn = "name"
)
public List<CommentFilterUsage> commentFilterUsageList;
}

View File

@ -0,0 +1,38 @@
package ml.docilealligator.infinityforreddit.commentfilter;
import androidx.annotation.NonNull;
import androidx.lifecycle.LiveData;
import androidx.lifecycle.ViewModel;
import androidx.lifecycle.ViewModelProvider;
import java.util.List;
import ml.docilealligator.infinityforreddit.RedditDataRoomDatabase;
public class CommentFilterWithUsageViewModel extends ViewModel {
private LiveData<List<CommentFilterWithUsage>> mCommentFilterWithUsageListLiveData;
public CommentFilterWithUsageViewModel(RedditDataRoomDatabase redditDataRoomDatabase) {
mCommentFilterWithUsageListLiveData = redditDataRoomDatabase.commentFilterDao().getAllCommentFilterWithUsageLiveData();
}
public LiveData<List<CommentFilterWithUsage>> getCommentFilterWithUsageListLiveData() {
return mCommentFilterWithUsageListLiveData;
}
public static class Factory extends ViewModelProvider.NewInstanceFactory {
private final RedditDataRoomDatabase mRedditDataRoomDatabase;
public Factory(RedditDataRoomDatabase redditDataRoomDatabase) {
mRedditDataRoomDatabase = redditDataRoomDatabase;
}
@NonNull
@Override
public <T extends ViewModel> T create(@NonNull Class<T> modelClass) {
//noinspection unchecked
return (T) new CommentFilterWithUsageViewModel(mRedditDataRoomDatabase);
}
}
}

View File

@ -0,0 +1,11 @@
package ml.docilealligator.infinityforreddit.commentfilter;
import java.util.concurrent.Executor;
import ml.docilealligator.infinityforreddit.RedditDataRoomDatabase;
public class DeleteCommentFilter {
public static void deleteCommentFilter(RedditDataRoomDatabase redditDataRoomDatabase, Executor executor, CommentFilter commentFilter) {
executor.execute(() -> redditDataRoomDatabase.commentFilterDao().deleteCommentFilter(commentFilter));
}
}

View File

@ -0,0 +1,52 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".activities.CommentFilterPreferenceActivity">
<com.google.android.material.appbar.AppBarLayout
android:id="@+id/appbar_layout_comment_filter_preference_activity"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="@style/AppTheme.AppBarOverlay">
<com.google.android.material.appbar.CollapsingToolbarLayout
android:id="@+id/collapsing_toolbar_layout_comment_filter_preference_activity"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_scrollFlags="scroll|enterAlways"
app:titleEnabled="false"
app:toolbarId="@+id/toolbar_comment_filter_preference_activity">
<androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar_comment_filter_preference_activity"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="?attr/actionBarSize"
app:popupTheme="@style/AppTheme.PopupOverlay"
app:navigationIcon="?attr/homeAsUpIndicator" />
</com.google.android.material.appbar.CollapsingToolbarLayout>
</com.google.android.material.appbar.AppBarLayout>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recycler_view_comment_filter_preference_activity"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
app:layout_behavior="@string/appbar_scrolling_view_behavior" />
<com.google.android.material.floatingactionbutton.FloatingActionButton
android:id="@+id/fab_comment_filter_preference_activity"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="@dimen/fab_margin"
android:layout_gravity="bottom|end"
app:backgroundTint="?attr/colorPrimaryLightTheme"
app:srcCompat="@drawable/ic_add_day_night_24dp"
app:tint="@android:color/white" />
</androidx.coordinatorlayout.widget.CoordinatorLayout>

View File

@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".activities.CommentFilterUsageListingActivity">
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".activities.CustomizeCommentFilterActivity">
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@ -0,0 +1,70 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.core.widget.NestedScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:paddingBottom="8dp"
android:overScrollMode="never">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:id="@+id/edit_text_view_comment_filter_options_bottom_sheet_fragment"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/edit"
android:textColor="?attr/primaryTextColor"
android:textSize="?attr/font_default"
android:fontFamily="?attr/font_family"
android:paddingTop="16dp"
android:paddingBottom="16dp"
android:paddingStart="32dp"
android:paddingEnd="32dp"
app:drawableStartCompat="@drawable/ic_edit_24dp"
android:drawablePadding="48dp"
android:clickable="true"
android:focusable="true"
android:background="?attr/selectableItemBackground" />
<TextView
android:id="@+id/apply_to_text_view_comment_filter_options_bottom_sheet_fragment"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/apply_to"
android:textColor="?attr/primaryTextColor"
android:textSize="?attr/font_default"
android:fontFamily="?attr/font_family"
android:paddingTop="16dp"
android:paddingBottom="16dp"
android:paddingStart="32dp"
android:paddingEnd="32dp"
app:drawableStartCompat="@drawable/ic_apply_to_24dp"
android:drawablePadding="48dp"
android:clickable="true"
android:focusable="true"
android:background="?attr/selectableItemBackground" />
<TextView
android:id="@+id/delete_text_view_comment_filter_options_bottom_sheet_fragment"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/delete"
android:textColor="?attr/primaryTextColor"
android:textSize="?attr/font_default"
android:fontFamily="?attr/font_family"
android:paddingTop="16dp"
android:paddingBottom="16dp"
android:paddingStart="32dp"
android:paddingEnd="32dp"
app:drawableStartCompat="@drawable/ic_delete_24dp"
android:drawablePadding="48dp"
android:clickable="true"
android:focusable="true"
android:background="?attr/selectableItemBackground" />
</LinearLayout>
</androidx.core.widget.NestedScrollView>

View File

@ -33,7 +33,7 @@
android:id="@+id/apply_to_text_view_post_filter_options_bottom_sheet_fragment"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/apply_post_filter_to"
android:text="@string/apply_to"
android:textColor="?attr/primaryTextColor"
android:textSize="?attr/font_default"
android:fontFamily="?attr/font_family"

View File

@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="8dp"
android:layout_marginStart="24dp"
android:textColor="?attr/primaryTextColor"
android:textSize="?attr/font_default"
android:fontFamily="?attr/font_family" />

View File

@ -0,0 +1,28 @@
<?xml version="1.0" encoding="utf-8"?>
<ml.docilealligator.infinityforreddit.customviews.InterceptTouchEventLinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:paddingTop="16dp"
android:paddingBottom="16dp"
android:paddingStart="72dp"
android:paddingEnd="16dp"
android:clickable="true"
android:focusable="true"
android:background="?attr/selectableItemBackground">
<TextView
android:id="@+id/comment_filter_name_text_view_item_comment_filter"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:fontFamily="?attr/font_family"
android:textColor="?attr/primaryTextColor"
android:textSize="?attr/font_16" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/comment_filter_usage_recycler_view_item_comment_filter"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:nestedScrollingEnabled="false" />
</ml.docilealligator.infinityforreddit.customviews.InterceptTouchEventLinearLayout>

View File

@ -958,7 +958,7 @@ Zpráva: %2$s"</string>
<string name="post_filter_requires_a_name">"Jak se jmenuje tento filtr příspěvků?"</string>
<string name="duplicate_post_filter_dialog_title">"'%1$s' již existuje"</string>
<string name="duplicate_post_filter_dialog_message">"Chcete jej přepsat?"</string>
<string name="apply_post_filter_to">"Použít na"</string>
<string name="apply_to">"Použít na"</string>
<string name="post_filter_usage_home">"Domů"</string>
<string name="post_filter_usage_subreddit">"Subreddit: %1$s"</string>
<string name="post_filter_usage_subreddit_all">"Subreddit"</string>

View File

@ -991,7 +991,7 @@ Nachricht: %2$s"</string>
<string name="post_filter_requires_a_name">"Wie lautet der Name des Beitragsfilters?"</string>
<string name="duplicate_post_filter_dialog_title">"'%1$s' existiert bereits"</string>
<string name="duplicate_post_filter_dialog_message">"Überschreiben?"</string>
<string name="apply_post_filter_to">"Anwenden auf"</string>
<string name="apply_to">"Anwenden auf"</string>
<string name="post_filter_usage_home">"Home"</string>
<string name="post_filter_usage_subreddit">"Subreddit: %1$s"</string>
<string name="post_filter_usage_subreddit_all">"Subreddit"</string>

View File

@ -902,7 +902,7 @@ https://play.google.com/store/apps/details?id=ml.docilealligator.infinityforredd
<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="apply_post_filter_to">"Εφαρμογή σε"</string>
<string name="apply_to">"Εφαρμογή σε"</string>
<string name="post_filter_usage_home">"Αρχική"</string>
<string name="post_filter_usage_subreddit">"Subreddit: %1$s"</string>
<string name="post_filter_usage_subreddit_all">"Subreddit"</string>

View File

@ -1006,7 +1006,7 @@ Mensaje: %2$s"</string>
<string name="post_filter_requires_a_name">"¿Cuál es el nombre de este filtro de publicaciones?"</string>
<string name="duplicate_post_filter_dialog_title">"'%1$s' Ya Existe"</string>
<string name="duplicate_post_filter_dialog_message">"¿Sobrescribir?"</string>
<string name="apply_post_filter_to">"Aplicar a"</string>
<string name="apply_to">"Aplicar a"</string>
<string name="post_filter_usage_home">"Inicio"</string>
<string name="post_filter_usage_subreddit">"Subreddit: %1$s"</string>
<string name="post_filter_usage_subreddit_all">"Subreddit"</string>

View File

@ -1061,7 +1061,7 @@ Les onglets pourraient perdre tout leur contenu quand vous passez d'un onglet à
<string name="post_filter_requires_a_name">"Quel est le nom de ce filtre de publication ?"</string>
<string name="duplicate_post_filter_dialog_title">"'%1$s' Existe déjà"</string>
<string name="duplicate_post_filter_dialog_message">"Le remplacer ?"</string>
<string name="apply_post_filter_to">"Appliquer à"</string>
<string name="apply_to">"Appliquer à"</string>
<string name="post_filter_usage_home">"Acceuil"</string>
<string name="post_filter_usage_subreddit">"Subreddit: %1$s"</string>
<string name="post_filter_usage_subreddit_all">"Subreddit"</string>

View File

@ -1030,7 +1030,7 @@ https://play.google.com/store/apps/details?id=ml.docilealligator.infinityforredd
<string name="post_filter_name_hint">"Post filter का नाम"</string>
<string name="post_filter_requires_a_name">"इस post filter का नाम क्या है?"</string>
<string name="duplicate_post_filter_dialog_title">"'%1$s' पहले से ही है"</string>
<string name="apply_post_filter_to">"लागू करें"</string>
<string name="apply_to">"लागू करें"</string>
<string name="post_filter_usage_subreddit">"Subreddit: %1$s"</string>
<string name="post_filter_usage_subreddit_all">"Subreddit"</string>
<string name="post_filter_usage_user">"User: %1$s"</string>

View File

@ -937,7 +937,7 @@ Videó autómatikus lejátszása le van tiltva."</string>
<string name="duplicate_post_filter_dialog_message">"Írja fölül?"</string>
<!-- Fuzzy -->
<string name="apply_post_filter_to">"Alkalmazd"</string>
<string name="apply_to">"Alkalmazd"</string>
<string name="post_filter_usage_home">"Home"</string>
<string name="post_filter_usage_subreddit">"Subreddit: %1$s"</string>
<string name="post_filter_usage_subreddit_all">"Subreddit"</string>

View File

@ -906,7 +906,7 @@ Messaggio: %2$s"</string>
<string name="post_filter_requires_a_name">"Come vuoi chiamare questo filtro post?"</string>
<string name="duplicate_post_filter_dialog_title">"'%1$s' esiste già"</string>
<string name="duplicate_post_filter_dialog_message">"Vuoi sovrascriverlo?"</string>
<string name="apply_post_filter_to">"Applica a"</string>
<string name="apply_to">"Applica a"</string>
<string name="post_filter_usage_home">"Home"</string>
<string name="post_filter_usage_subreddit">"Subreddit: %1$s"</string>
<string name="post_filter_usage_subreddit_all">"Subreddit"</string>

View File

@ -1033,7 +1033,7 @@ https://play.google.com/store/apps/details?id=ml.docilealligator.infinityforredd
<string name="min_awards_hint">"最小のアワード数 (-1: 制限なし)"</string>
<string name="duplicate_post_filter_dialog_title">"「%1$s 」は既に存在します"</string>
<string name="duplicate_post_filter_dialog_message">"上書きしますか?"</string>
<string name="apply_post_filter_to">"適用"</string>
<string name="apply_to">"適用"</string>
<string name="post_filter_usage_home">"ホーム"</string>
<string name="post_filter_usage_subreddit_all">"Subreddit"</string>
<string name="post_filter_usage_user">"ユーザー: %1$s"</string>

View File

@ -966,7 +966,7 @@ Bericht: %2$s"</string>
<string name="post_filter_requires_a_name">"Wat is de naam van deze post filter?"</string>
<string name="duplicate_post_filter_dialog_title">"'%1$s' Bestaat Al"</string>
<string name="duplicate_post_filter_dialog_message">"Overschrijven?"</string>
<string name="apply_post_filter_to">"Toepassen op"</string>
<string name="apply_to">"Toepassen op"</string>
<string name="post_filter_usage_home">"Thuis"</string>
<string name="post_filter_usage_subreddit">"Subreddit: %1$s"</string>
<string name="post_filter_usage_subreddit_all">"Subreddit"</string>

View File

@ -956,7 +956,7 @@ Wiadomość: %2$s"</string>
<string name="post_filter_requires_a_name">"Jaka jest nazwa filtru tego posta?"</string>
<string name="duplicate_post_filter_dialog_title">"'%1$s' już istnieje"</string>
<string name="duplicate_post_filter_dialog_message">"Nadpisać?"</string>
<string name="apply_post_filter_to">"Zastosuj do"</string>
<string name="apply_to">"Zastosuj do"</string>
<string name="post_filter_usage_home">"Strona główna"</string>
<string name="post_filter_usage_subreddit">"Subreddit: %1$s"</string>
<string name="post_filter_usage_subreddit_all">"Subreddit"</string>

View File

@ -944,7 +944,7 @@ Mensagem: %2$s"</string>
<string name="post_filter_requires_a_name">"Qual é o nome deste filtro de postagem?"</string>
<string name="duplicate_post_filter_dialog_title">"'%1$s' já existe"</string>
<string name="duplicate_post_filter_dialog_message">"Substituir isto?"</string>
<string name="apply_post_filter_to">"Aplicar a"</string>
<string name="apply_to">"Aplicar a"</string>
<string name="post_filter_usage_home">"Início"</string>
<string name="post_filter_usage_subreddit">"Subreddit: %1$s"</string>
<string name="post_filter_usage_subreddit_all">"Subreddit"</string>

View File

@ -953,7 +953,7 @@ Mensagem: %2$s"</string>
<string name="post_filter_requires_a_name">"Qual é o nome deste Filtro de Publicações?"</string>
<string name="duplicate_post_filter_dialog_title">"'%1$s' já existe"</string>
<string name="duplicate_post_filter_dialog_message">"Substituir?"</string>
<string name="apply_post_filter_to">"Aplicar a"</string>
<string name="apply_to">"Aplicar a"</string>
<string name="post_filter_usage_home">"Início"</string>
<string name="post_filter_usage_subreddit">"Comunidade: %1$s"</string>
<string name="post_filter_usage_subreddit_all">"Comunidade"</string>

View File

@ -950,7 +950,7 @@ Mesaj: %2$s"</string>
<string name="post_filter_requires_a_name">"Care este numele acestui filtru de post?"</string>
<string name="duplicate_post_filter_dialog_title">"%1$s' Există Deja"</string>
<string name="duplicate_post_filter_dialog_message">"Îl înlocuiești?"</string>
<string name="apply_post_filter_to">"Se aplică la"</string>
<string name="apply_to">"Se aplică la"</string>
<string name="post_filter_usage_home">"Acasă"</string>
<string name="post_filter_usage_subreddit">"Subreddit: %1$s"</string>
<string name="post_filter_usage_subreddit_all">"Subreddit"</string>

View File

@ -966,7 +966,7 @@ https://play.google.com/store/apps/details?id=ml.docilealligator.infinityforredd
<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="apply_post_filter_to">"Применить к"</string>
<string name="apply_to">"Применить к"</string>
<string name="post_filter_usage_home">"Домашняя"</string>
<string name="post_filter_usage_subreddit">"Сабреддит: %1$s"</string>
<string name="post_filter_usage_subreddit_all">"Сабреддит"</string>

View File

@ -974,7 +974,7 @@ Mesaj: %2$s"</string>
<string name="post_filter_requires_a_name">"Bu gönderi filtresinin adı nedir?"</string>
<string name="duplicate_post_filter_dialog_title">"'%1$s' Zaten Var"</string>
<string name="duplicate_post_filter_dialog_message">"Geçersiz kılınsın mı?"</string>
<string name="apply_post_filter_to">"Uygulanan:"</string>
<string name="apply_to">"Uygulanan:"</string>
<string name="post_filter_usage_home">"Ana Sayfa"</string>
<string name="post_filter_usage_subreddit">"Subreddit: %1$s"</string>
<string name="post_filter_usage_subreddit_all">"Subreddit"</string>

View File

@ -954,7 +954,7 @@ https://play.google.com/store/apps/details?id=ml.docilealligator.infinityforredd
<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="apply_post_filter_to">"Задіяно для"</string>
<string name="apply_to">"Задіяно для"</string>
<string name="post_filter_usage_home">"Домівка"</string>
<string name="post_filter_usage_subreddit">"Сабредит: %1$s"</string>
<string name="post_filter_usage_subreddit_all">"Сабредит"</string>

View File

@ -967,7 +967,7 @@ Thông báo: %2$s"</string>
<string name="post_filter_requires_a_name">"Bộ lọc bài đăng này tên là gì?"</string>
<string name="duplicate_post_filter_dialog_title">"'%1$s' đã tồn tại"</string>
<string name="duplicate_post_filter_dialog_message">"Ghi đè nó?"</string>
<string name="apply_post_filter_to">"Áp dụng vào"</string>
<string name="apply_to">"Áp dụng vào"</string>
<string name="post_filter_usage_home">"Trang chủ"</string>
<string name="post_filter_usage_subreddit">"Subreddit: %1$s"</string>
<string name="post_filter_usage_subreddit_all">"Subreddit"</string>

View File

@ -981,7 +981,7 @@ Reddit 视频分辨率较低。
<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="apply_post_filter_to">"应用于"</string>
<string name="apply_to">"应用于"</string>
<string name="post_filter_usage_home">"主页"</string>
<string name="post_filter_usage_subreddit">"版块:%1$s"</string>
<string name="post_filter_usage_subreddit_all">"版块"</string>

View File

@ -1141,7 +1141,7 @@
<string name="post_filter_requires_a_name">What is the name of this post filter?</string>
<string name="duplicate_post_filter_dialog_title">\'%1$s\' Already Exists</string>
<string name="duplicate_post_filter_dialog_message">Override it?</string>
<string name="apply_post_filter_to">Apply to</string>
<string name="apply_to">Apply to</string>
<string name="post_filter_usage_home">Home</string>
<string name="post_filter_usage_subreddit">Subreddit: %1$s</string>
<string name="post_filter_usage_subreddit_all">Subreddit</string>