Replace Filter settings with Post Filter.

This commit is contained in:
Alex Ning 2020-12-26 00:26:30 +08:00
parent 265805038d
commit fa55fb369d
34 changed files with 622 additions and 111 deletions

View File

@ -41,6 +41,7 @@ dependencies {
implementation 'androidx.browser:browser:1.3.0' implementation 'androidx.browser:browser:1.3.0'
implementation 'androidx.cardview:cardview:1.0.0' implementation 'androidx.cardview:cardview:1.0.0'
implementation 'androidx.constraintlayout:constraintlayout:2.0.4' implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
implementation 'androidx.legacy:legacy-support-v4:1.0.0'
def lifecycleVersion = "2.2.0" def lifecycleVersion = "2.2.0"
implementation "androidx.lifecycle:lifecycle-livedata:$lifecycleVersion" implementation "androidx.lifecycle:lifecycle-livedata:$lifecycleVersion"
implementation "androidx.lifecycle:lifecycle-viewmodel:$lifecycleVersion" implementation "androidx.lifecycle:lifecycle-viewmodel:$lifecycleVersion"

View File

@ -32,9 +32,14 @@
android:theme="@style/AppTheme" android:theme="@style/AppTheme"
android:usesCleartextTraffic="true" android:usesCleartextTraffic="true"
tools:replace="android:label"> tools:replace="android:label">
<activity android:name=".activities.CustomizePostFilterActivity" <activity android:name=".activities.PostFilterPreferenceActivity"
android:label="@string/post_filter_preference_activity_label"
android:parentActivityName=".activities.SettingsActivity" android:parentActivityName=".activities.SettingsActivity"
android:theme="@style/AppTheme.NoActionBar" />
<activity
android:name=".activities.CustomizePostFilterActivity"
android:label="@string/customize_post_filter_activity_label" android:label="@string/customize_post_filter_activity_label"
android:parentActivityName=".activities.SettingsActivity"
android:theme="@style/AppTheme.NoActionBar" android:theme="@style/AppTheme.NoActionBar"
android:windowSoftInputMode="adjustResize" /> android:windowSoftInputMode="adjustResize" />
<activity <activity

View File

@ -6,22 +6,23 @@ import dagger.Component;
import ml.docilealligator.infinityforreddit.activities.AccountPostsActivity; import ml.docilealligator.infinityforreddit.activities.AccountPostsActivity;
import ml.docilealligator.infinityforreddit.activities.AccountSavedThingActivity; import ml.docilealligator.infinityforreddit.activities.AccountSavedThingActivity;
import ml.docilealligator.infinityforreddit.activities.CommentActivity; import ml.docilealligator.infinityforreddit.activities.CommentActivity;
import ml.docilealligator.infinityforreddit.activities.CustomizePostFilterActivity;
import ml.docilealligator.infinityforreddit.activities.FullMarkdownActivity;
import ml.docilealligator.infinityforreddit.activities.CreateMultiRedditActivity; import ml.docilealligator.infinityforreddit.activities.CreateMultiRedditActivity;
import ml.docilealligator.infinityforreddit.activities.CustomThemeListingActivity; import ml.docilealligator.infinityforreddit.activities.CustomThemeListingActivity;
import ml.docilealligator.infinityforreddit.activities.CustomThemePreviewActivity; import ml.docilealligator.infinityforreddit.activities.CustomThemePreviewActivity;
import ml.docilealligator.infinityforreddit.activities.CustomizePostFilterActivity;
import ml.docilealligator.infinityforreddit.activities.CustomizeThemeActivity; import ml.docilealligator.infinityforreddit.activities.CustomizeThemeActivity;
import ml.docilealligator.infinityforreddit.activities.EditCommentActivity; import ml.docilealligator.infinityforreddit.activities.EditCommentActivity;
import ml.docilealligator.infinityforreddit.activities.EditMultiRedditActivity; import ml.docilealligator.infinityforreddit.activities.EditMultiRedditActivity;
import ml.docilealligator.infinityforreddit.activities.EditPostActivity; import ml.docilealligator.infinityforreddit.activities.EditPostActivity;
import ml.docilealligator.infinityforreddit.activities.FetchRandomSubredditOrPostActivity; import ml.docilealligator.infinityforreddit.activities.FetchRandomSubredditOrPostActivity;
import ml.docilealligator.infinityforreddit.activities.FilteredPostsActivity; import ml.docilealligator.infinityforreddit.activities.FilteredPostsActivity;
import ml.docilealligator.infinityforreddit.activities.FullMarkdownActivity;
import ml.docilealligator.infinityforreddit.activities.GiveAwardActivity; import ml.docilealligator.infinityforreddit.activities.GiveAwardActivity;
import ml.docilealligator.infinityforreddit.activities.InboxActivity; import ml.docilealligator.infinityforreddit.activities.InboxActivity;
import ml.docilealligator.infinityforreddit.activities.LinkResolverActivity; import ml.docilealligator.infinityforreddit.activities.LinkResolverActivity;
import ml.docilealligator.infinityforreddit.activities.LoginActivity; import ml.docilealligator.infinityforreddit.activities.LoginActivity;
import ml.docilealligator.infinityforreddit.activities.MainActivity; import ml.docilealligator.infinityforreddit.activities.MainActivity;
import ml.docilealligator.infinityforreddit.activities.PostFilterPreferenceActivity;
import ml.docilealligator.infinityforreddit.activities.PostImageActivity; import ml.docilealligator.infinityforreddit.activities.PostImageActivity;
import ml.docilealligator.infinityforreddit.activities.PostLinkActivity; import ml.docilealligator.infinityforreddit.activities.PostLinkActivity;
import ml.docilealligator.infinityforreddit.activities.PostTextActivity; import ml.docilealligator.infinityforreddit.activities.PostTextActivity;
@ -233,4 +234,6 @@ public interface AppComponent {
void inject(CustomizePostFilterActivity customizePostFilterActivity); void inject(CustomizePostFilterActivity customizePostFilterActivity);
void inject(PostHistoryFragment postHistoryFragment); void inject(PostHistoryFragment postHistoryFragment);
void inject(PostFilterPreferenceActivity postFilterPreferenceActivity);
} }

View File

