Sorting users posts in ViewUserDetailActivity and FilteredPostsActivity is available.

This commit is contained in:
Alex Ning 2019-08-14 16:31:18 +08:00
parent 7cdf5d2e4c
commit 0a3d6520bc
10 changed files with 215 additions and 36 deletions

Binary file not shown.

View File

@ -24,13 +24,14 @@ import butterknife.BindView;
import butterknife.ButterKnife; import butterknife.ButterKnife;
public class FilteredPostsActivity extends AppCompatActivity implements SortTypeBottomSheetFragment.SortTypeSelectionCallback, public class FilteredPostsActivity extends AppCompatActivity implements SortTypeBottomSheetFragment.SortTypeSelectionCallback,
SearchPostSortTypeBottomSheetFragment.SearchSortTypeSelectionCallback { SearchPostSortTypeBottomSheetFragment.SearchSortTypeSelectionCallback, UserThingSortTypeBottomSheetFragment.UserPostsSortTypeSelectionCallback {
static final String EXTRA_NAME = "ESN"; static final String EXTRA_NAME = "ESN";
static final String EXTRA_QUERY = "EQ"; static final String EXTRA_QUERY = "EQ";
static final String EXTRA_FILTER = "EF"; static final String EXTRA_FILTER = "EF";
static final String EXTRA_POST_TYPE = "EPT"; static final String EXTRA_POST_TYPE = "EPT";
static final String EXTRA_SORT_TYPE = "EST"; static final String EXTRA_SORT_TYPE = "EST";
static final String EXTRA_USER_WHERE = "EUW";
private static final String NULL_ACCESS_TOKEN_STATE = "NATS"; private static final String NULL_ACCESS_TOKEN_STATE = "NATS";
private static final String ACCESS_TOKEN_STATE = "ATS"; private static final String ACCESS_TOKEN_STATE = "ATS";
@ -49,6 +50,7 @@ public class FilteredPostsActivity extends AppCompatActivity implements SortType
private SortTypeBottomSheetFragment bestSortTypeBottomSheetFragment; private SortTypeBottomSheetFragment bestSortTypeBottomSheetFragment;
private SortTypeBottomSheetFragment popularAndAllSortTypeBottomSheetFragment; private SortTypeBottomSheetFragment popularAndAllSortTypeBottomSheetFragment;
private SortTypeBottomSheetFragment subredditSortTypeBottomSheetFragment; private SortTypeBottomSheetFragment subredditSortTypeBottomSheetFragment;
private UserThingSortTypeBottomSheetFragment userThingSortTypeBottomSheetFragment;
private SearchPostSortTypeBottomSheetFragment searchPostSortTypeBottomSheetFragment; private SearchPostSortTypeBottomSheetFragment searchPostSortTypeBottomSheetFragment;
@Inject @Inject
@ -176,6 +178,8 @@ public class FilteredPostsActivity extends AppCompatActivity implements SortType
case PostDataSource.TYPE_USER: case PostDataSource.TYPE_USER:
String usernamePrefixed = "u/" + name; String usernamePrefixed = "u/" + name;
getSupportActionBar().setTitle(usernamePrefixed); getSupportActionBar().setTitle(usernamePrefixed);
userThingSortTypeBottomSheetFragment = new UserThingSortTypeBottomSheetFragment();
break; break;
} }
@ -205,6 +209,9 @@ public class FilteredPostsActivity extends AppCompatActivity implements SortType
bundle.putString(PostFragment.EXTRA_SORT_TYPE, sortType); bundle.putString(PostFragment.EXTRA_SORT_TYPE, sortType);
bundle.putInt(PostFragment.EXTRA_FILTER, filter); bundle.putInt(PostFragment.EXTRA_FILTER, filter);
bundle.putString(PostFragment.EXTRA_ACCESS_TOKEN, mAccessToken); bundle.putString(PostFragment.EXTRA_ACCESS_TOKEN, mAccessToken);
if(postType == PostDataSource.TYPE_USER) {
bundle.putString(PostFragment.EXTRA_USER_WHERE, getIntent().getExtras().getString(EXTRA_USER_WHERE));
}
if(postType == PostDataSource.TYPE_SEARCH) { if(postType == PostDataSource.TYPE_SEARCH) {
bundle.putString(PostFragment.EXTRA_QUERY, getIntent().getExtras().getString(EXTRA_QUERY)); bundle.putString(PostFragment.EXTRA_QUERY, getIntent().getExtras().getString(EXTRA_QUERY));
} }
@ -216,9 +223,6 @@ public class FilteredPostsActivity extends AppCompatActivity implements SortType
@Override @Override
public boolean onCreateOptionsMenu(Menu menu) { public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.filtered_posts_activity, menu); getMenuInflater().inflate(R.menu.filtered_posts_activity, menu);
if(postType == PostDataSource.TYPE_USER) {
menu.findItem(R.id.action_sort_filtered_posts_activity).setVisible(false);
}
return true; return true;
} }
@ -242,6 +246,9 @@ public class FilteredPostsActivity extends AppCompatActivity implements SortType
} else { } else {
subredditSortTypeBottomSheetFragment.show(getSupportFragmentManager(), subredditSortTypeBottomSheetFragment.getTag()); subredditSortTypeBottomSheetFragment.show(getSupportFragmentManager(), subredditSortTypeBottomSheetFragment.getTag());
} }
break;
case PostDataSource.TYPE_USER:
userThingSortTypeBottomSheetFragment.show(getSupportFragmentManager(), userThingSortTypeBottomSheetFragment.getTag());
} }
return true; return true;
case R.id.action_refresh_filtered_posts_activity: case R.id.action_refresh_filtered_posts_activity:
@ -270,4 +277,9 @@ public class FilteredPostsActivity extends AppCompatActivity implements SortType
public void sortTypeSelected(String sortType) { public void sortTypeSelected(String sortType) {
((PostFragment)mFragment).changeSortType(sortType); ((PostFragment)mFragment).changeSortType(sortType);
} }
@Override
public void userThingSortTypeSelected(String sortType) {
((PostFragment)mFragment).changeSortType(sortType);
}
} }

