From 1bd9ba61c6cccd1fc318f1698fddc0d13e4723cf Mon Sep 17 00:00:00 2001 From: Alex Ning Date: Fri, 28 Sep 2018 14:49:49 +0800 Subject: Change the layout of post. Add an error view when loading the preview image fails. --- .../infinityforreddit/PostRecyclerViewAdapter.java | 70 ++-- .../infinityforreddit/ViewPostDetailActivity.java | 64 +++- .../res/drawable/ic_error_outline_black_24dp.xml | 9 + .../main/res/layout/activity_view_post_detail.xml | 29 +- .../main/res/layout/item_footer_progress_bar.xml | 5 +- app/src/main/res/layout/item_post.xml | 359 +++++++++++---------- app/src/main/res/values/strings.xml | 1 + 7 files changed, 319 insertions(+), 218 deletions(-) create mode 100644 app/src/main/res/drawable/ic_error_outline_black_24dp.xml (limited to 'app/src/main') diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/PostRecyclerViewAdapter.java b/app/src/main/java/ml/docilealligator/infinityforreddit/PostRecyclerViewAdapter.java index aeaa3ae0..d9b6c146 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/PostRecyclerViewAdapter.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/PostRecyclerViewAdapter.java @@ -9,7 +9,6 @@ import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.customtabs.CustomTabsIntent; import android.support.v4.content.ContextCompat; -import android.support.v7.widget.CardView; import android.support.v7.widget.RecyclerView; import android.util.Log; import android.view.LayoutInflater; @@ -74,8 +73,8 @@ class PostRecyclerViewAdapter extends RecyclerView.Adapter() { - @Override - public boolean onLoadFailed(@Nullable GlideException e, Object model, Target target, boolean isFirstResource) { - return false; - } - - @Override - public boolean onResourceReady(Drawable resource, Object model, Target target, DataSource dataSource, boolean isFirstResource) { - ((DataViewHolder) holder).progressBar.setVisibility(View.GONE); - return false; - } - }); - - if(mPostData.get(position).isNSFW()) { - imageRequestBuilder.apply(RequestOptions.bitmapTransform(new BlurTransformation(25, 3))) - .into(((DataViewHolder) holder).imageView); - } else { - imageRequestBuilder.into(((DataViewHolder) holder).imageView); - } + loadImage(holder, mPostData.get(holder.getAdapterPosition())); } if(mPostData.get(position).isStickied()) { @@ -482,6 +461,38 @@ class PostRecyclerViewAdapter extends RecyclerView.Adapter() { + @Override + public boolean onLoadFailed(@Nullable GlideException e, Object model, Target target, boolean isFirstResource) { + ((DataViewHolder) holder).progressBar.setVisibility(View.GONE); + ((DataViewHolder) holder).errorLinearLayout.setVisibility(View.VISIBLE); + ((DataViewHolder)holder).errorLinearLayout.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + ((DataViewHolder) holder).progressBar.setVisibility(View.VISIBLE); + ((DataViewHolder) holder).errorLinearLayout.setVisibility(View.GONE); + loadImage(holder, postData); + } + }); + return false; + } + + @Override + public boolean onResourceReady(Drawable resource, Object model, Target target, DataSource dataSource, boolean isFirstResource) { + ((DataViewHolder) holder).errorLinearLayout.setVisibility(View.GONE); + ((DataViewHolder) holder).progressBar.setVisibility(View.GONE); + return false; + } + }); + + if(postData.isNSFW()) { + imageRequestBuilder.apply(RequestOptions.bitmapTransform(new BlurTransformation(25, 3))) + .into(((DataViewHolder) holder).imageView); + } else { + imageRequestBuilder.into(((DataViewHolder) holder).imageView); + } + } @Override public int getItemCount() { if(mPostData == null || mPostData.isEmpty()) { @@ -496,7 +507,7 @@ class PostRecyclerViewAdapter extends RecyclerView.Adapter() { + mImageView.setVisibility(View.VISIBLE); + loadImage(); + /*RequestBuilder imageRequestBuilder = Glide.with(this).load(mPostData.getPreviewUrl()).listener(new RequestListener() { @Override public boolean onLoadFailed(@Nullable GlideException e, Object model, Target target, boolean isFirstResource) { - //Need to be implemented + progressBar.setVisibility(View.GONE); return false; } @@ -169,10 +175,10 @@ public class ViewPostDetailActivity extends AppCompatActivity { if(mPostData.isNSFW()) { imageRequestBuilder.apply(RequestOptions.bitmapTransform(new BlurTransformation(50, 3))) - .into(imageView); + .into(mImageView); } else { - imageRequestBuilder.into(imageView); - } + imageRequestBuilder.into(mImageView); + }*/ } mRecyclerView.setNestedScrollingEnabled(false); @@ -222,7 +228,7 @@ public class ViewPostDetailActivity extends AppCompatActivity { switch (mPostData.getPostType()) { case PostData.IMAGE_TYPE: typeTextView.setText("IMAGE"); - imageView.setOnClickListener(new View.OnClickListener() { + mImageView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Intent intent = new Intent(ViewPostDetailActivity.this, ViewImageActivity.class); @@ -241,7 +247,7 @@ public class ViewPostDetailActivity extends AppCompatActivity { contentTextView.setHtml(mPostData.getSelfText()); } - imageView.setOnClickListener(new View.OnClickListener() { + mImageView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { CustomTabsIntent.Builder builder = new CustomTabsIntent.Builder(); @@ -257,7 +263,7 @@ public class ViewPostDetailActivity extends AppCompatActivity { typeTextView.setText("VIDEO"); final Uri gifVideoUri = Uri.parse(mPostData.getVideoUrl()); - imageView.setOnClickListener(new View.OnClickListener() { + mImageView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Intent intent = new Intent(ViewPostDetailActivity.this, ViewVideoActivity.class); @@ -278,7 +284,7 @@ public class ViewPostDetailActivity extends AppCompatActivity { typeTextView.setText("VIDEO"); final Uri videoUri = Uri.parse(mPostData.getVideoUrl()); - imageView.setOnClickListener(new View.OnClickListener() { + mImageView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Intent intent = new Intent(ViewPostDetailActivity.this, ViewVideoActivity.class); @@ -524,6 +530,38 @@ public class ViewPostDetailActivity extends AppCompatActivity { }); } + private void loadImage() { + RequestBuilder imageRequestBuilder = Glide.with(this).load(mPostData.getPreviewUrl()).listener(new RequestListener() { + @Override + public boolean onLoadFailed(@Nullable GlideException e, Object model, Target target, boolean isFirstResource) { + mLoadImageProgressBar.setVisibility(View.GONE); + mLoadImageErrorTextView.setVisibility(View.VISIBLE); + mLoadImageErrorTextView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + mLoadImageProgressBar.setVisibility(View.VISIBLE); + mLoadImageErrorTextView.setVisibility(View.GONE); + loadImage(); + } + }); + return false; + } + + @Override + public boolean onResourceReady(Drawable resource, Object model, Target target, DataSource dataSource, boolean isFirstResource) { + mLoadWrapper.setVisibility(View.GONE); + return false; + } + }); + + if(mPostData.isNSFW()) { + imageRequestBuilder.apply(RequestOptions.bitmapTransform(new BlurTransformation(50, 3))) + .into(mImageView); + } else { + imageRequestBuilder.into(mImageView); + } + } + private void showRetrySnackbar() { Snackbar snackbar = Snackbar.make(mCoordinatorLayout, R.string.load_comment_failed, Snackbar.LENGTH_INDEFINITE); snackbar.setAction(R.string.retry, new View.OnClickListener() { diff --git a/app/src/main/res/drawable/ic_error_outline_black_24dp.xml b/app/src/main/res/drawable/ic_error_outline_black_24dp.xml new file mode 100644 index 00000000..a07a0f90 --- /dev/null +++ b/app/src/main/res/drawable/ic_error_outline_black_24dp.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/layout/activity_view_post_detail.xml b/app/src/main/res/layout/activity_view_post_detail.xml index c3a1c688..025f8ef1 100644 --- a/app/src/main/res/layout/activity_view_post_detail.xml +++ b/app/src/main/res/layout/activity_view_post_detail.xml @@ -144,12 +144,6 @@ android:layout_marginTop="16dp" android:visibility="gone"> - - + + + + + + + + @@ -18,7 +18,7 @@ android:id="@+id/relative_layout_footer_progress_bar_item" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginTop="8dp" + android:layout_marginTop="16dp" android:layout_marginBottom="16dp" android:layout_marginLeft="16dp" android:layout_marginStart="16dp" @@ -41,6 +41,7 @@ android:layout_height="wrap_content" android:layout_alignParentEnd="true" android:layout_centerVertical="true" + android:background="@color/colorAccent" android:text="@string/retry" /> diff --git a/app/src/main/res/layout/item_post.xml b/app/src/main/res/layout/item_post.xml index 78a55cf2..c34ee582 100644 --- a/app/src/main/res/layout/item_post.xml +++ b/app/src/main/res/layout/item_post.xml @@ -1,208 +1,229 @@ + + - + android:layout_height="wrap_content" + android:layout_marginBottom="8dp" + android:layout_marginLeft="16dp" + android:layout_marginStart="16dp" + android:layout_marginRight="16dp" + android:layout_marginEnd="16dp" + android:layout_marginTop="16dp"> + + - + android:layout_toStartOf="@id/stickied_post_image_view_best_post_item" + android:layout_toEndOf="@id/subreddit_icon_circle_image_view_best_post_item" + android:layout_centerVertical="true" + android:textColor="#E91E63"/> - + - - - + - + - + + + + android:layout_centerVertical="true" + android:textColor="@android:color/white"/> - + + + android:layout_marginStart="4dp" + android:layout_marginEnd="8dp" + android:layout_toEndOf="@id/gilded_image_view_item_best_post" + android:layout_toStartOf="@id/nsfw_text_view_item_best_post" + android:layout_centerVertical="true" + android:visibility="gone" + android:textSize="20sp" + android:textColor="@color/gold"/> - - - + - + - + - + - + android:layout_height="match_parent" + android:scaleType="centerCrop" /> - + - + android:layout_height="wrap_content" + android:drawableTop="@drawable/ic_error_outline_black_24dp" + android:layout_gravity="center" + android:gravity="center" + android:text="@string/tap_to_retry" /> - + - + - - - + + + - + - - - + - + - + + + + + - \ No newline at end of file + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 3616ff91..325f4684 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -9,6 +9,7 @@ Download Refresh + Error loading image. Tap to retry. Error loading posts.\nTap to retry. Cannot load posts -- cgit v1.2.3