@ -1,7 +1,6 @@
package ml.docilealligator.infinityforreddit.activities; package ml.docilealligator.infinityforreddit.activities;
import android.app.Activity; import android.app.Activity;
import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.content.SharedPreferences; import android.content.SharedPreferences;
import android.content.res.ColorStateList; import android.content.res.ColorStateList;
@ -10,9 +9,6 @@ import android.os.Bundle;
import android.os.Handler; import android.os.Handler;
import android.view.Menu; import android.view.Menu;
import android.view.MenuItem; import android.view.MenuItem;
import android.view.View;
import android.view.inputmethod.InputMethodManager;
import android.widget.EditText;
import android.widget.LinearLayout; import android.widget.LinearLayout;
import android.widget.TextView; import android.widget.TextView;
import android.widget.Toast; import android.widget.Toast;
@ -24,7 +20,6 @@ import androidx.coordinatorlayout.widget.CoordinatorLayout;
import com.google.android.material.appbar.AppBarLayout; import com.google.android.material.appbar.AppBarLayout;
import com.google.android.material.appbar.CollapsingToolbarLayout; import com.google.android.material.appbar.CollapsingToolbarLayout;
import com.google.android.material.checkbox.MaterialCheckBox; import com.google.android.material.checkbox.MaterialCheckBox;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import com.google.android.material.switchmaterial.SwitchMaterial; import com.google.android.material.switchmaterial.SwitchMaterial;
import com.google.android.material.textfield.TextInputEditText; import com.google.android.material.textfield.TextInputEditText;
import com.google.android.material.textfield.TextInputLayout; import com.google.android.material.textfield.TextInputLayout;
@ -48,6 +43,7 @@ import ml.docilealligator.infinityforreddit.utils.SharedPreferencesUtils;
public class CustomizePostFilterActivity extends BaseActivity { public class CustomizePostFilterActivity extends BaseActivity {
public static final String EXTRA_POST_FILTER = "EPF"; public static final String EXTRA_POST_FILTER = "EPF";
public static final String EXTRA_FROM_SETTINGS = "EFS";
public static final String RETURN_EXTRA_POST_FILTER = "REPF"; public static final String RETURN_EXTRA_POST_FILTER = "REPF";
private static final String POST_FILTER_STATE = "PFS"; private static final String POST_FILTER_STATE = "PFS";
@ -59,6 +55,10 @@ public class CustomizePostFilterActivity extends BaseActivity {
CollapsingToolbarLayout collapsingToolbarLayout; CollapsingToolbarLayout collapsingToolbarLayout;
@BindView(R.id.toolbar_customize_post_filter_activity) @BindView(R.id.toolbar_customize_post_filter_activity)
Toolbar toolbar; Toolbar toolbar;
@BindView(R.id.name_text_input_layout_customize_post_filter_activity)
TextInputLayout nameTextInputLayout;
@BindView(R.id.name_text_input_edit_text_customize_post_filter_activity)
TextInputEditText nameTextInputEditText;
@BindView(R.id.post_type_text_linear_layout_customize_post_filter_activity) @BindView(R.id.post_type_text_linear_layout_customize_post_filter_activity)
LinearLayout postTypeTextLinearLayout; LinearLayout postTypeTextLinearLayout;
@BindView(R.id.post_type_text_text_view_customize_post_filter_activity) @BindView(R.id.post_type_text_text_view_customize_post_filter_activity)
@ -165,6 +165,7 @@ public class CustomizePostFilterActivity extends BaseActivity {
@Inject @Inject
Executor mExecutor; Executor mExecutor;
private PostFilter postFilter; private PostFilter postFilter;
private boolean fromSettings;
@Override @Override
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
@ -191,6 +192,8 @@ public class CustomizePostFilterActivity extends BaseActivity {
getSupportActionBar().setDisplayHomeAsUpEnabled(true); getSupportActionBar().setDisplayHomeAsUpEnabled(true);
setToolbarGoToTop(toolbar); setToolbarGoToTop(toolbar);
fromSettings = getIntent().getBooleanExtra(EXTRA_FROM_SETTINGS, false);
postTypeTextLinearLayout.setOnClickListener(view -> { postTypeTextLinearLayout.setOnClickListener(view -> {
postTypeTextCheckBox.performClick(); postTypeTextCheckBox.performClick();
}); });
@ -235,6 +238,7 @@ public class CustomizePostFilterActivity extends BaseActivity {
} }
private void bindView() { private void bindView() {
nameTextInputEditText.setText(postFilter.name);
postTypeTextCheckBox.setChecked(postFilter.containTextType); postTypeTextCheckBox.setChecked(postFilter.containTextType);
postTypeLinkCheckBox.setChecked(postFilter.containLinkType); postTypeLinkCheckBox.setChecked(postFilter.containLinkType);
postTypeImageCheckBox.setChecked(postFilter.containImageType); postTypeImageCheckBox.setChecked(postFilter.containImageType);
@ -270,6 +274,9 @@ public class CustomizePostFilterActivity extends BaseActivity {
coordinatorLayout.setBackgroundColor(mCustomThemeWrapper.getBackgroundColor()); coordinatorLayout.setBackgroundColor(mCustomThemeWrapper.getBackgroundColor());
applyAppBarLayoutAndToolbarTheme(appBarLayout, toolbar); applyAppBarLayoutAndToolbarTheme(appBarLayout, toolbar);
int primaryTextColor = mCustomThemeWrapper.getPrimaryTextColor(); int primaryTextColor = mCustomThemeWrapper.getPrimaryTextColor();
nameTextInputLayout.setBoxStrokeColor(primaryTextColor);
nameTextInputLayout.setDefaultHintTextColor(ColorStateList.valueOf(primaryTextColor));
nameTextInputEditText.setTextColor(primaryTextColor);
postTypeTextTextView.setTextColor(primaryTextColor); postTypeTextTextView.setTextColor(primaryTextColor);
postTypeLinkTextView.setTextColor(primaryTextColor); postTypeLinkTextView.setTextColor(primaryTextColor);
postTypeImageTextView.setTextColor(primaryTextColor); postTypeImageTextView.setTextColor(primaryTextColor);
@ -319,6 +326,9 @@ public class CustomizePostFilterActivity extends BaseActivity {
@Override @Override
public boolean onCreateOptionsMenu(Menu menu) { public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.customize_post_filter_activity, menu); getMenuInflater().inflate(R.menu.customize_post_filter_activity, menu);
if (fromSettings) {
menu.findItem(R.id.action_save_customize_post_filter_activity).setVisible(false);
}
applyMenuItemTheme(menu); applyMenuItemTheme(menu);
return true; return true;
} }
@ -329,7 +339,7 @@ public class CustomizePostFilterActivity extends BaseActivity {
finish(); finish();
return true; return true;
} else if (item.getItemId() == R.id.action_save_customize_post_filter_activity) { } else if (item.getItemId() == R.id.action_save_customize_post_filter_activity) {
PostFilter postFilter = constructPostFilter(); constructPostFilter();
Intent returnIntent = new Intent(); Intent returnIntent = new Intent();
returnIntent.putExtra(RETURN_EXTRA_POST_FILTER, postFilter); returnIntent.putExtra(RETURN_EXTRA_POST_FILTER, postFilter);
setResult(Activity.RESULT_OK, returnIntent); setResult(Activity.RESULT_OK, returnIntent);
@ -337,63 +347,25 @@ public class CustomizePostFilterActivity extends BaseActivity {
return true; return true;
} else if (item.getItemId() == R.id.action_save_to_database_customize_post_filter_activity) { } else if (item.getItemId() == R.id.action_save_to_database_customize_post_filter_activity) {
PostFilter postFilter = constructPostFilter(); constructPostFilter();
View dialogView = getLayoutInflater().inflate(R.layout.dialog_edit_name, null); if (!postFilter.name.equals("")) {
EditText nameEditText = dialogView.findViewById(R.id.theme_name_edit_text_edit_name_dialog);
nameEditText.setHint(R.string.post_filter_name_hint);
nameEditText.setText(postFilter.name);
nameEditText.requestFocus();
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
if (imm != null) {
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
}
new MaterialAlertDialogBuilder(this, R.style.MaterialAlertDialogTheme)
.setTitle(R.string.edit_theme_name)
.setView(dialogView)
.setPositiveButton(R.string.ok, (dialogInterface, i)
-> {
if (imm != null) {
imm.hideSoftInputFromWindow(nameEditText.getWindowToken(), 0);
}
if (!nameEditText.getText().toString().equals("")) {
postFilter.name = nameEditText.getText().toString();
Handler handler = new Handler(); Handler handler = new Handler();
SavePostFilter.savePostFilter(mRedditDataRoomDatabase, mExecutor, postFilter, new SavePostFilter.SavePostFilterListener() { SavePostFilter.savePostFilter(mRedditDataRoomDatabase, mExecutor, postFilter, () -> handler.post(() -> {
@Override
public void success() {
handler.post(() -> {
Intent returnIntent = new Intent(); Intent returnIntent = new Intent();
returnIntent.putExtra(RETURN_EXTRA_POST_FILTER, postFilter); returnIntent.putExtra(RETURN_EXTRA_POST_FILTER, postFilter);
setResult(Activity.RESULT_OK, returnIntent); setResult(Activity.RESULT_OK, returnIntent);
finish(); finish();
}); }));
} else {
Toast.makeText(CustomizePostFilterActivity.this, R.string.post_filter_requires_a_name, Toast.LENGTH_LONG).show();
} }
@Override
public void failed(int errorCode) {
handler.post(() -> Toast.makeText(CustomizePostFilterActivity.this, R.string.duplicate_post_filter, Toast.LENGTH_LONG).show());
}
});
}
})
.setNegativeButton(R.string.cancel, (dialogInterface, i) -> {
if (imm != null) {
imm.hideSoftInputFromWindow(nameEditText.getWindowToken(), 0);
}
})
.setOnDismissListener(dialogInterface -> {
if (imm != null) {
imm.hideSoftInputFromWindow(nameEditText.getWindowToken(), 0);
}
})
.show();
} }
return false; return false;
} }
private PostFilter constructPostFilter() { private void constructPostFilter() {
PostFilter postFilter = new PostFilter(); postFilter.name = nameTextInputEditText.getText().toString();
postFilter.maxVote = maxVoteTextInputEditText.getText() == null || maxVoteTextInputEditText.getText().toString().equals("") ? -1 : Integer.parseInt(maxVoteTextInputEditText.getText().toString()); postFilter.maxVote = maxVoteTextInputEditText.getText() == null || maxVoteTextInputEditText.getText().toString().equals("") ? -1 : Integer.parseInt(maxVoteTextInputEditText.getText().toString());
postFilter.minVote = minVoteTextInputEditText.getText() == null || minVoteTextInputEditText.getText().toString().equals("") ? -1 : Integer.parseInt(minVoteTextInputEditText.getText().toString()); postFilter.minVote = minVoteTextInputEditText.getText() == null || minVoteTextInputEditText.getText().toString().equals("") ? -1 : Integer.parseInt(minVoteTextInputEditText.getText().toString());
postFilter.maxComments = maxCommentsTextInputEditText.getText() == null || maxCommentsTextInputEditText.getText().toString().equals("") ? -1 : Integer.parseInt(maxCommentsTextInputEditText.getText().toString()); postFilter.maxComments = maxCommentsTextInputEditText.getText() == null || maxCommentsTextInputEditText.getText().toString().equals("") ? -1 : Integer.parseInt(maxCommentsTextInputEditText.getText().toString());
@ -414,8 +386,6 @@ public class CustomizePostFilterActivity extends BaseActivity {
postFilter.containGalleryType = postTypeGalleryCheckBox.isChecked(); postFilter.containGalleryType = postTypeGalleryCheckBox.isChecked();
postFilter.onlyNSFW = onlyNSFWSwitch.isChecked(); postFilter.onlyNSFW = onlyNSFWSwitch.isChecked();
postFilter.onlySpoiler = onlySpoilerSwitch.isChecked(); postFilter.onlySpoiler = onlySpoilerSwitch.isChecked();
return postFilter;
} }
@Override @Override

View File

@ -0,0 +1,127 @@
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.appcompat.widget.Toolbar;
import androidx.coordinatorlayout.widget.CoordinatorLayout;
import androidx.lifecycle.ViewModelProvider;
import androidx.recyclerview.widget.RecyclerView;
import com.google.android.material.appbar.AppBarLayout;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import javax.inject.Inject;
import javax.inject.Named;
import butterknife.BindView;
import butterknife.ButterKnife;
import ml.docilealligator.infinityforreddit.Infinity;
import ml.docilealligator.infinityforreddit.R;
import ml.docilealligator.infinityforreddit.RedditDataRoomDatabase;
import ml.docilealligator.infinityforreddit.adapters.FilterFragmentPostFilterRecyclerViewAdapter;
import ml.docilealligator.infinityforreddit.bottomsheetfragments.PostFilterOptionsBottomSheetFragment;
import ml.docilealligator.infinityforreddit.customtheme.CustomThemeWrapper;
import ml.docilealligator.infinityforreddit.postfilter.PostFilter;
import ml.docilealligator.infinityforreddit.postfilter.PostFilterViewModel;
public class PostFilterPreferenceActivity extends BaseActivity {
@BindView(R.id.coordinator_layout_post_filter_preference_activity)
CoordinatorLayout coordinatorLayout;
@BindView(R.id.appbar_layout_post_filter_preference_activity)
AppBarLayout appBarLayout;
@BindView(R.id.toolbar_post_filter_preference_activity)
Toolbar toolbar;
@BindView(R.id.recycler_view_post_filter_preference_activity)
RecyclerView recyclerView;
@BindView(R.id.fab_post_filter_preference_activity)
FloatingActionButton fab;
@Inject
@Named("default")
SharedPreferences sharedPreferences;
@Inject
RedditDataRoomDatabase redditDataRoomDatabase;
@Inject
CustomThemeWrapper customThemeWrapper;
public PostFilterViewModel postFilterViewModel;
private FilterFragmentPostFilterRecyclerViewAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
((Infinity) getApplication()).getAppComponent().inject(this);
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_post_filter_preference);
ButterKnife.bind(this);
applyCustomTheme();
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
fab.setOnClickListener(view -> {
Intent intent = new Intent(PostFilterPreferenceActivity.this, CustomizePostFilterActivity.class);
intent.putExtra(CustomizePostFilterActivity.EXTRA_FROM_SETTINGS, true);
startActivity(intent);
});
adapter = new FilterFragmentPostFilterRecyclerViewAdapter(postFilter -> {
PostFilterOptionsBottomSheetFragment postFilterOptionsBottomSheetFragment = new PostFilterOptionsBottomSheetFragment();
Bundle bundle = new Bundle();
bundle.putParcelable(PostFilterOptionsBottomSheetFragment.EXTRA_POST_FILTER, postFilter);
postFilterOptionsBottomSheetFragment.setArguments(bundle);
postFilterOptionsBottomSheetFragment.show(getSupportFragmentManager(), postFilterOptionsBottomSheetFragment.getTag());
});
recyclerView.setAdapter(adapter);
postFilterViewModel = new ViewModelProvider(this,
new PostFilterViewModel.Factory(redditDataRoomDatabase)).get(PostFilterViewModel.class);
postFilterViewModel.getPostFilterListLiveData().observe(this, postFilters -> adapter.setPostFilterList(postFilters));
}
public void editPostFilter(PostFilter postFilter) {
Intent intent = new Intent(PostFilterPreferenceActivity.this, CustomizePostFilterActivity.class);
intent.putExtra(CustomizePostFilterActivity.EXTRA_POST_FILTER, postFilter);
intent.putExtra(CustomizePostFilterActivity.EXTRA_FROM_SETTINGS, true);
startActivity(intent);
}
public void applyPostFilterTo(PostFilter postFilter) {
}
public void deletePostFilter(PostFilter postFilter) {
}
@Override
protected SharedPreferences getDefaultSharedPreferences() {
return sharedPreferences;
}
@Override
protected CustomThemeWrapper getCustomThemeWrapper() {
return customThemeWrapper;
}
@Override
protected void applyCustomTheme() {
applyAppBarLayoutAndToolbarTheme(appBarLayout, toolbar);
}
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
if (item.getItemId() == android.R.id.home) {
finish();
return true;
}
return false;
}
}

View File

@ -22,12 +22,12 @@ import javax.inject.Named;
import butterknife.BindView; import butterknife.BindView;
import butterknife.ButterKnife; import butterknife.ButterKnife;
import ml.docilealligator.infinityforreddit.asynctasks.GetCurrentAccountAsyncTask;
import ml.docilealligator.infinityforreddit.customtheme.CustomThemeWrapper;
import ml.docilealligator.infinityforreddit.events.RecreateActivityEvent;
import ml.docilealligator.infinityforreddit.Infinity; import ml.docilealligator.infinityforreddit.Infinity;
import ml.docilealligator.infinityforreddit.R; import ml.docilealligator.infinityforreddit.R;
import ml.docilealligator.infinityforreddit.RedditDataRoomDatabase; import ml.docilealligator.infinityforreddit.RedditDataRoomDatabase;
import ml.docilealligator.infinityforreddit.asynctasks.GetCurrentAccountAsyncTask;
import ml.docilealligator.infinityforreddit.customtheme.CustomThemeWrapper;
import ml.docilealligator.infinityforreddit.events.RecreateActivityEvent;
import ml.docilealligator.infinityforreddit.settings.AboutPreferenceFragment; import ml.docilealligator.infinityforreddit.settings.AboutPreferenceFragment;
import ml.docilealligator.infinityforreddit.settings.CustomizeBottomAppBarFragment; import ml.docilealligator.infinityforreddit.settings.CustomizeBottomAppBarFragment;
import ml.docilealligator.infinityforreddit.settings.CustomizeMainPageTabsFragment; import ml.docilealligator.infinityforreddit.settings.CustomizeMainPageTabsFragment;
@ -85,13 +85,16 @@ public class SettingsActivity extends BaseActivity implements
getSupportFragmentManager().addOnBackStackChangedListener(() -> { getSupportFragmentManager().addOnBackStackChangedListener(() -> {
if (getSupportFragmentManager().getBackStackEntryCount() == 0) { if (getSupportFragmentManager().getBackStackEntryCount() == 0) {
setTitle(R.string.settings_activity_label); setTitle(R.string.settings_activity_label);
} else if (getSupportFragmentManager().findFragmentById(R.id.frame_layout_settings_activity) instanceof AboutPreferenceFragment) { return;
}
Fragment fragment = getSupportFragmentManager().findFragmentById(R.id.frame_layout_settings_activity);
if (fragment instanceof AboutPreferenceFragment) {
setTitle(R.string.settings_about_master_title); setTitle(R.string.settings_about_master_title);
} else if (getSupportFragmentManager().findFragmentById(R.id.frame_layout_settings_activity) instanceof InterfacePreferenceFragment) { } else if (fragment instanceof InterfacePreferenceFragment) {
setTitle(R.string.settings_interface_title); setTitle(R.string.settings_interface_title);
} else if (getSupportFragmentManager().findFragmentById(R.id.frame_layout_settings_activity) instanceof FontPreferenceFragment) { } else if (fragment instanceof FontPreferenceFragment) {
setTitle(R.string.settings_font_title); setTitle(R.string.settings_font_title);
} else if (getSupportFragmentManager().findFragmentById(R.id.frame_layout_settings_activity) instanceof GesturesAndButtonsPreferenceFragment) { } else if (fragment instanceof GesturesAndButtonsPreferenceFragment) {
setTitle(R.string.settings_gestures_and_buttons_title); setTitle(R.string.settings_gestures_and_buttons_title);
} }
}); });

View File

@ -0,0 +1,85 @@
package ml.docilealligator.infinityforreddit.adapters;
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 java.util.List;
import ml.docilealligator.infinityforreddit.R;
import ml.docilealligator.infinityforreddit.postfilter.PostFilter;
public class FilterFragmentPostFilterRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private static final int VIEW_TYPE_HEADER = 1;
private static final int VIEW_TYPE_POST_FILTER = 2;
private final OnItemClickListener onItemClickListener;
private List<PostFilter> postFilterList;
public interface OnItemClickListener {
void onItemClick(PostFilter postFilter);
}
public FilterFragmentPostFilterRecyclerViewAdapter(OnItemClickListener onItemClickListener) {
this.onItemClickListener = onItemClickListener;
}
@Override
public int getItemViewType(int position) {
if (position == 0) {
return VIEW_TYPE_HEADER;
}
return VIEW_TYPE_POST_FILTER;
}
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
if (viewType == VIEW_TYPE_HEADER) {
return new HeaderViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.item_filter_fragment_header, parent, false));
} else {
return new PostFilterViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.item_post_filter, parent, false));
}
}
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
if (holder instanceof PostFilterViewHolder) {
((PostFilterViewHolder) holder).textView.setText(postFilterList.get(position - 1).name);
}
}
@Override
public int getItemCount() {
return postFilterList == null ? 1 : 1 + postFilterList.size();
}
public void setPostFilterList(List<PostFilter> postFilterList) {
this.postFilterList = postFilterList;
notifyDataSetChanged();
}
private class PostFilterViewHolder extends RecyclerView.ViewHolder {
TextView textView;
public PostFilterViewHolder(@NonNull View itemView) {
super(itemView);
textView = (TextView) itemView;
itemView.setOnClickListener(view -> {
onItemClickListener.onItemClick(postFilterList.get(getAdapterPosition() - 1));
});
}
}
private static class HeaderViewHolder extends RecyclerView.ViewHolder {
public HeaderViewHolder(@NonNull View itemView) {
super(itemView);
}
}
}