View File

@ -98,10 +98,6 @@ class PostDataSourceFactory extends DataSource.Factory {
return postDataSource; return postDataSource;
} }
void changeAccessToken(String accessToken) {
this.accessToken = accessToken;
}
void changeSortType(String sortType) { void changeSortType(String sortType) {
this.sortType = sortType; this.sortType = sortType;
} }

View File

@ -272,6 +272,7 @@ public class PostFragment extends Fragment implements FragmentCommunicator {
intent.putExtra(FilteredPostsActivity.EXTRA_NAME, username); intent.putExtra(FilteredPostsActivity.EXTRA_NAME, username);
intent.putExtra(FilteredPostsActivity.EXTRA_POST_TYPE, postType); intent.putExtra(FilteredPostsActivity.EXTRA_POST_TYPE, postType);
intent.putExtra(FilteredPostsActivity.EXTRA_SORT_TYPE, sortType); intent.putExtra(FilteredPostsActivity.EXTRA_SORT_TYPE, sortType);
intent.putExtra(FilteredPostsActivity.EXTRA_USER_WHERE, where);
intent.putExtra(FilteredPostsActivity.EXTRA_FILTER, filter); intent.putExtra(FilteredPostsActivity.EXTRA_FILTER, filter);
startActivity(intent); startActivity(intent);
} }

View File

@ -100,6 +100,10 @@ public class PostViewModel extends ViewModel {
accessTokenLiveData = new MutableLiveData<>(); accessTokenLiveData = new MutableLiveData<>();
accessTokenLiveData.postValue(accessToken); accessTokenLiveData.postValue(accessToken);
sortTypeLiveData = new MutableLiveData<>();
sortTypeLiveData.postValue(sortType);
accessTokenAndSortTypeLiveData = new AccessTokenAndSortTypeLiveData(accessTokenLiveData, sortTypeLiveData);
PagedList.Config pagedListConfig = PagedList.Config pagedListConfig =
(new PagedList.Config.Builder()) (new PagedList.Config.Builder())
@ -107,10 +111,8 @@ public class PostViewModel extends ViewModel {
.setPageSize(25) .setPageSize(25)
.build(); .build();
posts = (new LivePagedListBuilder(postDataSourceFactory, pagedListConfig)).build(); posts = Transformations.switchMap(accessTokenAndSortTypeLiveData, sort -> {
postDataSourceFactory.changeAccessTokenAndSortType(accessTokenLiveData.getValue(), sortTypeLiveData.getValue());
posts = Transformations.switchMap(accessTokenLiveData, newAccessToken -> {
postDataSourceFactory.changeAccessToken(accessTokenLiveData.getValue());
return (new LivePagedListBuilder(postDataSourceFactory, pagedListConfig)).build(); return (new LivePagedListBuilder(postDataSourceFactory, pagedListConfig)).build();
}); });
} }

