diff options
-rw-r--r-- | .idea/caches/build_file_checksums.ser | bin | 533 -> 533 bytes | |||
-rw-r--r-- | .idea/caches/gradle_models.ser | bin | 0 -> 268197 bytes | |||
-rw-r--r-- | .idea/gradle.xml | 3 | ||||
-rw-r--r-- | app/src/main/java/ml/docilealligator/infinityforreddit/MainActivity.java | 190 | ||||
-rw-r--r-- | app/src/main/java/ml/docilealligator/infinityforreddit/PostDataSource.java | 43 | ||||
-rw-r--r-- | app/src/main/java/ml/docilealligator/infinityforreddit/PostDataSourceFactory.java | 13 | ||||
-rw-r--r-- | app/src/main/java/ml/docilealligator/infinityforreddit/PostFragment.java | 65 | ||||
-rw-r--r-- | app/src/main/java/ml/docilealligator/infinityforreddit/PostRecyclerViewAdapter.java | 25 | ||||
-rw-r--r-- | app/src/main/java/ml/docilealligator/infinityforreddit/PostViewModel.java | 23 | ||||
-rw-r--r-- | app/src/main/res/layout/activity_view_subreddit_detail.xml | 8 | ||||
-rw-r--r-- | app/src/main/res/layout/fragment_post.xml | 8 | ||||
-rw-r--r-- | app/src/main/res/layout/item_post.xml | 63 | ||||
-rw-r--r-- | app/src/main/res/values/strings.xml | 3 | ||||
-rw-r--r-- | build.gradle | 2 | ||||
-rw-r--r-- | gradle/wrapper/gradle-wrapper.properties | 4 |
15 files changed, 259 insertions, 191 deletions
diff --git a/.idea/caches/build_file_checksums.ser b/.idea/caches/build_file_checksums.ser Binary files differindex b45b4b71..a356d5b7 100644 --- a/.idea/caches/build_file_checksums.ser +++ b/.idea/caches/build_file_checksums.ser diff --git a/.idea/caches/gradle_models.ser b/.idea/caches/gradle_models.ser Binary files differnew file mode 100644 index 00000000..52ef06e2 --- /dev/null +++ b/.idea/caches/gradle_models.ser diff --git a/.idea/gradle.xml b/.idea/gradle.xml index 7ac24c77..f43d4284 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -3,6 +3,9 @@ <component name="GradleSettings"> <option name="linkedExternalProjectsSettings"> <GradleProjectSettings> + <compositeConfiguration> + <compositeBuild compositeDefinitionSource="SCRIPT" /> + </compositeConfiguration> <option name="distributionType" value="DEFAULT_WRAPPED" /> <option name="externalProjectPath" value="$PROJECT_DIR$" /> <option name="modules"> diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/MainActivity.java b/app/src/main/java/ml/docilealligator/infinityforreddit/MainActivity.java index bfc88685..4e97a934 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/MainActivity.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/MainActivity.java @@ -56,11 +56,16 @@ public class MainActivity extends AppCompatActivity { private static final String FETCH_USER_INFO_STATE = "FUIS"; private static final String INSERT_SUBSCRIBED_SUBREDDIT_STATE = "ISSS"; - @BindView(R.id.subscribed_subreddit_recycler_view_main_activity) RecyclerView subscribedSubredditRecyclerView; - @BindView(R.id.subscriptions_label_main_activity) TextView subscriptionsLabelTextView; - @BindView(R.id.subscribed_user_recycler_view_main_activity) RecyclerView subscribedUserRecyclerView; - @BindView(R.id.following_label_main_activity) TextView followingLabelTextView; - @BindView(R.id.profile_linear_layout_main_activity) LinearLayout profileLinearLayout; + @BindView(R.id.subscribed_subreddit_recycler_view_main_activity) + RecyclerView subscribedSubredditRecyclerView; + @BindView(R.id.subscriptions_label_main_activity) + TextView subscriptionsLabelTextView; + @BindView(R.id.subscribed_user_recycler_view_main_activity) + RecyclerView subscribedUserRecyclerView; + @BindView(R.id.following_label_main_activity) + TextView followingLabelTextView; + @BindView(R.id.profile_linear_layout_main_activity) + LinearLayout profileLinearLayout; private TextView mNameTextView; private TextView mKarmaTextView; @@ -82,13 +87,16 @@ public class MainActivity extends AppCompatActivity { private SubscribedSubredditViewModel mSubscribedSubredditViewModel; private SubscribedUserViewModel mSubscribedUserViewModel; - @Inject @Named("user_info") + @Inject + @Named("user_info") SharedPreferences mUserInfoSharedPreferences; - @Inject @Named("auth_info") + @Inject + @Named("auth_info") SharedPreferences mAuthInfoSharedPreferences; - @Inject @Named("oauth") + @Inject + @Named("oauth") Retrofit mOauthRetrofit; @Override @@ -109,11 +117,11 @@ public class MainActivity extends AppCompatActivity { toggle.syncState(); String accessToken = getSharedPreferences(SharedPreferencesUtils.AUTH_CODE_FILE_KEY, Context.MODE_PRIVATE).getString(SharedPreferencesUtils.ACCESS_TOKEN_KEY, ""); - if(accessToken.equals("")) { + if (accessToken.equals("")) { Intent loginIntent = new Intent(this, LoginActivity.class); startActivity(loginIntent); } else { - if(savedInstanceState == null) { + if (savedInstanceState == null) { mFragment = new PostFragment(); Bundle bundle = new Bundle(); bundle.putInt(PostFragment.POST_TYPE_KEY, PostDataSource.TYPE_FRONT_PAGE); @@ -124,7 +132,7 @@ public class MainActivity extends AppCompatActivity { getSupportFragmentManager().beginTransaction().replace(R.id.frame_layout_content_main, mFragment).commit(); } - loadUserData(savedInstanceState); + loadUserData(); View header = findViewById(R.id.nav_header_main_activity); mNameTextView = header.findViewById(R.id.name_text_view_nav_header_main); @@ -146,10 +154,10 @@ public class MainActivity extends AppCompatActivity { mNameTextView.setText(mName); mKarmaTextView.setText(mKarma); glide = Glide.with(this); - if(!mProfileImageUrl.equals("")) { + if (!mProfileImageUrl.equals("")) { glide.load(mProfileImageUrl).into(mProfileImageView); } - if(!mBannerImageUrl.equals("")) { + if (!mBannerImageUrl.equals("")) { glide.load(mBannerImageUrl).into(mBannerImageView); } @@ -189,83 +197,76 @@ public class MainActivity extends AppCompatActivity { } } - private void loadUserData(Bundle savedInstanceState) { - if (savedInstanceState == null) { - if (!mFetchUserInfoSuccess) { - FetchMyInfo.fetchMyInfo(mOauthRetrofit, mAuthInfoSharedPreferences, new FetchMyInfo.FetchUserMyListener() { - @Override - public void onFetchMyInfoSuccess(String response) { - ParseMyInfo.parseMyInfo(response, new ParseMyInfo.ParseMyInfoListener() { - @Override - public void onParseMyInfoSuccess(String name, String profileImageUrl, String bannerImageUrl, int karma) { - mNameTextView.setText(name); - if (!mProfileImageUrl.equals("")) { - glide.load(profileImageUrl).into(mProfileImageView); - } - if (!mBannerImageUrl.equals("")) { - glide.load(bannerImageUrl).into(mBannerImageView); - } - - mName = name; - mProfileImageUrl = profileImageUrl; - mBannerImageUrl = bannerImageUrl; - mKarma = getString(R.string.karma_info, karma); - - mKarmaTextView.setText(mKarma); - - SharedPreferences.Editor editor = mUserInfoSharedPreferences.edit(); - editor.putString(SharedPreferencesUtils.USER_KEY, name); - editor.putString(SharedPreferencesUtils.PROFILE_IMAGE_URL_KEY, profileImageUrl); - editor.putString(SharedPreferencesUtils.BANNER_IMAGE_URL_KEY, bannerImageUrl); - editor.putString(SharedPreferencesUtils.KARMA_KEY, mKarma); - editor.apply(); - mFetchUserInfoSuccess = true; + private void loadUserData() { + if (!mFetchUserInfoSuccess) { + FetchMyInfo.fetchMyInfo(mOauthRetrofit, mAuthInfoSharedPreferences, new FetchMyInfo.FetchUserMyListener() { + @Override + public void onFetchMyInfoSuccess(String response) { + ParseMyInfo.parseMyInfo(response, new ParseMyInfo.ParseMyInfoListener() { + @Override + public void onParseMyInfoSuccess(String name, String profileImageUrl, String bannerImageUrl, int karma) { + mNameTextView.setText(name); + if (!mProfileImageUrl.equals("")) { + glide.load(profileImageUrl).into(mProfileImageView); } - - @Override - public void onParseMyInfoFail() { - mFetchUserInfoSuccess = false; + if (!mBannerImageUrl.equals("")) { + glide.load(bannerImageUrl).into(mBannerImageView); } - }); - } - - @Override - public void onFetchMyInfoFail() { - mFetchUserInfoSuccess = false; - } - }); - } - if (!mInsertSuccess) { - FetchSubscribedThing.fetchSubscribedThing(mOauthRetrofit, mAuthInfoSharedPreferences, null, - new ArrayList<SubscribedSubredditData>(), new ArrayList<SubscribedUserData>(), - new ArrayList<SubredditData>(), - new FetchSubscribedThing.FetchSubscribedThingListener() { - @Override - public void onFetchSubscribedThingSuccess(ArrayList<SubscribedSubredditData> subscribedSubredditData, - ArrayList<SubscribedUserData> subscribedUserData, - ArrayList<SubredditData> subredditData) { - new InsertSubscribedThingsAsyncTask( - SubscribedSubredditRoomDatabase.getDatabase(MainActivity.this), - SubscribedUserRoomDatabase.getDatabase(MainActivity.this), - SubredditRoomDatabase.getDatabase(MainActivity.this), - subscribedSubredditData, - subscribedUserData, - subredditData, - new InsertSubscribedThingsAsyncTask.InsertSubscribedThingListener() { - @Override - public void insertSuccess() { - mInsertSuccess = true; - } - }).execute(); - } + mName = name; + mProfileImageUrl = profileImageUrl; + mBannerImageUrl = bannerImageUrl; + mKarma = getString(R.string.karma_info, karma); + + mKarmaTextView.setText(mKarma); + + SharedPreferences.Editor editor = mUserInfoSharedPreferences.edit(); + editor.putString(SharedPreferencesUtils.USER_KEY, name); + editor.putString(SharedPreferencesUtils.PROFILE_IMAGE_URL_KEY, profileImageUrl); + editor.putString(SharedPreferencesUtils.BANNER_IMAGE_URL_KEY, bannerImageUrl); + editor.putString(SharedPreferencesUtils.KARMA_KEY, mKarma); + editor.apply(); + mFetchUserInfoSuccess = true; + } + + @Override + public void onParseMyInfoFail() { + mFetchUserInfoSuccess = false; + } + }); + } - @Override - public void onFetchSubscribedThingFail() { - mInsertSuccess = false; - } - }); - } + @Override + public void onFetchMyInfoFail() { + mFetchUserInfoSuccess = false; + } + }); + } + + if (!mInsertSuccess) { + FetchSubscribedThing.fetchSubscribedThing(mOauthRetrofit, mAuthInfoSharedPreferences, null, + new ArrayList<>(), new ArrayList<>(), + new ArrayList<>(), + new FetchSubscribedThing.FetchSubscribedThingListener() { + @Override + public void onFetchSubscribedThingSuccess(ArrayList<SubscribedSubredditData> subscribedSubredditData, + ArrayList<SubscribedUserData> subscribedUserData, + ArrayList<SubredditData> subredditData) { + new InsertSubscribedThingsAsyncTask( + SubscribedSubredditRoomDatabase.getDatabase(MainActivity.this), + SubscribedUserRoomDatabase.getDatabase(MainActivity.this), + SubredditRoomDatabase.getDatabase(MainActivity.this), + subscribedSubredditData, + subscribedUserData, + subredditData, + () -> mInsertSuccess = true).execute(); + } + + @Override + public void onFetchSubscribedThingFail() { + mInsertSuccess = false; + } + }); } } @@ -279,8 +280,11 @@ public class MainActivity extends AppCompatActivity { public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.action_refresh_main_activity: - if(mFragment instanceof FragmentCommunicator) { + if (mFragment instanceof FragmentCommunicator) { ((FragmentCommunicator) mFragment).refresh(); + mFetchUserInfoSuccess = false; + mInsertSuccess = false; + loadUserData(); } return true; } @@ -300,7 +304,7 @@ public class MainActivity extends AppCompatActivity { @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); - if(mFragment != null) { + if (mFragment != null) { getSupportFragmentManager().putFragment(outState, FRAGMENT_OUT_STATE, mFragment); } outState.putString(NAME_STATE, mName); @@ -322,10 +326,10 @@ public class MainActivity extends AppCompatActivity { mInsertSuccess = savedInstanceState.getBoolean(INSERT_SUBSCRIBED_SUBREDDIT_STATE); mNameTextView.setText(mName); mKarmaTextView.setText(mKarma); - if(!mProfileImageUrl.equals("")) { + if (!mProfileImageUrl.equals("")) { glide.load(mProfileImageUrl).into(mProfileImageView); } - if(!mBannerImageUrl.equals("")) { + if (!mBannerImageUrl.equals("")) { glide.load(mBannerImageUrl).into(mBannerImageView); } } @@ -362,13 +366,13 @@ public class MainActivity extends AppCompatActivity { @Override protected Void doInBackground(final Void... params) { - for(SubscribedSubredditData s : subscribedSubredditData) { + for (SubscribedSubredditData s : subscribedSubredditData) { mSubscribedSubredditDao.insert(s); } - for(SubscribedUserData s : subscribedUserData) { + for (SubscribedUserData s : subscribedUserData) { mUserDao.insert(s); } - for(SubredditData s : subredditData) { + for (SubredditData s : subredditData) { mSubredditDao.insert(s); } return null; diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/PostDataSource.java b/app/src/main/java/ml/docilealligator/infinityforreddit/PostDataSource.java index 29e78b07..615ceb9f 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/PostDataSource.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/PostDataSource.java @@ -13,6 +13,11 @@ import retrofit2.Callback; import retrofit2.Retrofit; class PostDataSource extends PageKeyedDataSource<String, Post> { + interface OnPostFetchedCallback { + void hasPost(); + void noPost(); + } + static final int TYPE_FRONT_PAGE = 0; static final int TYPE_SUBREDDIT = 1; static final int TYPE_USER = 2; @@ -22,6 +27,7 @@ class PostDataSource extends PageKeyedDataSource<String, Post> { private Locale locale; private String name; private int postType; + private OnPostFetchedCallback onPostFetchedCallback; private MutableLiveData<NetworkState> paginationNetworkStateLiveData; private MutableLiveData<NetworkState> initialLoadStateLiveData; @@ -31,22 +37,24 @@ class PostDataSource extends PageKeyedDataSource<String, Post> { private LoadParams<String> params; private LoadCallback<String, Post> callback; - PostDataSource(Retrofit retrofit, String accessToken, Locale locale, int postType) { + PostDataSource(Retrofit retrofit, String accessToken, Locale locale, int postType, OnPostFetchedCallback onPostFetchedCallback) { this.retrofit = retrofit; this.accessToken = accessToken; this.locale = locale; paginationNetworkStateLiveData = new MutableLiveData(); initialLoadStateLiveData = new MutableLiveData(); this.postType = postType; + this.onPostFetchedCallback = onPostFetchedCallback; } - PostDataSource(Retrofit retrofit, Locale locale, String name, int postType) { + PostDataSource(Retrofit retrofit, Locale locale, String name, int postType, OnPostFetchedCallback onPostFetchedCallback) { this.retrofit = retrofit; this.locale = locale; this.name = name; paginationNetworkStateLiveData = new MutableLiveData(); initialLoadStateLiveData = new MutableLiveData(); this.postType = postType; + this.onPostFetchedCallback = onPostFetchedCallback; } MutableLiveData getPaginationNetworkStateLiveData() { @@ -72,7 +80,7 @@ class PostDataSource extends PageKeyedDataSource<String, Post> { loadSubredditPostsInitial(callback); break; case TYPE_USER: - loadUserPostsInitial(callback); + loadUserPostsInitial(callback, null); break; } } @@ -117,6 +125,12 @@ class PostDataSource extends PageKeyedDataSource<String, Post> { new ParsePost.ParsePostListener() { @Override public void onParsePostSuccess(ArrayList<Post> newPosts, String lastItem) { + if(newPosts.size() == 0) { + onPostFetchedCallback.noPost(); + } else { + onPostFetchedCallback.hasPost(); + } + callback.onResult(newPosts, null, lastItem); initialLoadStateLiveData.postValue(NetworkState.LOADED); } @@ -187,6 +201,12 @@ class PostDataSource extends PageKeyedDataSource<String, Post> { new ParsePost.ParsePostListener() { @Override public void onParsePostSuccess(ArrayList<Post> newPosts, String lastItem) { + if(newPosts.size() == 0) { + onPostFetchedCallback.noPost(); + } else { + onPostFetchedCallback.hasPost(); + } + callback.onResult(newPosts, null, lastItem); initialLoadStateLiveData.postValue(NetworkState.LOADED); } @@ -245,9 +265,9 @@ class PostDataSource extends PageKeyedDataSource<String, Post> { }); } - private void loadUserPostsInitial(@NonNull final LoadInitialCallback<String, Post> callback) { + private void loadUserPostsInitial(@NonNull final LoadInitialCallback<String, Post> callback, String lastItem) { RedditAPI api = retrofit.create(RedditAPI.class); - Call<String> getPost = api.getUserBestPosts(name, null); + Call<String> getPost = api.getUserBestPosts(name, lastItem); getPost.enqueue(new Callback<String>() { @Override public void onResponse(Call<String> call, retrofit2.Response<String> response) { @@ -256,8 +276,17 @@ class PostDataSource extends PageKeyedDataSource<String, Post> { new ParsePost.ParsePostListener() { @Override public void onParsePostSuccess(ArrayList<Post> newPosts, String lastItem) { - callback.onResult(newPosts, null, lastItem); - initialLoadStateLiveData.postValue(NetworkState.LOADED); + if(newPosts.size() == 0 && lastItem.equals("null")) { + callback.onResult(newPosts, null, lastItem); + initialLoadStateLiveData.postValue(NetworkState.LOADED); + onPostFetchedCallback.noPost(); + } else if(newPosts.size() == 0) { + loadUserPostsInitial(callback, lastItem); + } else { + callback.onResult(newPosts, null, lastItem); + initialLoadStateLiveData.postValue(NetworkState.LOADED); + onPostFetchedCallback.hasPost(); + } } @Override diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/PostDataSourceFactory.java b/app/src/main/java/ml/docilealligator/infinityforreddit/PostDataSourceFactory.java index 19fe9a06..848799bf 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/PostDataSourceFactory.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/PostDataSourceFactory.java @@ -13,32 +13,37 @@ class PostDataSourceFactory extends DataSource.Factory { private Locale locale; private String subredditName; private int postType; + private PostDataSource.OnPostFetchedCallback onPostFetchedCallback; private PostDataSource postDataSource; private MutableLiveData<PostDataSource> postDataSourceLiveData; - PostDataSourceFactory(Retrofit retrofit, String accessToken, Locale locale, int postType) { + PostDataSourceFactory(Retrofit retrofit, String accessToken, Locale locale, int postType, + PostDataSource.OnPostFetchedCallback onPostFetchedCallback) { this.retrofit = retrofit; this.accessToken = accessToken; this.locale = locale; postDataSourceLiveData = new MutableLiveData<>(); this.postType = postType; + this.onPostFetchedCallback = onPostFetchedCallback; } - PostDataSourceFactory(Retrofit retrofit, Locale locale, String subredditName, int postType) { + PostDataSourceFactory(Retrofit retrofit, Locale locale, String subredditName, int postType, + PostDataSource.OnPostFetchedCallback onPostFetchedCallback) { this.retrofit = retrofit; this.locale = locale; this.subredditName = subredditName; postDataSourceLiveData = new MutableLiveData<>(); this.postType = postType; + this.onPostFetchedCallback = onPostFetchedCallback; } @Override public DataSource create() { if(postType == PostDataSource.TYPE_FRONT_PAGE) { - postDataSource = new PostDataSource(retrofit, accessToken, locale, postType); + postDataSource = new PostDataSource(retrofit, accessToken, locale, postType, onPostFetchedCallback); } else { - postDataSource = new PostDataSource(retrofit, locale, subredditName, postType); + postDataSource = new PostDataSource(retrofit, locale, subredditName, postType, onPostFetchedCallback); } postDataSourceLiveData.postValue(postDataSource); diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/PostFragment.java b/app/src/main/java/ml/docilealligator/infinityforreddit/PostFragment.java index 995cee9a..e4023fd0 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/PostFragment.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/PostFragment.java @@ -7,7 +7,6 @@ import android.content.SharedPreferences; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.design.widget.CoordinatorLayout; -import android.support.design.widget.Snackbar; import android.support.v4.app.Fragment; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; @@ -16,6 +15,7 @@ import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.LinearLayout; +import android.widget.TextView; import com.bumptech.glide.Glide; import com.lsjwzh.widget.materialloadingprogressbar.CircleProgressBar; @@ -38,8 +38,9 @@ public class PostFragment extends Fragment implements FragmentCommunicator { private RecyclerView mPostRecyclerView; private LinearLayoutManager mLinearLayoutManager; private CircleProgressBar mProgressBar; - private LinearLayout mFetchPostErrorLinearLayout; - private ImageView mFetchPostErrorImageView; + private LinearLayout mFetchPostInfoLinearLayout; + private ImageView mFetchPostInfoImageView; + private TextView mFetchPostInfoTextView; private String mName; private int mPostType; @@ -82,8 +83,9 @@ public class PostFragment extends Fragment implements FragmentCommunicator { mLinearLayoutManager = new LinearLayoutManager(getActivity()); mPostRecyclerView.setLayoutManager(mLinearLayoutManager); mProgressBar = rootView.findViewById(R.id.progress_bar_post_fragment); - mFetchPostErrorLinearLayout = rootView.findViewById(R.id.fetch_post_error_linear_layout_post_fragment); - mFetchPostErrorImageView = rootView.findViewById(R.id.fetch_post_error_image_view_post_fragment); + mFetchPostInfoLinearLayout = rootView.findViewById(R.id.fetch_post_info_linear_layout_post_fragment); + mFetchPostInfoImageView = rootView.findViewById(R.id.fetch_post_info_image_view_post_fragment); + mFetchPostInfoTextView = rootView.findViewById(R.id.fetch_post_info_text_view_post_fragment); /*FloatingActionButton fab = rootView.findViewById(R.id.fab_post_fragment); fab.setOnClickListener(new View.OnClickListener() { @Override @@ -97,8 +99,6 @@ public class PostFragment extends Fragment implements FragmentCommunicator { if(mPostType != PostDataSource.TYPE_FRONT_PAGE) { mName = getArguments().getString(NAME_KEY); - } else { - mFetchPostErrorLinearLayout.setOnClickListener(view -> mPostViewModel.retry()); } if(mPostType == PostDataSource.TYPE_FRONT_PAGE) { @@ -116,11 +116,38 @@ public class PostFragment extends Fragment implements FragmentCommunicator { PostViewModel.Factory factory; if(mPostType == PostDataSource.TYPE_FRONT_PAGE) { factory = new PostViewModel.Factory(mOauthRetrofit, accessToken, - getResources().getConfiguration().locale, mPostType); + getResources().getConfiguration().locale, mPostType, new PostDataSource.OnPostFetchedCallback() { + @Override + public void hasPost() { + mFetchPostInfoLinearLayout.setVisibility(View.GONE); + } + + @Override + public void noPost() { + mFetchPostInfoLinearLayout.setOnClickListener(view -> { + //Do nothing + }); + showErrorView(R.string.no_posts); + } + }); } else { factory = new PostViewModel.Factory(mRetrofit, - getResources().getConfiguration().locale, mName, mPostType); + getResources().getConfiguration().locale, mName, mPostType, new PostDataSource.OnPostFetchedCallback() { + @Override + public void hasPost() { + mFetchPostInfoLinearLayout.setVisibility(View.GONE); + } + + @Override + public void noPost() { + mFetchPostInfoLinearLayout.setOnClickListener(view -> { + //Do nothing + }); + showErrorView(R.string.no_posts); + } + }); } + mPostViewModel = ViewModelProviders.of(this, factory).get(PostViewModel.class); mPostViewModel.getPosts().observe(this, posts -> mAdapter.submitList(posts)); @@ -128,9 +155,10 @@ public class PostFragment extends Fragment implements FragmentCommunicator { if(networkState.getStatus().equals(NetworkState.Status.SUCCESS)) { mProgressBar.setVisibility(View.GONE); } else if(networkState.getStatus().equals(NetworkState.Status.FAILED)) { - showErrorView(); + mFetchPostInfoLinearLayout.setOnClickListener(view -> mPostViewModel.retry()); + showErrorView(R.string.load_posts_error); } else { - mFetchPostErrorLinearLayout.setVisibility(View.GONE); + mFetchPostInfoLinearLayout.setVisibility(View.GONE); mProgressBar.setVisibility(View.VISIBLE); } }); @@ -147,17 +175,12 @@ public class PostFragment extends Fragment implements FragmentCommunicator { mPostViewModel.refresh(); } - private void showErrorView() { + private void showErrorView(int stringResId) { mProgressBar.setVisibility(View.GONE); - if(mPostType == PostDataSource.TYPE_FRONT_PAGE) { - if(getActivity() != null && isAdded()) { - mFetchPostErrorLinearLayout.setVisibility(View.VISIBLE); - Glide.with(this).load(R.drawable.load_post_error_indicator).into(mFetchPostErrorImageView); - } - } else { - Snackbar snackbar = Snackbar.make(mCoordinatorLayout, "Error getting post", Snackbar.LENGTH_INDEFINITE); - snackbar.setAction(R.string.retry, view -> mPostViewModel.retry()); - snackbar.show(); + if(getActivity() != null && isAdded()) { + mFetchPostInfoLinearLayout.setVisibility(View.VISIBLE); + mFetchPostInfoTextView.setText(stringResId); + Glide.with(this).load(R.drawable.load_post_error_indicator).into(mFetchPostInfoImageView); } } }
\ No newline at end of file diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/PostRecyclerViewAdapter.java b/app/src/main/java/ml/docilealligator/infinityforreddit/PostRecyclerViewAdapter.java index da60c5a5..7028c81b 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/PostRecyclerViewAdapter.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/PostRecyclerViewAdapter.java @@ -23,6 +23,7 @@ import android.view.View; import android.view.ViewGroup; import android.widget.Button; import android.widget.ImageView; +import android.widget.LinearLayout; import android.widget.ProgressBar; import android.widget.RelativeLayout; import android.widget.TextView; @@ -212,20 +213,10 @@ class PostRecyclerViewAdapter extends PagedListAdapter<Post, RecyclerView.ViewHo .into(((DataViewHolder) holder).subredditIconGifImageView); } - ((DataViewHolder) holder).subredditIconGifImageView.setOnClickListener(view -> { - if(canStartActivity) { - canStartActivity = false; - Intent intent = new Intent(mContext, ViewSubredditDetailActivity.class); - intent.putExtra(ViewSubredditDetailActivity.EXTRA_SUBREDDIT_NAME_KEY, - post.getSubredditNamePrefixed().substring(2)); - mContext.startActivity(intent); - } - }); - ((DataViewHolder) holder).subredditNameTextView.setTextColor(mContext.getResources().getColor(R.color.colorAccent)); ((DataViewHolder) holder).subredditNameTextView.setText(subredditNamePrefixed); - ((DataViewHolder) holder).subredditNameTextView.setOnClickListener(view -> { + ((DataViewHolder) holder).subredditIconNameLinearLayout.setOnClickListener(view -> { if(canStartActivity) { canStartActivity = false; Intent intent = new Intent(mContext, ViewSubredditDetailActivity.class); @@ -297,19 +288,10 @@ class PostRecyclerViewAdapter extends PagedListAdapter<Post, RecyclerView.ViewHo .into(((DataViewHolder) holder).subredditIconGifImageView); } - ((DataViewHolder) holder).subredditIconGifImageView.setOnClickListener(view -> { - if(canStartActivity) { - canStartActivity = false; - Intent intent = new Intent(mContext, ViewUserDetailActivity.class); - intent.putExtra(ViewUserDetailActivity.EXTRA_USER_NAME_KEY, post.getAuthor()); - mContext.startActivity(intent); - } - }); - ((DataViewHolder) holder).subredditNameTextView.setTextColor(mContext.getResources().getColor(R.color.colorPrimaryDark)); ((DataViewHolder) holder).subredditNameTextView.setText(author); - ((DataViewHolder) holder).subredditNameTextView.setOnClickListener(view -> { + ((DataViewHolder) holder).subredditIconNameLinearLayout.setOnClickListener(view -> { if(canStartActivity) { canStartActivity = false; Intent intent = new Intent(mContext, ViewUserDetailActivity.class); @@ -645,6 +627,7 @@ class PostRecyclerViewAdapter extends PagedListAdapter<Post, RecyclerView.ViewHo class DataViewHolder extends RecyclerView.ViewHolder { @BindView(R.id.card_view_view_post_detail) MaterialCardView cardView; + @BindView(R.id.subreddit_icon_name_linear_layout_view_item_best_post) LinearLayout subredditIconNameLinearLayout; @BindView(R.id.subreddit_icon_gif_image_view_best_post_item) AspectRatioGifImageView subredditIconGifImageView; @BindView(R.id.subreddit_text_view_best_post_item) TextView subredditNameTextView; @BindView(R.id.stickied_post_image_view_best_post_item) ImageView stickiedPostImageView; diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/PostViewModel.java b/app/src/main/java/ml/docilealligator/infinityforreddit/PostViewModel.java index 939ca68c..69df991f 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/PostViewModel.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/PostViewModel.java @@ -18,8 +18,9 @@ public class PostViewModel extends ViewModel { private LiveData<NetworkState> initialLoadingState; private LiveData<PagedList<Post>> posts; - public PostViewModel(Retrofit retrofit, String accessToken, Locale locale, int postType) { - postDataSourceFactory = new PostDataSourceFactory(retrofit, accessToken, locale, postType); + public PostViewModel(Retrofit retrofit, String accessToken, Locale locale, int postType, + PostDataSource.OnPostFetchedCallback onPostFetchedCallback) { + postDataSourceFactory = new PostDataSourceFactory(retrofit, accessToken, locale, postType, onPostFetchedCallback); initialLoadingState = Transformations.switchMap(postDataSourceFactory.getPostDataSourceLiveData(), dataSource -> dataSource.getInitialLoadStateLiveData()); @@ -34,8 +35,9 @@ public class PostViewModel extends ViewModel { posts = (new LivePagedListBuilder(postDataSourceFactory, pagedListConfig)).build(); } - public PostViewModel(Retrofit retrofit, Locale locale, String subredditName, int postType) { - postDataSourceFactory = new PostDataSourceFactory(retrofit, locale, subredditName, postType); + public PostViewModel(Retrofit retrofit, Locale locale, String subredditName, int postType, + PostDataSource.OnPostFetchedCallback onPostFetchedCallback) { + postDataSourceFactory = new PostDataSourceFactory(retrofit, locale, subredditName, postType, onPostFetchedCallback); initialLoadingState = Transformations.switchMap(postDataSourceFactory.getPostDataSourceLiveData(), dataSource -> dataSource.getInitialLoadStateLiveData()); @@ -81,28 +83,33 @@ public class PostViewModel extends ViewModel { private Locale locale; private String subredditName; private int postType; + private PostDataSource.OnPostFetchedCallback onPostFetchedCallback; - public Factory(Retrofit retrofit, String accessToken, Locale locale, int postType) { + public Factory(Retrofit retrofit, String accessToken, Locale locale, int postType, + PostDataSource.OnPostFetchedCallback onPostFetchedCallback) { this.retrofit = retrofit; this.accessToken = accessToken; this.locale = locale; this.postType = postType; + this.onPostFetchedCallback = onPostFetchedCallback; } - public Factory(Retrofit retrofit, Locale locale, String subredditName, int postType) { + public Factory(Retrofit retrofit, Locale locale, String subredditName, int postType, + PostDataSource.OnPostFetchedCallback onPostFetchedCallback) { this.retrofit = retrofit; this.locale = locale; this.subredditName = subredditName; this.postType = postType; + this.onPostFetchedCallback = onPostFetchedCallback; } @NonNull @Override public <T extends ViewModel> T create(@NonNull Class<T> modelClass) { if(postType == PostDataSource.TYPE_FRONT_PAGE) { - return (T) new PostViewModel(retrofit, accessToken, locale, postType); + return (T) new PostViewModel(retrofit, accessToken, locale, postType, onPostFetchedCallback); } else { - return (T) new PostViewModel(retrofit, locale, subredditName, postType); + return (T) new PostViewModel(retrofit, locale, subredditName, postType, onPostFetchedCallback); } } } diff --git a/app/src/main/res/layout/activity_view_subreddit_detail.xml b/app/src/main/res/layout/activity_view_subreddit_detail.xml index 6492e140..1460efac 100644 --- a/app/src/main/res/layout/activity_view_subreddit_detail.xml +++ b/app/src/main/res/layout/activity_view_subreddit_detail.xml @@ -49,7 +49,6 @@ android:layout_height="wrap_content" android:orientation="vertical" android:paddingTop="36dp" - android:paddingBottom="16dp" android:paddingStart="16dp" android:paddingEnd="16dp" android:layout_below="@id/banner_image_view_view_subreddit_detail_activity" @@ -75,7 +74,8 @@ <RelativeLayout android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginTop="16dp"> + android:layout_marginTop="16dp" + android:layout_marginBottom="16dp"> <TextView android:id="@+id/subscriber_count_text_view_view_subreddit_detail_activity" @@ -83,8 +83,7 @@ android:layout_height="wrap_content" android:textColor="@android:color/black" android:layout_alignParentStart="true" - android:layout_toStartOf="@id/online_subscriber_count_text_view_view_subreddit_detail_activity" - android:layout_marginBottom="16dp"/> + android:layout_toStartOf="@id/online_subscriber_count_text_view_view_subreddit_detail_activity" /> <TextView android:id="@+id/online_subscriber_count_text_view_view_subreddit_detail_activity" @@ -99,6 +98,7 @@ android:id="@+id/description_text_view_view_subreddit_detail_activity" android:layout_width="wrap_content" android:layout_height="wrap_content" + android:layout_marginBottom="16dp" android:textColor="@android:color/black" android:visibility="gone"/> diff --git a/app/src/main/res/layout/fragment_post.xml b/app/src/main/res/layout/fragment_post.xml index 9493bb8f..1c78fcad 100644 --- a/app/src/main/res/layout/fragment_post.xml +++ b/app/src/main/res/layout/fragment_post.xml @@ -22,7 +22,7 @@ android:layout_height="match_parent" /> <LinearLayout - android:id="@+id/fetch_post_error_linear_layout_post_fragment" + android:id="@+id/fetch_post_info_linear_layout_post_fragment" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center" @@ -30,16 +30,16 @@ android:visibility="gone"> <ImageView - android:id="@+id/fetch_post_error_image_view_post_fragment" + android:id="@+id/fetch_post_info_image_view_post_fragment" android:layout_width="150dp" android:layout_height="wrap_content" /> <TextView + android:id="@+id/fetch_post_info_text_view_post_fragment" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="16dp" - android:gravity="center" - android:text="@string/load_posts_error"/> + android:gravity="center" /> </LinearLayout> diff --git a/app/src/main/res/layout/item_post.xml b/app/src/main/res/layout/item_post.xml index 1d686e52..585c8931 100644 --- a/app/src/main/res/layout/item_post.xml +++ b/app/src/main/res/layout/item_post.xml @@ -13,49 +13,60 @@ android:layout_height="wrap_content" android:orientation="vertical"> - <RelativeLayout + <android.support.constraint.ConstraintLayout android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_margin="16dp"> - - <CustomView.AspectRatioGifImageView - android:id="@+id/subreddit_icon_gif_image_view_best_post_item" - android:layout_width="24dp" - android:layout_height="24dp" - android:layout_alignParentStart="true" - android:layout_centerVertical="true"/> + android:layout_height="wrap_content"> - <TextView - android:id="@+id/subreddit_text_view_best_post_item" + <LinearLayout + android:id="@+id/subreddit_icon_name_linear_layout_view_item_best_post" android:layout_width="wrap_content" - android:layout_height="match_parent" - android:layout_marginStart="16dp" - android:layout_marginEnd="8dp" - android:layout_toStartOf="@id/stickied_post_image_view_best_post_item" - android:layout_toEndOf="@id/subreddit_icon_gif_image_view_best_post_item" - android:layout_centerVertical="true" - android:textColor="#E91E63"/> + android:layout_height="wrap_content" + android:padding="16dp" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent"> + + <CustomView.AspectRatioGifImageView + android:id="@+id/subreddit_icon_gif_image_view_best_post_item" + android:layout_width="24dp" + android:layout_height="24dp" + android:layout_gravity="center"/> + + <TextView + android:id="@+id/subreddit_text_view_best_post_item" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginStart="16dp" + android:layout_marginEnd="8dp" + android:layout_gravity="center" + android:textColor="#E91E63" /> + + </LinearLayout> <ImageView android:id="@+id/stickied_post_image_view_best_post_item" android:layout_width="24dp" android:layout_height="24dp" - android:layout_toStartOf="@id/post_time_text_view_best_post_item" + android:layout_gravity="center" android:layout_marginStart="8dp" android:layout_marginEnd="8dp" - android:layout_centerVertical="true" android:tint="@color/colorPrimary" - android:visibility="gone"/> + android:visibility="gone" + app:layout_constraintEnd_toStartOf="@+id/post_time_text_view_best_post_item" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintTop_toTopOf="parent"/> <TextView android:id="@+id/post_time_text_view_best_post_item" android:layout_width="wrap_content" android:layout_height="match_parent" - android:layout_alignParentEnd="true" - android:layout_centerVertical="true" - android:gravity="center_vertical"/> + android:layout_gravity="center" + android:layout_marginEnd="16dp" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintTop_toTopOf="parent" /> - </RelativeLayout> + </android.support.constraint.ConstraintLayout> <TextView android:id="@+id/title_text_view_best_post_item" diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index d9622abe..c42202ca 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -11,6 +11,7 @@ <string name="tap_to_retry">Error loading image. Tap to retry.</string> <string name="load_posts_error">Error loading posts.\nTap to retry.</string> + <string name="no_posts">No posts here.</string> <string name="load_data_failed">Cannot load posts</string> <string name="load_comment_failed">Error loading comments</string> @@ -47,4 +48,6 @@ <string name="unfollow_failed">Unfollowing Failed</string> <string name="content_description_banner_imageview">Subreddit Banner Image</string> + + <string name="error_loading_posts">Error loading post</string> </resources> diff --git a/build.gradle b/build.gradle index 8a7b6fa0..c175ad82 100644 --- a/build.gradle +++ b/build.gradle @@ -7,7 +7,7 @@ buildscript { jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:3.2.1' + classpath 'com.android.tools.build:gradle:3.3.0' // NOTE: Do not place your application dependencies here; they belong diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index d210bb6a..50e8894c 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Fri Oct 19 21:24:28 HKT 2018 +#Tue Jan 22 01:13:16 HKT 2019 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.6-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.1-all.zip |