View File

@ -0,0 +1,68 @@
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 android.widget.TextView;
import androidx.annotation.NonNull;
import com.deishelon.roundedbottomsheet.RoundedBottomSheetDialogFragment;
import butterknife.BindView;
import butterknife.ButterKnife;
import ml.docilealligator.infinityforreddit.R;
import ml.docilealligator.infinityforreddit.activities.PostFilterPreferenceActivity;
import ml.docilealligator.infinityforreddit.postfilter.PostFilter;
public class PostFilterOptionsBottomSheetFragment extends RoundedBottomSheetDialogFragment {
@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;
public PostFilterOptionsBottomSheetFragment() {
// Required empty public constructor
}
@Override
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);
PostFilter postFilter = getArguments().getParcelable(EXTRA_POST_FILTER);
editTextView.setOnClickListener(view -> {
activity.editPostFilter(postFilter);
dismiss();
});
applyToTextView.setOnClickListener(view -> {
activity.applyPostFilterTo(postFilter);
dismiss();
});
deleteTextView.setOnClickListener(view -> {
activity.deletePostFilter(postFilter);
dismiss();
});
return rootView;
}
@Override
public void onAttach(@NonNull Context context) {
super.onAttach(context);
activity = (PostFilterPreferenceActivity) context;
}
}