View File

@ -0,0 +1,88 @@
package ml.docilealligator.infinityforreddit;
import android.app.Activity;
import android.content.res.Configuration;
import android.os.Build;
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 androidx.fragment.app.Fragment;
import com.deishelon.roundedbottomsheet.RoundedBottomSheetDialogFragment;
import butterknife.BindView;
import butterknife.ButterKnife;
/**
* A simple {@link Fragment} subclass.
*/
public class UserThingSortTypeBottomSheetFragment extends RoundedBottomSheetDialogFragment {
interface UserPostsSortTypeSelectionCallback {
void userThingSortTypeSelected(String sortType);
}
static final String EXTRA_NO_BEST_TYPE = "ENBT";
@BindView(R.id.new_type_text_view_user_thing_sort_type_bottom_sheet_fragment) TextView newTypeTextView;
@BindView(R.id.hot_type_text_view_user_thing_sort_type_bottom_sheet_fragment) TextView hotTypeTextView;
@BindView(R.id.top_type_text_view_user_thing_sort_type_bottom_sheet_fragment) TextView topTypeTextView;
@BindView(R.id.controversial_type_text_view_user_thing_sort_type_bottom_sheet_fragment) TextView controversialTypeTextView;
public UserThingSortTypeBottomSheetFragment() {
// Required empty public constructor
}
@Override
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_user_thing_sort_type_bottom_sheet, container, false);
ButterKnife.bind(this, rootView);
Activity activity = getActivity();
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O
&& (getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK) != Configuration.UI_MODE_NIGHT_YES) {
rootView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR);
}
newTypeTextView.setOnClickListener(view -> {
if(activity != null) {
((UserPostsSortTypeSelectionCallback) activity).userThingSortTypeSelected(PostDataSource.SORT_TYPE_NEW);
}
dismiss();
});
hotTypeTextView.setOnClickListener(view -> {
if(activity != null) {
((UserPostsSortTypeSelectionCallback) activity).userThingSortTypeSelected(PostDataSource.SORT_TYPE_HOT);
}
dismiss();
});
topTypeTextView.setOnClickListener(view -> {
if(activity != null) {
((UserPostsSortTypeSelectionCallback) activity).userThingSortTypeSelected(PostDataSource.SORT_TYPE_TOP);
}
dismiss();
});
controversialTypeTextView.setOnClickListener(view -> {
if(activity != null) {
((UserPostsSortTypeSelectionCallback) activity).userThingSortTypeSelected(PostDataSource.SORT_TYPE_CONTROVERSIAL);
}
dismiss();
});
return rootView;
}
}

View File

