Click the subreddit icon or the subreddit name to view the subreddit's details in PostFragment. Make the status bar in ViewSubredditDetailActivity translucent. Prepare to view the user's details in ViewUserDetailActivity. Minor bugs fixed.

This commit is contained in:
Alex Ning
2018-09-21 23:35:57 +08:00
parent 5c51450a8e
commit 88e4cf810f
18 changed files with 278 additions and 62 deletions

View File

@@ -0,0 +1,4 @@
package User;
public class UserData {
}

View File

@@ -27,7 +27,6 @@ class PostPaginationScrollListener extends RecyclerView.OnScrollListener {
private PostRecyclerViewAdapter mAdapter;
private ArrayList<PostData> mPostData;
private PaginationSynchronizer mPaginationSynchronizer;
private PaginationRetryNotifier mPaginationRetryNotifier;
private LastItemSynchronizer mLastItemSynchronizer;
private String mSubredditName;
@@ -54,17 +53,17 @@ class PostPaginationScrollListener extends RecyclerView.OnScrollListener {
this.loadSuccess = loadSuccess;
this.locale = locale;
mPaginationRetryNotifier = new PaginationRetryNotifier() {
PaginationRetryNotifier paginationRetryNotifier = new PaginationRetryNotifier() {
@Override
public void retry() {
if(isBestPost) {
if (isBestPost) {
fetchBestPost(1);
} else {
fetchPost(subredditName, 1);
}
}
};
mPaginationSynchronizer.setPaginationRetryNotifier(mPaginationRetryNotifier);
mPaginationSynchronizer.setPaginationRetryNotifier(paginationRetryNotifier);
mLastItemSynchronizer = mPaginationSynchronizer.getLastItemSynchronizer();
}
}
@@ -117,8 +116,8 @@ class PostPaginationScrollListener extends RecyclerView.OnScrollListener {
clipboard.setPrimaryClip(clip);
ParsePost.parsePost(response.body(), mPostData, locale, new ParsePost.ParsePostListener() {
@Override
public void onParsePostSuccess(ArrayList<PostData> bestPostData, String lastItem) {
mAdapter.notifyDataSetChanged();
public void onParsePostSuccess(ArrayList<PostData> postData, String lastItem) {
mAdapter.notifyItemRangeInserted(mPostData.size(), postData.size());
mLastItem = lastItem;
mLastItemSynchronizer.lastItemChanged(mLastItem);
@@ -188,8 +187,8 @@ class PostPaginationScrollListener extends RecyclerView.OnScrollListener {
clipboard.setPrimaryClip(clip);
ParsePost.parsePost(response.body(), mPostData, locale, new ParsePost.ParsePostListener() {
@Override
public void onParsePostSuccess(ArrayList<PostData> bestPostData, String lastItem) {
mAdapter.notifyDataSetChanged();
public void onParsePostSuccess(ArrayList<PostData> postData, String lastItem) {
mAdapter.notifyItemRangeInserted(mPostData.size(), postData.size());
mLastItem = lastItem;
mLastItemSynchronizer.lastItemChanged(mLastItem);

View File

@@ -136,13 +136,36 @@ class PostRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewHold
((DataViewHolder) holder).subredditIconCircleImageView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(mContext, ViewSubredditDetailActivity.class);
intent.putExtra(ViewSubredditDetailActivity.EXTRA_SUBREDDIT_NAME_KEY,
mPostData.get(adapterPosition).getSubredditNamePrefixed().substring(2));
if(canStartActivity) {
canStartActivity = false;
Intent intent = new Intent(mContext, ViewSubredditDetailActivity.class);
intent.putExtra(ViewSubredditDetailActivity.EXTRA_SUBREDDIT_NAME_KEY,
mPostData.get(adapterPosition).getSubredditNamePrefixed().substring(2));
intent.putExtra(ViewSubredditDetailActivity.EXTRA_SUBREDDIT_VALUE_KEY,
mPostData.get(adapterPosition).getSubredditNamePrefixed());
intent.putExtra(ViewSubredditDetailActivity.EXTRA_QUERY_BY_ID_KEY, false);
mContext.startActivity(intent);
}
}
});
((DataViewHolder) holder).subredditNameTextView.setText(subredditName);
((DataViewHolder) holder).subredditNameTextView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if(canStartActivity) {
canStartActivity = false;
Intent intent = new Intent(mContext, ViewSubredditDetailActivity.class);
intent.putExtra(ViewSubredditDetailActivity.EXTRA_SUBREDDIT_NAME_KEY,
mPostData.get(adapterPosition).getSubredditNamePrefixed().substring(2));
intent.putExtra(ViewSubredditDetailActivity.EXTRA_SUBREDDIT_VALUE_KEY,
mPostData.get(adapterPosition).getSubredditNamePrefixed());
intent.putExtra(ViewSubredditDetailActivity.EXTRA_QUERY_BY_ID_KEY, false);
mContext.startActivity(intent);
}
}
});
((DataViewHolder) holder).postTimeTextView.setText(postTime);
((DataViewHolder) holder).titleTextView.setText(title);
((DataViewHolder) holder).scoreTextView.setText(Integer.toString(mPostData.get(position).getScore()));

View File

@@ -38,4 +38,7 @@ public interface RedditAPI {
@GET("r/{subredditName}.json?raw_json=1")
Call<String> getPost(@Path("subredditName") String subredditName, @Query("after") String lastItem);
@GET("user/{username}/about.json/raw_json=1")
Call<String> getUserData(@Path("username") String username);
}

View File

@@ -15,7 +15,10 @@ public interface SubredditDao {
void deleteAllSubreddits();
@Query("SELECT * from subreddits WHERE id = :id")
LiveData<SubredditData> getSubredditLiveData(String id);
LiveData<SubredditData> getSubredditLiveDataById(String id);
@Query("SELECT * from subreddits WHERE name = :namePrefixed")
LiveData<SubredditData> getSubredditLiveDataByNamePrefixed(String namePrefixed);
@Query("SELECT * from subreddits WHERE name = :namePrefixed")
SubredditData getSubredditData(String namePrefixed);

View File

@@ -8,10 +8,14 @@ public class SubredditRepository {
private SubredditDao mSubredditDao;
private LiveData<SubredditData> mSubredditLiveData;
SubredditRepository(Application application, String id) {
SubredditRepository(Application application, String value, boolean isId) {
SubredditRoomDatabase db = SubredditRoomDatabase.getDatabase(application);
mSubredditDao = db.subredditDao();
mSubredditLiveData = mSubredditDao.getSubredditLiveData(id);
if(isId) {
mSubredditLiveData = mSubredditDao.getSubredditLiveDataById(value);
} else {
mSubredditLiveData = mSubredditDao.getSubredditLiveDataByNamePrefixed(value);
}
}
LiveData<SubredditData> getSubredditLiveData() {

View File

@@ -11,9 +11,9 @@ public class SubredditViewModel extends AndroidViewModel {
private SubredditRepository mSubredditRepository;
private LiveData<SubredditData> mSubredditLiveData;
SubredditViewModel(Application application, String id) {
SubredditViewModel(Application application, String id, boolean isId) {
super(application);
mSubredditRepository = new SubredditRepository(application, id);
mSubredditRepository = new SubredditRepository(application, id, isId);
mSubredditLiveData = mSubredditRepository.getSubredditLiveData();
}
@@ -30,17 +30,19 @@ public class SubredditViewModel extends AndroidViewModel {
@NonNull
private final Application mApplication;
private final String id;
private final String value;
private final boolean isId;
public Factory(@NonNull Application application, String id) {
public Factory(@NonNull Application application, String value, boolean isId) {
mApplication = application;
this.id = id;
this.value = value;
this.isId = isId;
}
@Override
public <T extends ViewModel> T create(Class<T> modelClass) {
//noinspection unchecked
return (T) new SubredditViewModel(mApplication, id);
return (T) new SubredditViewModel(mApplication, value, isId);
}
}
}

View File

@@ -39,7 +39,8 @@ class SubscribedSubredditRecyclerViewAdapter extends RecyclerView.Adapter<Recycl
public void onClick(View view) {
Intent intent = new Intent(mContext, ViewSubredditDetailActivity.class);
intent.putExtra(ViewSubredditDetailActivity.EXTRA_SUBREDDIT_NAME_KEY, mSubscribedSubredditData.get(viewHolder.getAdapterPosition()).getName());
intent.putExtra(ViewSubredditDetailActivity.EXTRA_SUBREDDIT_ID_KEY, mSubscribedSubredditData.get(viewHolder.getAdapterPosition()).getId());
intent.putExtra(ViewSubredditDetailActivity.EXTRA_SUBREDDIT_VALUE_KEY, mSubscribedSubredditData.get(viewHolder.getAdapterPosition()).getId());
intent.putExtra(ViewSubredditDetailActivity.EXTRA_QUERY_BY_ID_KEY, true);
mContext.startActivity(intent);
}
});

View File

@@ -13,6 +13,7 @@ import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
@@ -25,7 +26,8 @@ import de.hdodenhof.circleimageview.CircleImageView;
public class ViewSubredditDetailActivity extends AppCompatActivity {
static final String EXTRA_SUBREDDIT_NAME_KEY = "ESN";
static final String EXTRA_SUBREDDIT_ID_KEY = "ESI";
static final String EXTRA_SUBREDDIT_VALUE_KEY = "ESV";
static final String EXTRA_QUERY_BY_ID_KEY = "EQBI";
private static final String FRAGMENT_OUT_STATE_KEY = "FOSK";
@@ -37,31 +39,48 @@ public class ViewSubredditDetailActivity extends AppCompatActivity {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_view_subreddit_detail);
Toolbar toolbar = findViewById(R.id.toolbar);
final Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
//Get status bar height
int statusBarHeight = 0;
int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");
if (resourceId > 0) {
statusBarHeight = getResources().getDimensionPixelSize(resourceId);
}
ViewGroup.MarginLayoutParams params = (ViewGroup.MarginLayoutParams) toolbar.getLayoutParams();
params.topMargin = statusBarHeight;
final String subredditName = getIntent().getExtras().getString(EXTRA_SUBREDDIT_NAME_KEY);
final String title = "r/" + subredditName;
setTitle(title);
final CollapsingToolbarLayout collapsingToolbarLayout = findViewById(R.id.collapsing_toolbar_layout_view_subreddit_detail_activity);
AppBarLayout appBarLayout = findViewById(R.id.app_bar_layout_view_subreddit_detail_activity);
final AppBarLayout appBarLayout = findViewById(R.id.app_bar_layout_view_subreddit_detail_activity);
appBarLayout.addOnOffsetChangedListener(new AppBarLayout.OnOffsetChangedListener() {
boolean isShow = true;
int previousVerticalOffset = 0;
int scrollRange = -1;
@Override
public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) {
if (scrollRange == -1) {
/*collapsingToolbarLayout.setExpandedTitleColor(Color.BLACK);
collapsingToolbarLayout.setCollapsedTitleTextColor(Color.BLACK);*/
if(scrollRange == -1) {
scrollRange = appBarLayout.getTotalScrollRange();
}
if (scrollRange + verticalOffset == 0) {
collapsingToolbarLayout.setTitle(title);
isShow = true;
} else if(isShow) {
collapsingToolbarLayout.setTitle(" ");//carefull there should a space between double quote otherwise it wont work
isShow = false;
} else {
if(verticalOffset < previousVerticalOffset) {
//Scroll down
if(scrollRange - Math.abs(verticalOffset) <= toolbar.getHeight()) {
collapsingToolbarLayout.setTitle(title);
}
} else {
//Scroll up
if(scrollRange - Math.abs(verticalOffset) > toolbar.getHeight()) {
collapsingToolbarLayout.setTitle(" ");//carefull there should a space between double quote otherwise it wont work
}
}
previousVerticalOffset = verticalOffset;
}
}
});
@@ -74,8 +93,9 @@ public class ViewSubredditDetailActivity extends AppCompatActivity {
final TextView descriptionTextView = findViewById(R.id.description_text_view_view_subreddit_detail_activity);
final RequestManager glide = Glide.with(ViewSubredditDetailActivity.this);
String id = getIntent().getExtras().getString(EXTRA_SUBREDDIT_ID_KEY);
SubredditViewModel.Factory factory = new SubredditViewModel.Factory(getApplication(), id);
String value = getIntent().getExtras().getString(EXTRA_SUBREDDIT_VALUE_KEY);
boolean queryById = getIntent().getExtras().getBoolean(EXTRA_QUERY_BY_ID_KEY);
SubredditViewModel.Factory factory = new SubredditViewModel.Factory(getApplication(), value, queryById);
mSubredditViewModel = ViewModelProviders.of(this, factory).get(SubredditViewModel.class);
mSubredditViewModel.getSubredditLiveData().observe(this, new Observer<SubredditData>() {
@Override

View File

@@ -0,0 +1,20 @@
package ml.docilealligator.infinityforreddit;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
public class ViewUserDetailActivity extends AppCompatActivity {
static final String EXTRA_USER_NAME_KEY = "EUNK";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_view_user_detail);
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
}
}