View File

@ -168,6 +168,7 @@ public class PostFilter implements Parcelable {
} }
protected PostFilter(Parcel in) { protected PostFilter(Parcel in) {
name = in.readString();
maxVote = in.readInt(); maxVote = in.readInt();
minVote = in.readInt(); minVote = in.readInt();
maxComments = in.readInt(); maxComments = in.readInt();
@ -209,6 +210,7 @@ public class PostFilter implements Parcelable {
@Override @Override
public void writeToParcel(Parcel parcel, int i) { public void writeToParcel(Parcel parcel, int i) {
parcel.writeString(name);
parcel.writeInt(maxVote); parcel.writeInt(maxVote);
parcel.writeInt(minVote); parcel.writeInt(minVote);
parcel.writeInt(maxComments); parcel.writeInt(maxComments);

View File

@ -2,10 +2,13 @@ package ml.docilealligator.infinityforreddit.postfilter;
import androidx.lifecycle.LiveData; import androidx.lifecycle.LiveData;
import androidx.room.Dao; import androidx.room.Dao;
import androidx.room.Delete;
import androidx.room.Insert; import androidx.room.Insert;
import androidx.room.OnConflictStrategy; import androidx.room.OnConflictStrategy;
import androidx.room.Query; import androidx.room.Query;
import java.util.List;
@Dao @Dao
public interface PostFilterDao { public interface PostFilterDao {
@Insert(onConflict = OnConflictStrategy.REPLACE) @Insert(onConflict = OnConflictStrategy.REPLACE)
@ -14,9 +17,12 @@ public interface PostFilterDao {
@Query("DELETE FROM post_filter") @Query("DELETE FROM post_filter")
void deleteAllPostFilters(); void deleteAllPostFilters();
@Delete
void deletePostFilter(PostFilter postFilter);
@Query("SELECT * FROM post_filter WHERE name = :name LIMIT 1") @Query("SELECT * FROM post_filter WHERE name = :name LIMIT 1")
PostFilter getPostFilter(String name); PostFilter getPostFilter(String name);
@Query("SELECT * FROM post_filter") @Query("SELECT * FROM post_filter")
LiveData<PostFilter> getAllPostFiltersLiveData(); LiveData<List<PostFilter>> getAllPostFiltersLiveData();
} }

View File

@ -0,0 +1,36 @@
package ml.docilealligator.infinityforreddit.postfilter;
import androidx.lifecycle.LiveData;
import androidx.lifecycle.ViewModel;
import androidx.lifecycle.ViewModelProvider;
import java.util.List;
import ml.docilealligator.infinityforreddit.RedditDataRoomDatabase;
public class PostFilterViewModel extends ViewModel {
private LiveData<List<PostFilter>> mPostFilterListLiveData;
public PostFilterViewModel(RedditDataRoomDatabase redditDataRoomDatabase) {
mPostFilterListLiveData = redditDataRoomDatabase.postFilterDao().getAllPostFiltersLiveData();
}
public LiveData<List<PostFilter>> getPostFilterListLiveData() {
return mPostFilterListLiveData;
}
public static class Factory extends ViewModelProvider.NewInstanceFactory {
private final RedditDataRoomDatabase mRedditDataRoomDatabase;
public Factory(RedditDataRoomDatabase redditDataRoomDatabase) {
mRedditDataRoomDatabase = redditDataRoomDatabase;
}
@Override
public <T extends ViewModel> T create(Class<T> modelClass) {
//noinspection unchecked
return (T) new PostFilterViewModel(mRedditDataRoomDatabase);
}
}
}

View File

@ -5,23 +5,16 @@ import java.util.concurrent.Executor;
import ml.docilealligator.infinityforreddit.RedditDataRoomDatabase; import ml.docilealligator.infinityforreddit.RedditDataRoomDatabase;
public class SavePostFilter { public class SavePostFilter {
public static final int ERROR_DUPLICATE_NAME = 1;
public interface SavePostFilterListener { public interface SavePostFilterListener {
//Need to make sure it is running in the UI thread. //Need to make sure it is running in the UI thread.
void success(); void success();
void failed(int errorCode);
} }
public static void savePostFilter(RedditDataRoomDatabase redditDataRoomDatabase, Executor executor, public static void savePostFilter(RedditDataRoomDatabase redditDataRoomDatabase, Executor executor,
PostFilter postFilter, SavePostFilterListener savePostFilterListener) { PostFilter postFilter, SavePostFilterListener savePostFilterListener) {
executor.execute(() -> { executor.execute(() -> {
if (redditDataRoomDatabase.postFilterDao().getPostFilter(postFilter.name) == null) {
redditDataRoomDatabase.postFilterDao().insert(postFilter); redditDataRoomDatabase.postFilterDao().insert(postFilter);
savePostFilterListener.success(); savePostFilterListener.success();
} else {
savePostFilterListener.failed(ERROR_DUPLICATE_NAME);
}
}); });
} }
} }

View File

@ -2,6 +2,7 @@ package ml.docilealligator.infinityforreddit.settings;
import android.content.Context; import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences; import android.content.SharedPreferences;
import android.os.Bundle; import android.os.Bundle;
@ -16,6 +17,7 @@ import javax.inject.Named;
import ml.docilealligator.infinityforreddit.Infinity; import ml.docilealligator.infinityforreddit.Infinity;
import ml.docilealligator.infinityforreddit.R; import ml.docilealligator.infinityforreddit.R;
import ml.docilealligator.infinityforreddit.activities.PostFilterPreferenceActivity;
import ml.docilealligator.infinityforreddit.utils.SharedPreferencesUtils; import ml.docilealligator.infinityforreddit.utils.SharedPreferencesUtils;
import static androidx.biometric.BiometricManager.Authenticators.BIOMETRIC_STRONG; import static androidx.biometric.BiometricManager.Authenticators.BIOMETRIC_STRONG;
@ -34,6 +36,7 @@ public class MainPreferenceFragment extends PreferenceFragmentCompat {
((Infinity) activity.getApplication()).getAppComponent().inject(this); ((Infinity) activity.getApplication()).getAppComponent().inject(this);
Preference securityPreference = findPreference(SharedPreferencesUtils.SECURITY); Preference securityPreference = findPreference(SharedPreferencesUtils.SECURITY);
Preference postFilterPreference = findPreference(SharedPreferencesUtils.POST_FILTER);
BiometricManager biometricManager = BiometricManager.from(activity); BiometricManager biometricManager = BiometricManager.from(activity);
if (biometricManager.canAuthenticate(BIOMETRIC_STRONG | DEVICE_CREDENTIAL) != BiometricManager.BIOMETRIC_SUCCESS) { if (biometricManager.canAuthenticate(BIOMETRIC_STRONG | DEVICE_CREDENTIAL) != BiometricManager.BIOMETRIC_SUCCESS) {
@ -41,6 +44,14 @@ public class MainPreferenceFragment extends PreferenceFragmentCompat {
securityPreference.setVisible(false); securityPreference.setVisible(false);
} }
} }
if (postFilterPreference != null) {
postFilterPreference.setOnPreferenceClickListener(preference -> {
Intent intent = new Intent(activity, PostFilterPreferenceActivity.class);
activity.startActivity(intent);
return true;
});
}
} }
@Override @Override

View File

@ -148,6 +148,7 @@ public class SharedPreferencesUtils {
public static final String LANGUAGE = "language"; public static final String LANGUAGE = "language";
public static final String LANGUAGE_DEFAULT_VALUE = "auto"; public static final String LANGUAGE_DEFAULT_VALUE = "auto";
public static final String ENABLE_SEARCH_HISTORY = "enable_search_history"; public static final String ENABLE_SEARCH_HISTORY = "enable_search_history";
public static final String POST_FILTER = "post_filter";
public static final String MAIN_PAGE_TABS_SHARED_PREFERENCES_FILE = "ml.docilealligator.infinityforreddit.main_page_tabs"; public static final String MAIN_PAGE_TABS_SHARED_PREFERENCES_FILE = "ml.docilealligator.infinityforreddit.main_page_tabs";
public static final String MAIN_PAGE_TAB_COUNT = "_main_page_tab_count"; public static final String MAIN_PAGE_TAB_COUNT = "_main_page_tab_count";

View File

@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:pathData="M11,11h2.12l6.16,-6.16l-2.12,-2.12L11,8.88V11zM20.71,2L20,1.29c-0.39,-0.39 -1.02,-0.39 -1.41,0l-0.72,0.72l2.12,2.12l0.72,-0.72C21.1,3.02 21.1,2.39 20.71,2zM17.9,9.05C17.96,9.41 18,9.79 18,10.2c0,1.71 -1.08,4.64 -6,9.14c-4.92,-4.49 -6,-7.43 -6,-9.14C6,6.17 9.09,4 12,4c0.32,0 0.65,0.03 0.97,0.08l1.65,-1.65C13.78,2.16 12.9,2 12,2c-4.2,0 -8,3.22 -8,8.2c0,3.32 2.67,7.25 8,11.8c5.33,-4.55 8,-8.48 8,-11.8c0,-1.01 -0.16,-1.94 -0.45,-2.8L17.9,9.05z"
android:fillColor="#FFFFFF"/>
</vector>

View File

@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:pathData="M11,11h2.12l6.16,-6.16l-2.12,-2.12L11,8.88V11zM20.71,2L20,1.29c-0.39,-0.39 -1.02,-0.39 -1.41,0l-0.72,0.72l2.12,2.12l0.72,-0.72C21.1,3.02 21.1,2.39 20.71,2zM17.9,9.05C17.96,9.41 18,9.79 18,10.2c0,1.71 -1.08,4.64 -6,9.14c-4.92,-4.49 -6,-7.43 -6,-9.14C6,6.17 9.09,4 12,4c0.32,0 0.65,0.03 0.97,0.08l1.65,-1.65C13.78,2.16 12.9,2 12,2c-4.2,0 -8,3.22 -8,8.2c0,3.32 2.67,7.25 8,11.8c5.33,-4.55 8,-8.48 8,-11.8c0,-1.01 -0.16,-1.94 -0.45,-2.8L17.9,9.05z"
android:fillColor="#000000"/>
</vector>

View File

@ -43,6 +43,26 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:orientation="vertical"> android:orientation="vertical">
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/name_text_input_layout_customize_post_filter_activity"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="8dp"
android:paddingBottom="8dp"
android:paddingStart="16dp"
android:paddingEnd="16dp"
style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox">
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/name_text_input_edit_text_customize_post_filter_activity"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:fontFamily="?attr/font_family"
android:textSize="?attr/font_default"
android:hint="@string/post_filter_name_hint" />
</com.google.android.material.textfield.TextInputLayout>
<LinearLayout <LinearLayout
android:id="@+id/post_type_text_linear_layout_customize_post_filter_activity" android:id="@+id/post_type_text_linear_layout_customize_post_filter_activity"
android:layout_width="match_parent" android:layout_width="match_parent"
@ -339,7 +359,7 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:fontFamily="?attr/font_family" android:fontFamily="?attr/font_family"
android:textSize="?attr/font_default" android:textSize="?attr/font_default"
android:hint="@string/excludes_subreddits_hint" /> android:hint="@string/exclude_subreddits_hint" />
</com.google.android.material.textfield.TextInputLayout> </com.google.android.material.textfield.TextInputLayout>
@ -359,7 +379,7 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:fontFamily="?attr/font_family" android:fontFamily="?attr/font_family"
android:textSize="?attr/font_default" android:textSize="?attr/font_default"
android:hint="@string/excludes_users_hint" /> android:hint="@string/exclude_users_hint" />
</com.google.android.material.textfield.TextInputLayout> </com.google.android.material.textfield.TextInputLayout>
@ -379,7 +399,7 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:fontFamily="?attr/font_family" android:fontFamily="?attr/font_family"
android:textSize="?attr/font_default" android:textSize="?attr/font_default"
android:hint="@string/excludes_flairs_hint" /> android:hint="@string/exclude_flairs_hint" />
</com.google.android.material.textfield.TextInputLayout> </com.google.android.material.textfield.TextInputLayout>
@ -399,7 +419,7 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:fontFamily="?attr/font_family" android:fontFamily="?attr/font_family"
android:textSize="?attr/font_default" android:textSize="?attr/font_default"
android:hint="@string/contains_flairs_hint" /> android:hint="@string/contain_flairs_hint" />
</com.google.android.material.textfield.TextInputLayout> </com.google.android.material.textfield.TextInputLayout>

View File

@ -0,0 +1,53 @@
<?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"
android:id="@+id/coordinator_layout_post_filter_preference_activity"
tools:context=".activities.PostFilterPreferenceActivity">
<com.google.android.material.appbar.AppBarLayout
android:id="@+id/appbar_layout_post_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_post_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_post_filter_preference_activity">
<androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar_post_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_post_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_post_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,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_post_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_post_filter_options_bottom_sheet_fragment"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/apply_post_filter_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_post_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

@ -4,8 +4,7 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical" tools:context=".settings.PostHistoryFragment">
tools:context=".settings.NsfwAndBlurringFragment">
<LinearLayout <LinearLayout
android:layout_width="match_parent" android:layout_width="match_parent"

View File

@ -0,0 +1,25 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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:orientation="vertical">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="16dp"
android:drawablePadding="32dp"
android:text="@string/restart_app_see_changes"
android:textColor="@color/settingsSubtitleColor"
android:gravity="center_vertical"
android:textSize="?attr/font_default"
android:fontFamily="?attr/font_family"
app:drawableStartCompat="@drawable/ic_info_preference_24dp" />
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="@color/dividerColor" />
</LinearLayout>

View File

@ -0,0 +1,14 @@
<?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="16dp"
android:paddingBottom="16dp"
android:paddingStart="72dp"
android:paddingEnd="16dp"
android:textColor="?attr/primaryTextColor"
android:textSize="?attr/font_16"
android:fontFamily="?attr/font_family"
android:clickable="true"
android:focusable="true"
android:background="?attr/selectableItemBackground" />

View File

@ -892,7 +892,7 @@ Reiter könnten den Inhalt verlieren, wenn zu anderen gewechselt wird. Selbes Ve
<string name="settings_miscellaneous_title">"Sonstiges"</string> <string name="settings_miscellaneous_title">"Sonstiges"</string>
<string name="settings_respect_subreddit_recommended_comment_sort_type_title">"Vom Subreddit vorgeschlagenen Kommentar Sortier-Typ respektieren"</string> <string name="settings_respect_subreddit_recommended_comment_sort_type_title">"Vom Subreddit vorgeschlagenen Kommentar Sortier-Typ respektieren"</string>
<string name="settings_respect_subreddit_recommended_comment_sort_type_summary">"Kommentar Sortier-Typ wird nicht gespeichert"</string> <string name="settings_respect_subreddit_recommended_comment_sort_type_summary">"Kommentar Sortier-Typ wird nicht gespeichert"</string>
<string name="settings_filter_title">"Filter"</string> <string name="settings_post_filter_title">"Filter"</string>
<string name="settings_subreddit_filter_category">"Verstecke Subreddits"</string> <string name="settings_subreddit_filter_category">"Verstecke Subreddits"</string>
<string name="settings_subreddit_filter_popular_and_all">"In r/popular und r/all"</string> <string name="settings_subreddit_filter_popular_and_all">"In r/popular und r/all"</string>
<string name="settings_credits_ufo_capturing_animation_title">"UFO-Aufnahmeanimation"</string> <string name="settings_credits_ufo_capturing_animation_title">"UFO-Aufnahmeanimation"</string>

View File

@ -872,6 +872,6 @@ Videos de Reddit están en menor resolución"</string>
<string name="downloading">"Descargando"</string> <string name="downloading">"Descargando"</string>
<string name="subreddit_filter_popular_and_all_activity_label">"r/all y r/popular"</string> <string name="subreddit_filter_popular_and_all_activity_label">"r/all y r/popular"</string>
<string name="settings_miscellaneous_title">"Misceláneo"</string> <string name="settings_miscellaneous_title">"Misceláneo"</string>
<string name="settings_filter_title">"Filtrar"</string> <string name="settings_post_filter_title">"Filtrar"</string>
<string name="select_video_quality">"Seleccione calidad del video"</string> <string name="select_video_quality">"Seleccione calidad del video"</string>
</resources> </resources>

View File

@ -930,7 +930,7 @@ Les onglets pourraient perdre tout leur contenu quand vous passez d'un onglet à
<string name="settings_miscellaneous_title">"Divers"</string> <string name="settings_miscellaneous_title">"Divers"</string>
<string name="settings_respect_subreddit_recommended_comment_sort_type_title">"Respecter l'ordre de tri recommandé par le subreddit pour les commentaires "</string> <string name="settings_respect_subreddit_recommended_comment_sort_type_title">"Respecter l'ordre de tri recommandé par le subreddit pour les commentaires "</string>
<string name="settings_respect_subreddit_recommended_comment_sort_type_summary">"L'ordre de tri des commentaires ne sera pas sauvegardé "</string> <string name="settings_respect_subreddit_recommended_comment_sort_type_summary">"L'ordre de tri des commentaires ne sera pas sauvegardé "</string>
<string name="settings_filter_title">"Filtre"</string> <string name="settings_post_filter_title">"Filtre"</string>
<string name="settings_subreddit_filter_category">"Cacher des Subreddits"</string> <string name="settings_subreddit_filter_category">"Cacher des Subreddits"</string>
<string name="settings_subreddit_filter_popular_and_all">"Dans r/popular et r/all"</string> <string name="settings_subreddit_filter_popular_and_all">"Dans r/popular et r/all"</string>
<string name="settings_credits_ufo_capturing_animation_title">"Animation de capture de l'OVNI"</string> <string name="settings_credits_ufo_capturing_animation_title">"Animation de capture de l'OVNI"</string>

View File

@ -918,7 +918,7 @@ https://play.google.com/store/apps/details?id=ml.docilealligator.infinityforredd
<string name="settings_miscellaneous_title">"विविध "</string> <string name="settings_miscellaneous_title">"विविध "</string>
<string name="settings_respect_subreddit_recommended_comment_sort_type_title">"सबरैडिट द्वारा संस्तुतित टिप्पणी क्रम प्रकार बनाए रखें "</string> <string name="settings_respect_subreddit_recommended_comment_sort_type_title">"सबरैडिट द्वारा संस्तुतित टिप्पणी क्रम प्रकार बनाए रखें "</string>
<string name="settings_respect_subreddit_recommended_comment_sort_type_summary">"टिप्पणी क्रम प्रकार सरंक्षित नहीं किया जाएगा "</string> <string name="settings_respect_subreddit_recommended_comment_sort_type_summary">"टिप्पणी क्रम प्रकार सरंक्षित नहीं किया जाएगा "</string>
<string name="settings_filter_title">"छंटनी "</string> <string name="settings_post_filter_title">"छंटनी "</string>
<string name="settings_subreddit_filter_category">"सबरैडिट छुपाएं "</string> <string name="settings_subreddit_filter_category">"सबरैडिट छुपाएं "</string>
<string name="settings_subreddit_filter_popular_and_all">"r/popular एवं r/all में "</string> <string name="settings_subreddit_filter_popular_and_all">"r/popular एवं r/all में "</string>
<string name="settings_credits_ufo_capturing_animation_title">"UFO बंदी बनाते हुए एनिमेशन "</string> <string name="settings_credits_ufo_capturing_animation_title">"UFO बंदी बनाते हुए एनिमेशन "</string>

View File

@ -880,7 +880,7 @@ Poruka: %2$s"</string>
<string name="settings_miscellaneous_title">"Razno"</string> <string name="settings_miscellaneous_title">"Razno"</string>
<string name="settings_respect_subreddit_recommended_comment_sort_type_title">"Poštuj tip sortiranja komentara preporučen na podredditu"</string> <string name="settings_respect_subreddit_recommended_comment_sort_type_title">"Poštuj tip sortiranja komentara preporučen na podredditu"</string>
<string name="settings_respect_subreddit_recommended_comment_sort_type_summary">"Tip sortiranja komentara neće biti spremljen"</string> <string name="settings_respect_subreddit_recommended_comment_sort_type_summary">"Tip sortiranja komentara neće biti spremljen"</string>
<string name="settings_filter_title">"Filter"</string> <string name="settings_post_filter_title">"Filter"</string>
<string name="settings_subreddit_filter_category">"Sakrij podreddite"</string> <string name="settings_subreddit_filter_category">"Sakrij podreddite"</string>
<string name="settings_subreddit_filter_popular_and_all">"U r/popular i r/all"</string> <string name="settings_subreddit_filter_popular_and_all">"U r/popular i r/all"</string>
<string name="settings_credits_ufo_capturing_animation_title">"UFO Capturing Animation"</string> <string name="settings_credits_ufo_capturing_animation_title">"UFO Capturing Animation"</string>

View File

@ -935,7 +935,7 @@ I video di Reddit sono in minore risoluzione."</string>
<!-- Fuzzy --> <!-- Fuzzy -->
<string name="settings_respect_subreddit_recommended_comment_sort_type_summary">"Il tipo di ordinamento dei commenti non verrà salvato"</string> <string name="settings_respect_subreddit_recommended_comment_sort_type_summary">"Il tipo di ordinamento dei commenti non verrà salvato"</string>
<string name="settings_filter_title">"Filtro"</string> <string name="settings_post_filter_title">"Filtro"</string>
<!-- Fuzzy --> <!-- Fuzzy -->
<string name="settings_subreddit_filter_category">"Nascondi i Subreddit"</string> <string name="settings_subreddit_filter_category">"Nascondi i Subreddit"</string>

View File

@ -926,7 +926,7 @@ https://play.google.com/store/apps/details?id=ml.docilealligator.infinityforredd
<string name="settings_miscellaneous_title">"その他の設定"</string> <string name="settings_miscellaneous_title">"その他の設定"</string>
<string name="settings_respect_subreddit_recommended_comment_sort_type_title">"Subredditで推奨されているコメントの並び順を使用"</string> <string name="settings_respect_subreddit_recommended_comment_sort_type_title">"Subredditで推奨されているコメントの並び順を使用"</string>
<string name="settings_respect_subreddit_recommended_comment_sort_type_summary">"コメントの並び順は保存されません"</string> <string name="settings_respect_subreddit_recommended_comment_sort_type_summary">"コメントの並び順は保存されません"</string>
<string name="settings_filter_title">"フィルター"</string> <string name="settings_post_filter_title">"フィルター"</string>
<string name="settings_subreddit_filter_category">"Subredditを非表示"</string> <string name="settings_subreddit_filter_category">"Subredditを非表示"</string>
<string name="settings_subreddit_filter_popular_and_all">"r/all と r/popular 内"</string> <string name="settings_subreddit_filter_popular_and_all">"r/all と r/popular 内"</string>
<string name="settings_credits_ufo_capturing_animation_title">"UFO捕獲アニメーション"</string> <string name="settings_credits_ufo_capturing_animation_title">"UFO捕獲アニメーション"</string>

View File

@ -849,7 +849,7 @@ Os vídeos do Reddit ficam em menor resolução."</string>
<string name="settings_miscellaneous_title">"Miscelãnea"</string> <string name="settings_miscellaneous_title">"Miscelãnea"</string>
<string name="settings_respect_subreddit_recommended_comment_sort_type_title">"Respeitar modo de classificação de comentário recomendado pelo subreddit"</string> <string name="settings_respect_subreddit_recommended_comment_sort_type_title">"Respeitar modo de classificação de comentário recomendado pelo subreddit"</string>
<string name="settings_respect_subreddit_recommended_comment_sort_type_summary">"Modo de classificação de comentário não será salvo"</string> <string name="settings_respect_subreddit_recommended_comment_sort_type_summary">"Modo de classificação de comentário não será salvo"</string>
<string name="settings_filter_title">"Filtrar"</string> <string name="settings_post_filter_title">"Filtrar"</string>
<string name="settings_subreddit_filter_category">"Ocultar subreddits"</string> <string name="settings_subreddit_filter_category">"Ocultar subreddits"</string>
<string name="settings_subreddit_filter_popular_and_all">"Em r/popular e r/all"</string> <string name="settings_subreddit_filter_popular_and_all">"Em r/popular e r/all"</string>
<string name="settings_credits_ufo_capturing_animation_title">"Animação de captura de OVNIs"</string> <string name="settings_credits_ufo_capturing_animation_title">"Animação de captura de OVNIs"</string>

View File

@ -863,7 +863,7 @@ Sekmeler, başkalarına geçtikten sonra tüm içeriği kaybedebilir. Bu, sayfay
<string name="settings_miscellaneous_title">"Diğerleri"</string> <string name="settings_miscellaneous_title">"Diğerleri"</string>
<string name="settings_respect_subreddit_recommended_comment_sort_type_title">"İlgili Subreddit Önerilen Yorum Sıralaması Türü"</string> <string name="settings_respect_subreddit_recommended_comment_sort_type_title">"İlgili Subreddit Önerilen Yorum Sıralaması Türü"</string>
<string name="settings_respect_subreddit_recommended_comment_sort_type_summary">"Yorum sıralaması türü kaydedilemedi"</string> <string name="settings_respect_subreddit_recommended_comment_sort_type_summary">"Yorum sıralaması türü kaydedilemedi"</string>
<string name="settings_filter_title">"Filtrele"</string> <string name="settings_post_filter_title">"Filtrele"</string>
<string name="settings_subreddit_filter_category">"Subredditleri Gizle"</string> <string name="settings_subreddit_filter_category">"Subredditleri Gizle"</string>
<string name="settings_subreddit_filter_popular_and_all">"r/popular ve r/all"</string> <string name="settings_subreddit_filter_popular_and_all">"r/popular ve r/all"</string>
<string name="settings_credits_ufo_capturing_animation_title">"UFO Yakalama Animasyonu"</string> <string name="settings_credits_ufo_capturing_animation_title">"UFO Yakalama Animasyonu"</string>

View File

@ -913,7 +913,7 @@ https://play.google.com/store/apps/details?id=ml.docilealligator.infinityforredd
<string name="settings_miscellaneous_title">"其他"</string> <string name="settings_miscellaneous_title">"其他"</string>
<string name="settings_respect_subreddit_recommended_comment_sort_type_title">"关于板块推荐评论排序类型"</string> <string name="settings_respect_subreddit_recommended_comment_sort_type_title">"关于板块推荐评论排序类型"</string>
<string name="settings_respect_subreddit_recommended_comment_sort_type_summary">"评论排序类型将不会保存"</string> <string name="settings_respect_subreddit_recommended_comment_sort_type_summary">"评论排序类型将不会保存"</string>
<string name="settings_filter_title">"过滤器"</string> <string name="settings_post_filter_title">"过滤器"</string>
<string name="settings_subreddit_filter_category">"隐藏版块"</string> <string name="settings_subreddit_filter_category">"隐藏版块"</string>
<string name="settings_subreddit_filter_popular_and_all">"在“r/all”和“r/popular”板块中"</string> <string name="settings_subreddit_filter_popular_and_all">"在“r/all”和“r/popular”板块中"</string>
<string name="settings_credits_ufo_capturing_animation_title">"开屏UFO动画"</string> <string name="settings_credits_ufo_capturing_animation_title">"开屏UFO动画"</string>

View File

@ -34,8 +34,9 @@
<string name="submit_crosspost_activity_label">Crosspost</string> <string name="submit_crosspost_activity_label">Crosspost</string>
<string name="give_award_activity_label">Give Award</string> <string name="give_award_activity_label">Give Award</string>
<string name="subreddit_filter_popular_and_all_activity_label">r/all and r/popular</string> <string name="subreddit_filter_popular_and_all_activity_label">r/all and r/popular</string>
<string name="customize_post_filter_activity_label">Post Filter</string> <string name="customize_post_filter_activity_label">Customize Post Filter</string>
<string name="filtered_posts_activity_subtitle">Filtered Posts</string> <string name="filtered_posts_activity_subtitle">Filtered Posts</string>
<string name="post_filter_preference_activity_label">Post Filter</string>
<string name="navigation_drawer_open">Open navigation drawer</string> <string name="navigation_drawer_open">Open navigation drawer</string>
<string name="navigation_drawer_close">Close navigation drawer</string> <string name="navigation_drawer_close">Close navigation drawer</string>
@ -504,7 +505,7 @@
<string name="settings_miscellaneous_title">Miscellaneous</string> <string name="settings_miscellaneous_title">Miscellaneous</string>
<string name="settings_respect_subreddit_recommended_comment_sort_type_title">Respect Subreddit Recommended Comment Sort Type</string> <string name="settings_respect_subreddit_recommended_comment_sort_type_title">Respect Subreddit Recommended Comment Sort Type</string>
<string name="settings_respect_subreddit_recommended_comment_sort_type_summary">Comment sort type will not be saved</string> <string name="settings_respect_subreddit_recommended_comment_sort_type_summary">Comment sort type will not be saved</string>
<string name="settings_filter_title">Filter</string> <string name="settings_post_filter_title">Post Filter</string>
<string name="settings_subreddit_filter_category">Hide Subreddits</string> <string name="settings_subreddit_filter_category">Hide Subreddits</string>
<string name="settings_subreddit_filter_popular_and_all">In r/popular and r/all</string> <string name="settings_subreddit_filter_popular_and_all">In r/popular and r/all</string>
<string name="settings_credits_ufo_capturing_animation_title">UFO Capturing Animation</string> <string name="settings_credits_ufo_capturing_animation_title">UFO Capturing Animation</string>
@ -965,18 +966,18 @@
<string name="only_spoiler">Only Spoiler</string> <string name="only_spoiler">Only Spoiler</string>
<string name="title_excludes_strings_hint">Title: excludes keywords</string> <string name="title_excludes_strings_hint">Title: excludes keywords</string>
<string name="title_excludes_regex_hint">Title: excludes regex</string> <string name="title_excludes_regex_hint">Title: excludes regex</string>
<string name="excludes_subreddits_hint">Excludes subreddits</string> <string name="exclude_subreddits_hint">Exclude subreddits</string>
<string name="excludes_users_hint">Excludes users</string> <string name="exclude_users_hint">Exclude users</string>
<string name="excludes_flairs_hint">Exclude flairs</string> <string name="exclude_flairs_hint">Exclude flairs</string>
<string name="contains_flairs_hint">Contains flairs</string> <string name="contain_flairs_hint">Contain flairs</string>
<string name="min_vote_hint">Min vote</string> <string name="min_vote_hint">Min vote (-1: no restriction)</string>
<string name="max_vote_hint">Max vote</string> <string name="max_vote_hint">Max vote (-1: no restriction)</string>
<string name="min_comments_hint">Min comments</string> <string name="min_comments_hint">Min comments (-1: no restriction)</string>
<string name="max_comments_hint">Max comments</string> <string name="max_comments_hint">Max comments (-1: no restriction)</string>
<string name="min_awards_hint">Min awards</string> <string name="min_awards_hint">Min awards (-1: no restriction)</string>
<string name="max_awards_hint">Max awards</string> <string name="max_awards_hint">Max awards (-1: no restriction)</string>
<string name="post_filter_name_hint">Post Filter Name</string> <string name="post_filter_name_hint">Post Filter Name</string>
<string name="duplicate_post_filter">Duplicate post filter found. Please use another name.</string> <string name="post_filter_requires_a_name">What is the name of this post filter?</string>
<string name="apply_post_filter_to">Apply to</string>
</resources> </resources>

View File

@ -63,9 +63,9 @@
app:fragment="ml.docilealligator.infinityforreddit.settings.PostHistoryFragment" /> app:fragment="ml.docilealligator.infinityforreddit.settings.PostHistoryFragment" />
<Preference <Preference
app:key="post_filter"
app:icon="@drawable/ic_filter_24dp" app:icon="@drawable/ic_filter_24dp"
app:title="@string/settings_filter_title" app:title="@string/settings_post_filter_title" />
app:fragment="ml.docilealligator.infinityforreddit.settings.FilterPreferenceFragment"/>
<Preference <Preference
app:icon="@drawable/ic_miscellaneous_24dp" app:icon="@drawable/ic_miscellaneous_24dp"