@ -48,7 +48,7 @@ import jp.wasabeef.glide.transformations.RoundedCornersTransformation;
import pl.droidsonroids.gif.GifImageView; import pl.droidsonroids.gif.GifImageView;
import retrofit2.Retrofit; import retrofit2.Retrofit;
public class ViewUserDetailActivity extends AppCompatActivity { public class ViewUserDetailActivity extends AppCompatActivity implements UserThingSortTypeBottomSheetFragment.UserPostsSortTypeSelectionCallback {
public static final String EXTRA_USER_NAME_KEY = "EUNK"; public static final String EXTRA_USER_NAME_KEY = "EUNK";
@ -58,26 +58,16 @@ public class ViewUserDetailActivity extends AppCompatActivity {
private static final String ACCOUNT_NAME_STATE = "ANS"; private static final String ACCOUNT_NAME_STATE = "ANS";
private static final String IS_IN_LAZY_MODE_STATE = "IILMS"; private static final String IS_IN_LAZY_MODE_STATE = "IILMS";
@BindView(R.id.coordinator_layout_view_user_detail_activity) @BindView(R.id.coordinator_layout_view_user_detail_activity) CoordinatorLayout coordinatorLayout;
CoordinatorLayout coordinatorLayout; @BindView(R.id.view_pager_view_user_detail_activity) ViewPager viewPager;
@BindView(R.id.view_pager_view_user_detail_activity) @BindView(R.id.appbar_layout_view_user_detail) AppBarLayout appBarLayout;
ViewPager viewPager; @BindView(R.id.tab_layout_view_user_detail_activity) TabLayout tabLayout;
@BindView(R.id.appbar_layout_view_user_detail) @BindView(R.id.collapsing_toolbar_layout_view_user_detail_activity) CollapsingToolbarLayout collapsingToolbarLayout;
AppBarLayout appBarLayout; @BindView(R.id.banner_image_view_view_user_detail_activity) GifImageView bannerImageView;
@BindView(R.id.tab_layout_view_user_detail_activity) @BindView(R.id.icon_gif_image_view_view_user_detail_activity) GifImageView iconGifImageView;
TabLayout tabLayout; @BindView(R.id.user_name_text_view_view_user_detail_activity) TextView userNameTextView;
@BindView(R.id.collapsing_toolbar_layout_view_user_detail_activity) @BindView(R.id.subscribe_user_chip_view_user_detail_activity) Chip subscribeUserChip;
CollapsingToolbarLayout collapsingToolbarLayout; @BindView(R.id.karma_text_view_view_user_detail_activity) TextView karmaTextView;
@BindView(R.id.banner_image_view_view_user_detail_activity)
GifImageView bannerImageView;
@BindView(R.id.icon_gif_image_view_view_user_detail_activity)
GifImageView iconGifImageView;
@BindView(R.id.user_name_text_view_view_user_detail_activity)
TextView userNameTextView;
@BindView(R.id.subscribe_user_chip_view_user_detail_activity)
Chip subscribeUserChip;
@BindView(R.id.karma_text_view_view_user_detail_activity)
TextView karmaTextView;
private SectionsPagerAdapter sectionsPagerAdapter; private SectionsPagerAdapter sectionsPagerAdapter;
@ -87,6 +77,8 @@ public class ViewUserDetailActivity extends AppCompatActivity {
private Menu mMenu; private Menu mMenu;
private AppBarLayout.LayoutParams params; private AppBarLayout.LayoutParams params;
private UserThingSortTypeBottomSheetFragment userThingSortTypeBottomSheetFragment;
private boolean mNullAccessToken = false; private boolean mNullAccessToken = false;
private String mAccessToken; private String mAccessToken;
private String mAccountName; private String mAccountName;
@ -347,6 +339,8 @@ public class ViewUserDetailActivity extends AppCompatActivity {
karmaTextView.setText(karma); karmaTextView.setText(karma);
} }
}); });
userThingSortTypeBottomSheetFragment = new UserThingSortTypeBottomSheetFragment();
} }
private void getCurrentAccountAndInitializeViewPager() { private void getCurrentAccountAndInitializeViewPager() {
@ -431,6 +425,9 @@ public class ViewUserDetailActivity extends AppCompatActivity {
case android.R.id.home: case android.R.id.home:
finish(); finish();
return true; return true;
case R.id.action_sort_view_user_detail_activity:
userThingSortTypeBottomSheetFragment.show(getSupportFragmentManager(), userThingSortTypeBottomSheetFragment.getTag());
return true;
case R.id.action_search_view_user_detail_activity: case R.id.action_search_view_user_detail_activity:
Intent intent = new Intent(this, SearchActivity.class); Intent intent = new Intent(this, SearchActivity.class);
intent.putExtra(SearchActivity.EXTRA_SUBREDDIT_NAME, username); intent.putExtra(SearchActivity.EXTRA_SUBREDDIT_NAME, username);
@ -486,6 +483,11 @@ public class ViewUserDetailActivity extends AppCompatActivity {
} }
} }
@Override
public void userThingSortTypeSelected(String sortType) {
sectionsPagerAdapter.changeSortType(sortType);
}
private static class InsertUserDataAsyncTask extends AsyncTask<Void, Void, Void> { private static class InsertUserDataAsyncTask extends AsyncTask<Void, Void, Void> {
interface InsertUserDataAsyncTaskListener { interface InsertUserDataAsyncTaskListener {
@ -590,5 +592,11 @@ public class ViewUserDetailActivity extends AppCompatActivity {
commentsListingFragment.refresh(); commentsListingFragment.refresh();
} }
} }
public void changeSortType(String sortType) {
if(postFragment != null) {
postFragment.changeSortType(sortType);
}
}
} }
} }

View File

@ -0,0 +1,63 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="8dp">
<TextView
android:id="@+id/new_type_text_view_user_thing_sort_type_bottom_sheet_fragment"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/sort_new"
android:textColor="@color/primaryTextColor"
android:paddingTop="16dp"
android:paddingBottom="16dp"
android:paddingStart="32dp"
android:paddingEnd="32dp"
android:clickable="true"
android:focusable="true"
android:background="?attr/selectableItemBackground" />
<TextView
android:id="@+id/hot_type_text_view_user_thing_sort_type_bottom_sheet_fragment"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/sort_hot"
android:textColor="@color/primaryTextColor"
android:paddingTop="16dp"
android:paddingBottom="16dp"
android:paddingStart="32dp"
android:paddingEnd="32dp"
android:clickable="true"
android:focusable="true"
android:background="?attr/selectableItemBackground" />
<TextView
android:id="@+id/top_type_text_view_user_thing_sort_type_bottom_sheet_fragment"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/sort_top"
android:textColor="@color/primaryTextColor"
android:paddingTop="16dp"
android:paddingBottom="16dp"
android:paddingStart="32dp"
android:paddingEnd="32dp"
android:clickable="true"
android:focusable="true"
android:background="?attr/selectableItemBackground" />
<TextView
android:id="@+id/controversial_type_text_view_user_thing_sort_type_bottom_sheet_fragment"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/sort_controversial"
android:textColor="@color/primaryTextColor"
android:paddingTop="16dp"
android:paddingBottom="16dp"
android:paddingStart="32dp"
android:paddingEnd="32dp"
android:clickable="true"
android:focusable="true"
android:background="?attr/selectableItemBackground" />
</LinearLayout>

View File

@ -3,21 +3,27 @@
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
tools:application="ml.docilealligator.infinityforreddit.ViewUserDetailActivity"> tools:application="ml.docilealligator.infinityforreddit.ViewUserDetailActivity">
<item <item
android:id="@+id/action_search_view_user_detail_activity" android:id="@+id/action_sort_view_user_detail_activity"
android:orderInCategory="1" android:orderInCategory="1"
android:title="@string/action_search" android:title="@string/action_search"
android:icon="@drawable/ic_outline_sort_24px"
app:showAsAction="ifRoom" />
<item
android:id="@+id/action_search_view_user_detail_activity"
android:orderInCategory="2"
android:title="@string/action_search"
android:icon="@drawable/ic_search_white_24dp" android:icon="@drawable/ic_search_white_24dp"
app:showAsAction="ifRoom" /> app:showAsAction="ifRoom" />
<item <item
android:id="@+id/action_refresh_view_user_detail_activity" android:id="@+id/action_refresh_view_user_detail_activity"
android:orderInCategory="2" android:orderInCategory="3"
android:title="@string/action_refresh" android:title="@string/action_refresh"
android:icon="@drawable/ic_refresh_white_24dp" android:icon="@drawable/ic_refresh_white_24dp"
app:showAsAction="never" /> app:showAsAction="never" />
<item <item
android:id="@+id/action_lazy_mode_view_user_detail_activity" android:id="@+id/action_lazy_mode_view_user_detail_activity"
android:orderInCategory="3" android:orderInCategory="4"
android:title="@string/action_start_lazy_mode" android:title="@string/action_start_lazy_mode"
app:showAsAction="never" /> app:showAsAction="never" />
</menu> </menu>

View File

@ -216,4 +216,7 @@
<string name="edit_flair">Edit Flair</string> <string name="edit_flair">Edit Flair</string>
<string name="only_allow_64_chars">Only allow less than 64 characters</string> <string name="only_allow_64_chars">Only allow less than 64 characters</string>
<!-- TODO: Remove or change this placeholder text -->
<string name="hello_blank_fragment">Hello blank fragment</string>
</resources> </resources>