mirror of
				https://codeberg.org/Bazsalanszky/Infinity-For-Lemmy.git
				synced 2025-10-30 00:18:07 +01:00 
			
		
		
		
	Support viewing Reddit Gallery in app. Fix gif not autoplayable in CommentAndPostRecyclerViewAdapter.
This commit is contained in:
		| @@ -23,7 +23,12 @@ | ||||
|         android:theme="@style/AppTheme" | ||||
|         android:usesCleartextTraffic="true" | ||||
|         tools:replace="android:label"> | ||||
|         <activity android:name=".Activity.SendPrivateMessageActivity" | ||||
|         <activity android:name=".Activity.ViewRedditGalleryActivity" | ||||
|             android:configChanges="orientation|screenSize|layoutDirection" | ||||
|             android:parentActivityName=".Activity.MainActivity" | ||||
|             android:theme="@style/AppTheme.Draggable" /> | ||||
|         <activity | ||||
|             android:name=".Activity.SendPrivateMessageActivity" | ||||
|             android:label="@string/send_private_message_activity_label" | ||||
|             android:parentActivityName=".Activity.MainActivity" | ||||
|             android:theme="@style/AppTheme.NoActionBar" | ||||
| @@ -322,7 +327,6 @@ | ||||
|                 android:name="android.support.FILE_PROVIDER_PATHS" | ||||
|                 android:resource="@xml/file_paths" /> | ||||
|         </provider> | ||||
|  | ||||
|         <provider | ||||
|             android:name="androidx.startup.InitializationProvider" | ||||
|             android:authorities="${applicationId}.androidx-startup" | ||||
|   | ||||
| @@ -0,0 +1,237 @@ | ||||
| package ml.docilealligator.infinityforreddit.Activity; | ||||
|  | ||||
| import android.content.SharedPreferences; | ||||
| import android.graphics.drawable.ColorDrawable; | ||||
| import android.graphics.drawable.Drawable; | ||||
| import android.os.Bundle; | ||||
| import android.view.Menu; | ||||
| import android.view.MenuItem; | ||||
| import android.widget.Toast; | ||||
|  | ||||
| import androidx.annotation.NonNull; | ||||
| import androidx.appcompat.app.ActionBar; | ||||
| import androidx.appcompat.app.AppCompatActivity; | ||||
| import androidx.fragment.app.Fragment; | ||||
| import androidx.fragment.app.FragmentManager; | ||||
| import androidx.fragment.app.FragmentStatePagerAdapter; | ||||
| import androidx.viewpager.widget.ViewPager; | ||||
|  | ||||
| import com.thefuntasty.hauler.DragDirection; | ||||
| import com.thefuntasty.hauler.HaulerView; | ||||
|  | ||||
| import java.util.ArrayList; | ||||
|  | ||||
| import javax.inject.Inject; | ||||
| import javax.inject.Named; | ||||
|  | ||||
| import butterknife.BindView; | ||||
| import butterknife.ButterKnife; | ||||
| import ml.docilealligator.infinityforreddit.Font.ContentFontFamily; | ||||
| import ml.docilealligator.infinityforreddit.Font.ContentFontStyle; | ||||
| import ml.docilealligator.infinityforreddit.Font.FontFamily; | ||||
| import ml.docilealligator.infinityforreddit.Font.FontStyle; | ||||
| import ml.docilealligator.infinityforreddit.Font.TitleFontFamily; | ||||
| import ml.docilealligator.infinityforreddit.Font.TitleFontStyle; | ||||
| import ml.docilealligator.infinityforreddit.Fragment.ViewRedditGalleryImageOrGifFragment; | ||||
| import ml.docilealligator.infinityforreddit.Fragment.ViewRedditGalleryVideoFragment; | ||||
| import ml.docilealligator.infinityforreddit.Infinity; | ||||
| import ml.docilealligator.infinityforreddit.Post.Post; | ||||
| import ml.docilealligator.infinityforreddit.R; | ||||
| import ml.docilealligator.infinityforreddit.SetAsWallpaperCallback; | ||||
| import ml.docilealligator.infinityforreddit.Utils.SharedPreferencesUtils; | ||||
| import ml.docilealligator.infinityforreddit.WallpaperSetter; | ||||
|  | ||||
| public class ViewRedditGalleryActivity extends AppCompatActivity implements SetAsWallpaperCallback { | ||||
|  | ||||
|     public static final String EXTRA_REDDIT_GALLERY = "ERG"; | ||||
|  | ||||
|     @BindView(R.id.hauler_view_view_reddit_gallery_activity) | ||||
|     HaulerView haulerView; | ||||
|     @BindView(R.id.view_pager_view_reddit_gallery_activity) | ||||
|     ViewPager viewPager; | ||||
|     private SectionsPagerAdapter sectionsPagerAdapter; | ||||
|     private ArrayList<Post.Gallery> gallery; | ||||
|     @Inject | ||||
|     @Named("default") | ||||
|     SharedPreferences sharedPreferences; | ||||
|  | ||||
|     @Override | ||||
|     protected void onCreate(Bundle savedInstanceState) { | ||||
|         super.onCreate(savedInstanceState); | ||||
|  | ||||
|         ((Infinity) getApplication()).getAppComponent().inject(this); | ||||
|  | ||||
|         getTheme().applyStyle(R.style.Theme_Normal, true); | ||||
|  | ||||
|         getTheme().applyStyle(FontStyle.valueOf(sharedPreferences | ||||
|                 .getString(SharedPreferencesUtils.FONT_SIZE_KEY, FontStyle.Normal.name())).getResId(), true); | ||||
|  | ||||
|         getTheme().applyStyle(TitleFontStyle.valueOf(sharedPreferences | ||||
|                 .getString(SharedPreferencesUtils.TITLE_FONT_SIZE_KEY, TitleFontStyle.Normal.name())).getResId(), true); | ||||
|  | ||||
|         getTheme().applyStyle(ContentFontStyle.valueOf(sharedPreferences | ||||
|                 .getString(SharedPreferencesUtils.CONTENT_FONT_SIZE_KEY, ContentFontStyle.Normal.name())).getResId(), true); | ||||
|  | ||||
|         getTheme().applyStyle(FontFamily.valueOf(sharedPreferences | ||||
|                 .getString(SharedPreferencesUtils.FONT_FAMILY_KEY, FontFamily.Default.name())).getResId(), true); | ||||
|  | ||||
|         getTheme().applyStyle(TitleFontFamily.valueOf(sharedPreferences | ||||
|                 .getString(SharedPreferencesUtils.TITLE_FONT_FAMILY_KEY, TitleFontFamily.Default.name())).getResId(), true); | ||||
|  | ||||
|         getTheme().applyStyle(ContentFontFamily.valueOf(sharedPreferences | ||||
|                 .getString(SharedPreferencesUtils.CONTENT_FONT_FAMILY_KEY, ContentFontFamily.Default.name())).getResId(), true); | ||||
|  | ||||
|         setContentView(R.layout.activity_view_reddit_gallery); | ||||
|  | ||||
|         ButterKnife.bind(this); | ||||
|  | ||||
|         ActionBar actionBar = getSupportActionBar(); | ||||
|         Drawable upArrow = getResources().getDrawable(R.drawable.ic_arrow_back_white_24dp); | ||||
|         actionBar.setHomeAsUpIndicator(upArrow); | ||||
|         actionBar.setBackgroundDrawable(new ColorDrawable(getResources().getColor(R.color.transparentActionBarAndExoPlayerControllerColor))); | ||||
|  | ||||
|         setTitle(" "); | ||||
|  | ||||
|         gallery = getIntent().getParcelableArrayListExtra(EXTRA_REDDIT_GALLERY); | ||||
|         if (gallery == null || gallery.isEmpty()) { | ||||
|             finish(); | ||||
|             return; | ||||
|         } | ||||
|  | ||||
|         haulerView.setOnDragDismissedListener(dragDirection -> { | ||||
|             int slide = dragDirection == DragDirection.UP ? R.anim.slide_out_up : R.anim.slide_out_down; | ||||
|             finish(); | ||||
|             overridePendingTransition(0, slide); | ||||
|         }); | ||||
|  | ||||
|         setupViewPager(); | ||||
|     } | ||||
|  | ||||
|     private void setupViewPager() { | ||||
|         setToolbarTitle(0); | ||||
|         sectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager()); | ||||
|         viewPager.addOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() { | ||||
|             @Override | ||||
|             public void onPageSelected(int position) { | ||||
|                 setToolbarTitle(position); | ||||
|             } | ||||
|         }); | ||||
|         viewPager.setAdapter(sectionsPagerAdapter); | ||||
|     } | ||||
|  | ||||
|     private void setToolbarTitle(int position) { | ||||
|         if (gallery != null && position >= 0 && position < gallery.size()) { | ||||
|             if (gallery.get(position).mediaType == Post.Gallery.TYPE_IMAGE) { | ||||
|                 setTitle(getString(R.string.view_reddit_gallery_activity_image_label, position + 1, gallery.size())); | ||||
|             } else if (gallery.get(position).mediaType == Post.Gallery.TYPE_GIF) { | ||||
|                 setTitle(getString(R.string.view_reddit_gallery_activity_gif_label, position + 1, gallery.size())); | ||||
|             } else { | ||||
|                 setTitle(getString(R.string.view_reddit_gallery_activity_video_label, position + 1, gallery.size())); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public boolean onCreateOptionsMenu(Menu menu) { | ||||
|         return true; | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public boolean onOptionsItemSelected(@NonNull MenuItem item) { | ||||
|         if (item.getItemId() == android.R.id.home) { | ||||
|             finish(); | ||||
|             return true; | ||||
|         } | ||||
|  | ||||
|         return false; | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public void setToHomeScreen(int viewPagerPosition) { | ||||
|         if (gallery != null && viewPagerPosition >= 0 && viewPagerPosition < gallery.size()) { | ||||
|             WallpaperSetter.set(gallery.get(viewPagerPosition).url, WallpaperSetter.HOME_SCREEN, this, | ||||
|                     new WallpaperSetter.SetWallpaperListener() { | ||||
|                         @Override | ||||
|                         public void success() { | ||||
|                             Toast.makeText(ViewRedditGalleryActivity.this, R.string.wallpaper_set, Toast.LENGTH_SHORT).show(); | ||||
|                         } | ||||
|  | ||||
|                         @Override | ||||
|                         public void failed() { | ||||
|                             Toast.makeText(ViewRedditGalleryActivity.this, R.string.error_set_wallpaper, Toast.LENGTH_SHORT).show(); | ||||
|                         } | ||||
|                     }); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public void setToLockScreen(int viewPagerPosition) { | ||||
|         if (gallery != null && viewPagerPosition >= 0 && viewPagerPosition < gallery.size()) { | ||||
|             WallpaperSetter.set(gallery.get(viewPagerPosition).url, WallpaperSetter.LOCK_SCREEN, this, | ||||
|                     new WallpaperSetter.SetWallpaperListener() { | ||||
|                         @Override | ||||
|                         public void success() { | ||||
|                             Toast.makeText(ViewRedditGalleryActivity.this, R.string.wallpaper_set, Toast.LENGTH_SHORT).show(); | ||||
|                         } | ||||
|  | ||||
|                         @Override | ||||
|                         public void failed() { | ||||
|                             Toast.makeText(ViewRedditGalleryActivity.this, R.string.error_set_wallpaper, Toast.LENGTH_SHORT).show(); | ||||
|                         } | ||||
|                     }); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public void setToBoth(int viewPagerPosition) { | ||||
|         if (gallery != null && viewPagerPosition >= 0 && viewPagerPosition < gallery.size()) { | ||||
|             WallpaperSetter.set(gallery.get(viewPagerPosition).url, WallpaperSetter.BOTH_SCREENS, this, | ||||
|                     new WallpaperSetter.SetWallpaperListener() { | ||||
|                         @Override | ||||
|                         public void success() { | ||||
|                             Toast.makeText(ViewRedditGalleryActivity.this, R.string.wallpaper_set, Toast.LENGTH_SHORT).show(); | ||||
|                         } | ||||
|  | ||||
|                         @Override | ||||
|                         public void failed() { | ||||
|                             Toast.makeText(ViewRedditGalleryActivity.this, R.string.error_set_wallpaper, Toast.LENGTH_SHORT).show(); | ||||
|                         } | ||||
|                     }); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     public int getCurrentPagePosition() { | ||||
|         return viewPager.getCurrentItem(); | ||||
|     } | ||||
|  | ||||
|     private class SectionsPagerAdapter extends FragmentStatePagerAdapter { | ||||
|  | ||||
|         SectionsPagerAdapter(@NonNull FragmentManager fm) { | ||||
|             super(fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT); | ||||
|         } | ||||
|  | ||||
|         @NonNull | ||||
|         @Override | ||||
|         public Fragment getItem(int position) { | ||||
|             Post.Gallery media = gallery.get(position); | ||||
|             if (media.mediaType == Post.Gallery.TYPE_VIDEO) { | ||||
|                 ViewRedditGalleryVideoFragment fragment = new ViewRedditGalleryVideoFragment(); | ||||
|                 Bundle bundle = new Bundle(); | ||||
|                 bundle.putParcelable(ViewRedditGalleryVideoFragment.EXTRA_REDDIT_GALLERY_VIDEO, media); | ||||
|                 fragment.setArguments(bundle); | ||||
|                 return fragment; | ||||
|             } else { | ||||
|                 ViewRedditGalleryImageOrGifFragment fragment = new ViewRedditGalleryImageOrGifFragment(); | ||||
|                 Bundle bundle = new Bundle(); | ||||
|                 bundle.putParcelable(ViewRedditGalleryImageOrGifFragment.EXTRA_REDDIT_GALLERY_MEDIA, media); | ||||
|                 fragment.setArguments(bundle); | ||||
|                 return fragment; | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         @Override | ||||
|         public int getCount() { | ||||
|             return gallery.size(); | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @@ -85,6 +85,7 @@ import ml.docilealligator.infinityforreddit.Activity.FilteredThingActivity; | ||||
| import ml.docilealligator.infinityforreddit.Activity.LinkResolverActivity; | ||||
| import ml.docilealligator.infinityforreddit.Activity.ViewImageOrGifActivity; | ||||
| import ml.docilealligator.infinityforreddit.Activity.ViewPostDetailActivity; | ||||
| import ml.docilealligator.infinityforreddit.Activity.ViewRedditGalleryActivity; | ||||
| import ml.docilealligator.infinityforreddit.Activity.ViewSubredditDetailActivity; | ||||
| import ml.docilealligator.infinityforreddit.Activity.ViewUserDetailActivity; | ||||
| import ml.docilealligator.infinityforreddit.Activity.ViewVideoActivity; | ||||
| @@ -119,16 +120,17 @@ public class CommentAndPostRecyclerViewAdapter extends RecyclerView.Adapter<Recy | ||||
|     private static final int VIEW_TYPE_POST_DETAIL_IMAGE_AND_GIF_AUTOPLAY = 3; | ||||
|     private static final int VIEW_TYPE_POST_DETAIL_LINK = 4; | ||||
|     private static final int VIEW_TYPE_POST_DETAIL_NO_PREVIEW_LINK = 5; | ||||
|     private static final int VIEW_TYPE_POST_DETAIL_TEXT_TYPE = 6; | ||||
|     private static final int VIEW_TYPE_FIRST_LOADING = 7; | ||||
|     private static final int VIEW_TYPE_FIRST_LOADING_FAILED = 8; | ||||
|     private static final int VIEW_TYPE_NO_COMMENT_PLACEHOLDER = 9; | ||||
|     private static final int VIEW_TYPE_COMMENT = 10; | ||||
|     private static final int VIEW_TYPE_COMMENT_FULLY_COLLAPSED = 11; | ||||
|     private static final int VIEW_TYPE_LOAD_MORE_CHILD_COMMENTS = 12; | ||||
|     private static final int VIEW_TYPE_IS_LOADING_MORE_COMMENTS = 13; | ||||
|     private static final int VIEW_TYPE_LOAD_MORE_COMMENTS_FAILED = 14; | ||||
|     private static final int VIEW_TYPE_VIEW_ALL_COMMENTS = 15; | ||||
|     private static final int VIEW_TYPE_POST_DETAIL_GALLERY = 6; | ||||
|     private static final int VIEW_TYPE_POST_DETAIL_TEXT_TYPE = 7; | ||||
|     private static final int VIEW_TYPE_FIRST_LOADING = 8; | ||||
|     private static final int VIEW_TYPE_FIRST_LOADING_FAILED = 9; | ||||
|     private static final int VIEW_TYPE_NO_COMMENT_PLACEHOLDER = 10; | ||||
|     private static final int VIEW_TYPE_COMMENT = 11; | ||||
|     private static final int VIEW_TYPE_COMMENT_FULLY_COLLAPSED = 12; | ||||
|     private static final int VIEW_TYPE_LOAD_MORE_CHILD_COMMENTS = 13; | ||||
|     private static final int VIEW_TYPE_IS_LOADING_MORE_COMMENTS = 14; | ||||
|     private static final int VIEW_TYPE_LOAD_MORE_COMMENTS_FAILED = 15; | ||||
|     private static final int VIEW_TYPE_VIEW_ALL_COMMENTS = 16; | ||||
|  | ||||
|     private AppCompatActivity mActivity; | ||||
|     private Retrofit mRetrofit; | ||||
| @@ -444,6 +446,8 @@ public class CommentAndPostRecyclerViewAdapter extends RecyclerView.Adapter<Recy | ||||
|                     return VIEW_TYPE_POST_DETAIL_LINK; | ||||
|                 case Post.NO_PREVIEW_LINK_TYPE: | ||||
|                     return VIEW_TYPE_POST_DETAIL_NO_PREVIEW_LINK; | ||||
|                 case Post.GALLERY_TYPE: | ||||
|                     return VIEW_TYPE_POST_DETAIL_GALLERY; | ||||
|                 default: | ||||
|                     return VIEW_TYPE_POST_DETAIL_TEXT_TYPE; | ||||
|  | ||||
| @@ -519,6 +523,8 @@ public class CommentAndPostRecyclerViewAdapter extends RecyclerView.Adapter<Recy | ||||
|                 return new PostDetailLinkViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.item_post_detail_link, parent, false)); | ||||
|             case VIEW_TYPE_POST_DETAIL_NO_PREVIEW_LINK: | ||||
|                 return new PostDetailNoPreviewLinkViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.item_post_detail_no_preview_link, parent, false)); | ||||
|             case VIEW_TYPE_POST_DETAIL_GALLERY: | ||||
|                 return new PostDetailGalleryViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.item_post_detail_gallery, parent, false)); | ||||
|             case VIEW_TYPE_POST_DETAIL_TEXT_TYPE: | ||||
|                 return new PostDetailTextViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.item_post_detail_text, parent, false)); | ||||
|             case VIEW_TYPE_FIRST_LOADING: | ||||
| @@ -761,6 +767,16 @@ public class CommentAndPostRecyclerViewAdapter extends RecyclerView.Adapter<Recy | ||||
|                     mMarkwonAdapter.setMarkdown(mPostDetailMarkwon, mPost.getSelfText()); | ||||
|                     mMarkwonAdapter.notifyDataSetChanged(); | ||||
|                 } | ||||
|             } else if (holder instanceof PostDetailGalleryViewHolder) { | ||||
|                 if (mPost.getPreviewUrl() != null && !mPost.getPreviewUrl().equals("")) { | ||||
|                     ((PostDetailGalleryViewHolder) holder).mRelativeLayout.setVisibility(View.VISIBLE); | ||||
|                     ((PostDetailGalleryViewHolder) holder).mImageView | ||||
|                             .setRatio((float) mPost.getPreviewHeight() / mPost.getPreviewWidth()); | ||||
|  | ||||
|                     loadImage((PostDetailGalleryViewHolder) holder); | ||||
|                 } else { | ||||
|                     ((PostDetailGalleryViewHolder) holder).mNoPreviewLinkImageView.setVisibility(View.VISIBLE); | ||||
|                 } | ||||
|             } else if (holder instanceof PostDetailTextViewHolder) { | ||||
|                 if (mPost.getSelfText() != null && !mPost.getSelfText().equals("")) { | ||||
|                     ((PostDetailTextViewHolder) holder).mContentMarkdownView.setVisibility(View.VISIBLE); | ||||
| @@ -1224,7 +1240,8 @@ public class CommentAndPostRecyclerViewAdapter extends RecyclerView.Adapter<Recy | ||||
|  | ||||
|     private void loadImage(PostDetailBaseViewHolder holder) { | ||||
|         if (holder instanceof PostDetailImageAndGifAutoplayViewHolder) { | ||||
|             RequestBuilder<Drawable> imageRequestBuilder = mGlide.load(mPost.getPreviewUrl()) | ||||
|             String url = mPost.getPostType() == Post.IMAGE_TYPE ? mPost.getPreviewUrl() : mPost.getUrl(); | ||||
|             RequestBuilder<Drawable> imageRequestBuilder = mGlide.load(url) | ||||
|                     .listener(new RequestListener<Drawable>() { | ||||
|                         @Override | ||||
|                         public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<Drawable> target, boolean isFirstResource) { | ||||
| @@ -1318,6 +1335,37 @@ public class CommentAndPostRecyclerViewAdapter extends RecyclerView.Adapter<Recy | ||||
|                     imageRequestBuilder.into(((PostDetailLinkViewHolder) holder).mImageView); | ||||
|                 } | ||||
|             } | ||||
|         } else if (holder instanceof PostDetailGalleryViewHolder) { | ||||
|             RequestBuilder<Drawable> imageRequestBuilder = mGlide.load(mPost.getPreviewUrl()) | ||||
|                     .listener(new RequestListener<Drawable>() { | ||||
|                         @Override | ||||
|                         public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<Drawable> target, boolean isFirstResource) { | ||||
|                             ((PostDetailGalleryViewHolder) holder).mLoadImageProgressBar.setVisibility(View.GONE); | ||||
|                             ((PostDetailGalleryViewHolder) holder).mLoadImageErrorTextView.setVisibility(View.VISIBLE); | ||||
|                             ((PostDetailGalleryViewHolder) holder).mLoadImageErrorTextView.setOnClickListener(view -> { | ||||
|                                 ((PostDetailGalleryViewHolder) holder).mLoadImageProgressBar.setVisibility(View.VISIBLE); | ||||
|                                 ((PostDetailGalleryViewHolder) holder).mLoadImageErrorTextView.setVisibility(View.GONE); | ||||
|                                 loadImage(holder); | ||||
|                             }); | ||||
|                             return false; | ||||
|                         } | ||||
|  | ||||
|                         @Override | ||||
|                         public boolean onResourceReady(Drawable resource, Object model, Target<Drawable> target, DataSource dataSource, boolean isFirstResource) { | ||||
|                             ((PostDetailGalleryViewHolder) holder).mLoadWrapper.setVisibility(View.GONE); | ||||
|                             return false; | ||||
|                         } | ||||
|                     }); | ||||
|  | ||||
|             if ((mPost.isNSFW() && mNeedBlurNsfw  && !(mPost.getPostType() == Post.GIF_TYPE && mAutoplayNsfwVideos)) || (mPost.isSpoiler() && mNeedBlurSpoiler)) { | ||||
|                 imageRequestBuilder.apply(RequestOptions.bitmapTransform(new BlurTransformation(50, 10))).into(((PostDetailGalleryViewHolder) holder).mImageView); | ||||
|             } else { | ||||
|                 if (mImageViewWidth > mPost.getPreviewWidth()) { | ||||
|                     imageRequestBuilder.override(Target.SIZE_ORIGINAL).into(((PostDetailGalleryViewHolder) holder).mImageView); | ||||
|                 } else { | ||||
|                     imageRequestBuilder.into(((PostDetailGalleryViewHolder) holder).mImageView); | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
| @@ -2706,6 +2754,103 @@ public class CommentAndPostRecyclerViewAdapter extends RecyclerView.Adapter<Recy | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     class PostDetailGalleryViewHolder extends PostDetailBaseViewHolder { | ||||
|         @BindView(R.id.icon_gif_image_view_item_post_detail_gallery) | ||||
|         AspectRatioGifImageView mIconGifImageView; | ||||
|         @BindView(R.id.subreddit_text_view_item_post_detail_gallery) | ||||
|         TextView mSubredditTextView; | ||||
|         @BindView(R.id.user_text_view_item_post_detail_gallery) | ||||
|         TextView mUserTextView; | ||||
|         @BindView(R.id.author_flair_text_view_item_post_detail_gallery) | ||||
|         TextView mAuthorFlairTextView; | ||||
|         @BindView(R.id.post_time_text_view_item_post_detail_gallery) | ||||
|         TextView mPostTimeTextView; | ||||
|         @BindView(R.id.title_text_view_item_post_detail_gallery) | ||||
|         TextView mTitleTextView; | ||||
|         @BindView(R.id.type_text_view_item_post_detail_gallery) | ||||
|         CustomTextView mTypeTextView; | ||||
|         @BindView(R.id.crosspost_image_view_item_post_detail_gallery) | ||||
|         ImageView mCrosspostImageView; | ||||
|         @BindView(R.id.archived_image_view_item_post_detail_gallery) | ||||
|         ImageView mArchivedImageView; | ||||
|         @BindView(R.id.locked_image_view_item_post_detail_gallery) | ||||
|         ImageView mLockedImageView; | ||||
|         @BindView(R.id.nsfw_text_view_item_post_detail_gallery) | ||||
|         CustomTextView mNSFWTextView; | ||||
|         @BindView(R.id.spoiler_custom_text_view_item_post_detail_gallery) | ||||
|         CustomTextView mSpoilerTextView; | ||||
|         @BindView(R.id.flair_custom_text_view_item_post_detail_gallery) | ||||
|         CustomTextView mFlairTextView; | ||||
|         @BindView(R.id.awards_text_view_item_post_detail_gallery) | ||||
|         TextView mAwardsTextView; | ||||
|         @BindView(R.id.image_view_wrapper_item_post_detail_gallery) | ||||
|         RelativeLayout mRelativeLayout; | ||||
|         @BindView(R.id.load_wrapper_item_post_detail_gallery) | ||||
|         RelativeLayout mLoadWrapper; | ||||
|         @BindView(R.id.progress_bar_item_post_detail_gallery) | ||||
|         ProgressBar mLoadImageProgressBar; | ||||
|         @BindView(R.id.load_image_error_text_view_item_post_detail_gallery) | ||||
|         TextView mLoadImageErrorTextView; | ||||
|         @BindView(R.id.image_view_item_post_detail_gallery) | ||||
|         AspectRatioGifImageView mImageView; | ||||
|         @BindView(R.id.image_view_no_preview_link_item_post_detail_gallery) | ||||
|         ImageView mNoPreviewLinkImageView; | ||||
|         @BindView(R.id.bottom_constraint_layout_item_post_detail_gallery) | ||||
|         ConstraintLayout mBottomConstraintLayout; | ||||
|         @BindView(R.id.plus_button_item_post_detail_gallery) | ||||
|         ImageView mUpvoteButton; | ||||
|         @BindView(R.id.score_text_view_item_post_detail_gallery) | ||||
|         TextView mScoreTextView; | ||||
|         @BindView(R.id.minus_button_item_post_detail_gallery) | ||||
|         ImageView mDownvoteButton; | ||||
|         @BindView(R.id.comments_count_item_post_detail_gallery) | ||||
|         TextView commentsCountTextView; | ||||
|         @BindView(R.id.save_button_item_post_detail_gallery) | ||||
|         ImageView mSaveButton; | ||||
|         @BindView(R.id.share_button_item_post_detail_gallery) | ||||
|         ImageView mShareButton; | ||||
|  | ||||
|         PostDetailGalleryViewHolder(@NonNull View itemView) { | ||||
|             super(itemView); | ||||
|             ButterKnife.bind(this, itemView); | ||||
|             setBaseView(mIconGifImageView, | ||||
|                     mSubredditTextView, | ||||
|                     mUserTextView, | ||||
|                     mAuthorFlairTextView, | ||||
|                     mPostTimeTextView, | ||||
|                     mTitleTextView, | ||||
|                     mTypeTextView, | ||||
|                     mCrosspostImageView, | ||||
|                     mArchivedImageView, | ||||
|                     mLockedImageView, | ||||
|                     mNSFWTextView, | ||||
|                     mSpoilerTextView, | ||||
|                     mFlairTextView, | ||||
|                     mAwardsTextView, | ||||
|                     mBottomConstraintLayout, | ||||
|                     mUpvoteButton, | ||||
|                     mScoreTextView, | ||||
|                     mDownvoteButton, | ||||
|                     commentsCountTextView, | ||||
|                     mSaveButton, | ||||
|                     mShareButton); | ||||
|  | ||||
|             mLoadImageProgressBar.setIndeterminateTintList(ColorStateList.valueOf(mColorAccent)); | ||||
|             mLoadImageErrorTextView.setTextColor(mPrimaryTextColor); | ||||
|             mNoPreviewLinkImageView.setBackgroundColor(mNoPreviewLinkBackgroundColor); | ||||
|  | ||||
|             mImageView.setOnClickListener(view -> { | ||||
|                 Intent intent = new Intent(mActivity, ViewRedditGalleryActivity.class); | ||||
|                 intent.putParcelableArrayListExtra(ViewRedditGalleryActivity.EXTRA_REDDIT_GALLERY, mPost.getGallery()); | ||||
|                 mActivity.startActivity(intent); | ||||
|             }); | ||||
|  | ||||
|             mNoPreviewLinkImageView.setOnClickListener(view -> { | ||||
|                 mImageView.performClick(); | ||||
|             }); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     class PostDetailTextViewHolder extends PostDetailBaseViewHolder { | ||||
|         @BindView(R.id.icon_gif_image_view_item_post_detail_text) | ||||
|         AspectRatioGifImageView mIconGifImageView; | ||||
|   | ||||
| @@ -70,6 +70,7 @@ import ml.docilealligator.infinityforreddit.Activity.FilteredThingActivity; | ||||
| import ml.docilealligator.infinityforreddit.Activity.LinkResolverActivity; | ||||
| import ml.docilealligator.infinityforreddit.Activity.ViewImageOrGifActivity; | ||||
| import ml.docilealligator.infinityforreddit.Activity.ViewPostDetailActivity; | ||||
| import ml.docilealligator.infinityforreddit.Activity.ViewRedditGalleryActivity; | ||||
| import ml.docilealligator.infinityforreddit.Activity.ViewSubredditDetailActivity; | ||||
| import ml.docilealligator.infinityforreddit.Activity.ViewUserDetailActivity; | ||||
| import ml.docilealligator.infinityforreddit.Activity.ViewVideoActivity; | ||||
| @@ -104,9 +105,10 @@ public class PostRecyclerViewAdapter extends PagedListAdapter<Post, RecyclerView | ||||
|     private static final int VIEW_TYPE_POST_CARD_LINK_TYPE = 4; | ||||
|     private static final int VIEW_TYPE_POST_CARD_NO_PREVIEW_LINK_TYPE = 5; | ||||
|     private static final int VIEW_TYPE_POST_CARD_TEXT_TYPE = 6; | ||||
|     private static final int VIEW_TYPE_POST_COMPACT = 7; | ||||
|     private static final int VIEW_TYPE_ERROR = 8; | ||||
|     private static final int VIEW_TYPE_LOADING = 9; | ||||
|     private static final int VIEW_TYPE_POST_CARD_GALLERY_TYPE = 7; | ||||
|     private static final int VIEW_TYPE_POST_COMPACT = 8; | ||||
|     private static final int VIEW_TYPE_ERROR = 9; | ||||
|     private static final int VIEW_TYPE_LOADING = 10; | ||||
|     private static final DiffUtil.ItemCallback<Post> DIFF_CALLBACK = new DiffUtil.ItemCallback<Post>() { | ||||
|         @Override | ||||
|         public boolean areItemsTheSame(@NonNull Post post, @NonNull Post t1) { | ||||
| @@ -309,6 +311,8 @@ public class PostRecyclerViewAdapter extends PagedListAdapter<Post, RecyclerView | ||||
|                             return VIEW_TYPE_POST_CARD_LINK_TYPE; | ||||
|                         case Post.NO_PREVIEW_LINK_TYPE: | ||||
|                             return VIEW_TYPE_POST_CARD_NO_PREVIEW_LINK_TYPE; | ||||
|                         case Post.GALLERY_TYPE: | ||||
|                             return VIEW_TYPE_POST_CARD_GALLERY_TYPE; | ||||
|                         default: | ||||
|                             return VIEW_TYPE_POST_CARD_TEXT_TYPE; | ||||
|                     } | ||||
| @@ -333,6 +337,8 @@ public class PostRecyclerViewAdapter extends PagedListAdapter<Post, RecyclerView | ||||
|             return new PostLinkTypeViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.item_post_link, parent, false)); | ||||
|         } else if (viewType == VIEW_TYPE_POST_CARD_NO_PREVIEW_LINK_TYPE) { | ||||
|             return new PostNoPreviewLinkTypeViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.item_post_no_preview_link, parent, false)); | ||||
|         } else if (viewType == VIEW_TYPE_POST_CARD_GALLERY_TYPE) { | ||||
|             return new PostGalleryTypeViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.item_post_gallery, parent, false)); | ||||
|         } else if (viewType == VIEW_TYPE_POST_CARD_TEXT_TYPE) { | ||||
|             return new PostTextTypeViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.item_post_text, parent, false)); | ||||
|         } else if (viewType == VIEW_TYPE_POST_COMPACT) { | ||||
| @@ -586,12 +592,20 @@ public class PostRecyclerViewAdapter extends PagedListAdapter<Post, RecyclerView | ||||
|                     loadImage(holder, post); | ||||
|  | ||||
|                     String domain = Uri.parse(post.getUrl()).getHost(); | ||||
|                     ((PostLinkTypeViewHolder) holder).linkTextView.setVisibility(View.VISIBLE); | ||||
|                     ((PostLinkTypeViewHolder) holder).linkTextView.setText(domain); | ||||
|                 } else if (holder instanceof PostNoPreviewLinkTypeViewHolder) { | ||||
|                     String noPreviewLinkDomain = Uri.parse(post.getUrl()).getHost(); | ||||
|                     ((PostNoPreviewLinkTypeViewHolder) holder).linkTextView.setVisibility(View.VISIBLE); | ||||
|                     ((PostNoPreviewLinkTypeViewHolder) holder).linkTextView.setText(noPreviewLinkDomain); | ||||
|                     ((PostNoPreviewLinkTypeViewHolder) holder).linkTextView.setText(Uri.parse(post.getUrl()).getHost()); | ||||
|                 } else if (holder instanceof PostGalleryTypeViewHolder) { | ||||
|                     if (post.getPreviewUrl() != null && !post.getPreviewUrl().equals("")) { | ||||
|                         ((PostGalleryTypeViewHolder) holder).imageWrapperRelativeLayout.setVisibility(View.VISIBLE); | ||||
|                         ((PostGalleryTypeViewHolder) holder).progressBar.setVisibility(View.VISIBLE); | ||||
|                         ((PostGalleryTypeViewHolder) holder).imageView | ||||
|                                 .setRatio((float) post.getPreviewHeight() / post.getPreviewWidth()); | ||||
|  | ||||
|                         loadImage(holder, post); | ||||
|                     } else { | ||||
|                         ((PostGalleryTypeViewHolder) holder).noPreviewLinkImageView.setVisibility(View.VISIBLE); | ||||
|                     } | ||||
|                 } else if (holder instanceof PostTextTypeViewHolder) { | ||||
|                     if (post.getSelfTextPlainTrimmed() != null && !post.getSelfTextPlainTrimmed().equals("")) { | ||||
|                         ((PostTextTypeViewHolder) holder).contentTextView.setVisibility(View.VISIBLE); | ||||
| @@ -945,6 +959,38 @@ public class PostRecyclerViewAdapter extends PagedListAdapter<Post, RecyclerView | ||||
|                     imageRequestBuilder.into(((PostLinkTypeViewHolder) holder).imageView); | ||||
|                 } | ||||
|             } | ||||
|         } else if (holder instanceof PostGalleryTypeViewHolder) { | ||||
|             RequestBuilder<Drawable> imageRequestBuilder = mGlide.load(post.getPreviewUrl()).listener(new RequestListener<Drawable>() { | ||||
|                 @Override | ||||
|                 public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<Drawable> target, boolean isFirstResource) { | ||||
|                     ((PostGalleryTypeViewHolder) holder).progressBar.setVisibility(View.GONE); | ||||
|                     ((PostGalleryTypeViewHolder) holder).errorRelativeLayout.setVisibility(View.VISIBLE); | ||||
|                     ((PostGalleryTypeViewHolder) holder).errorRelativeLayout.setOnClickListener(view -> { | ||||
|                         ((PostGalleryTypeViewHolder) holder).progressBar.setVisibility(View.VISIBLE); | ||||
|                         ((PostGalleryTypeViewHolder) holder).errorRelativeLayout.setVisibility(View.GONE); | ||||
|                         loadImage(holder, post); | ||||
|                     }); | ||||
|                     return false; | ||||
|                 } | ||||
|  | ||||
|                 @Override | ||||
|                 public boolean onResourceReady(Drawable resource, Object model, Target<Drawable> target, DataSource dataSource, boolean isFirstResource) { | ||||
|                     ((PostGalleryTypeViewHolder) holder).errorRelativeLayout.setVisibility(View.GONE); | ||||
|                     ((PostGalleryTypeViewHolder) holder).progressBar.setVisibility(View.GONE); | ||||
|                     return false; | ||||
|                 } | ||||
|             }); | ||||
|  | ||||
|             if ((post.isNSFW() && mNeedBlurNSFW && !(post.getPostType() == Post.GIF_TYPE && mAutoplayNsfwVideos)) || post.isSpoiler() && mNeedBlurSpoiler) { | ||||
|                 imageRequestBuilder.apply(RequestOptions.bitmapTransform(new BlurTransformation(50, 10))) | ||||
|                         .into(((PostGalleryTypeViewHolder) holder).imageView); | ||||
|             } else { | ||||
|                 if (mImageViewWidth > post.getPreviewWidth()) { | ||||
|                     imageRequestBuilder.override(Target.SIZE_ORIGINAL).into(((PostGalleryTypeViewHolder) holder).imageView); | ||||
|                 } else { | ||||
|                     imageRequestBuilder.into(((PostGalleryTypeViewHolder) holder).imageView); | ||||
|                 } | ||||
|             } | ||||
|         } else if (holder instanceof PostCompactBaseViewHolder) { | ||||
|             String previewUrl = post.getThumbnailPreviewUrl().equals("") ? post.getPreviewUrl() : post.getThumbnailPreviewUrl(); | ||||
|             RequestBuilder<Drawable> imageRequestBuilder = mGlide.load(previewUrl) | ||||
| @@ -1107,6 +1153,11 @@ public class PostRecyclerViewAdapter extends PagedListAdapter<Post, RecyclerView | ||||
|                 mGlide.clear(((PostLinkTypeViewHolder) holder).imageView); | ||||
|                 ((PostLinkTypeViewHolder) holder).imageView.getLayoutParams().height = FrameLayout.LayoutParams.WRAP_CONTENT; | ||||
|                 ((PostLinkTypeViewHolder) holder).errorRelativeLayout.setVisibility(View.GONE); | ||||
|             } else if (holder instanceof PostGalleryTypeViewHolder) { | ||||
|                 mGlide.clear(((PostGalleryTypeViewHolder) holder).imageView); | ||||
|                 ((PostGalleryTypeViewHolder) holder).imageWrapperRelativeLayout.setVisibility(View.GONE); | ||||
|                 ((PostGalleryTypeViewHolder) holder).errorRelativeLayout.setVisibility(View.GONE); | ||||
|                 ((PostGalleryTypeViewHolder) holder).noPreviewLinkImageView.setVisibility(View.GONE); | ||||
|             } else if (holder instanceof PostTextTypeViewHolder) { | ||||
|                 ((PostTextTypeViewHolder) holder).contentTextView.setVisibility(View.GONE); | ||||
|             } | ||||
| @@ -2233,6 +2284,109 @@ public class PostRecyclerViewAdapter extends PagedListAdapter<Post, RecyclerView | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     class PostGalleryTypeViewHolder extends PostBaseViewHolder { | ||||
|         @BindView(R.id.card_view_item_post_gallery_type) | ||||
|         MaterialCardView cardView; | ||||
|         @BindView(R.id.icon_gif_image_view_item_post_gallery_type) | ||||
|         AspectRatioGifImageView iconGifImageView; | ||||
|         @BindView(R.id.subreddit_name_text_view_item_post_gallery_type) | ||||
|         TextView subredditTextView; | ||||
|         @BindView(R.id.user_text_view_item_post_gallery_type) | ||||
|         TextView userTextView; | ||||
|         @BindView(R.id.stickied_post_image_view_item_post_gallery_type) | ||||
|         ImageView stickiedPostImageView; | ||||
|         @BindView(R.id.post_time_text_view_item_post_gallery_type) | ||||
|         TextView postTimeTextView; | ||||
|         @BindView(R.id.title_text_view_item_post_gallery_type) | ||||
|         TextView titleTextView; | ||||
|         @BindView(R.id.type_text_view_item_post_gallery_type) | ||||
|         CustomTextView typeTextView; | ||||
|         @BindView(R.id.archived_image_view_item_post_gallery_type) | ||||
|         ImageView archivedImageView; | ||||
|         @BindView(R.id.locked_image_view_item_post_gallery_type) | ||||
|         ImageView lockedImageView; | ||||
|         @BindView(R.id.crosspost_image_view_item_post_gallery_type) | ||||
|         ImageView crosspostImageView; | ||||
|         @BindView(R.id.nsfw_text_view_item_post_gallery_type) | ||||
|         CustomTextView nsfwTextView; | ||||
|         @BindView(R.id.spoiler_custom_text_view_item_post_gallery_type) | ||||
|         CustomTextView spoilerTextView; | ||||
|         @BindView(R.id.flair_custom_text_view_item_post_gallery_type) | ||||
|         CustomTextView flairTextView; | ||||
|         @BindView(R.id.awards_text_view_item_post_gallery_type) | ||||
|         CustomTextView awardsTextView; | ||||
|         @BindView(R.id.image_wrapper_relative_layout_item_post_gallery) | ||||
|         RelativeLayout imageWrapperRelativeLayout; | ||||
|         @BindView(R.id.progress_bar_item_post_gallery_type) | ||||
|         ProgressBar progressBar; | ||||
|         @BindView(R.id.image_view_item_post_gallery_type) | ||||
|         AspectRatioGifImageView imageView; | ||||
|         @BindView(R.id.load_image_error_relative_layout_item_post_gallery_type) | ||||
|         RelativeLayout errorRelativeLayout; | ||||
|         @BindView(R.id.load_image_error_text_view_item_post_gallery_type) | ||||
|         TextView errorTextView; | ||||
|         @BindView(R.id.image_view_no_preview_gallery_item_post_gallery_type) | ||||
|         ImageView noPreviewLinkImageView; | ||||
|         @BindView(R.id.bottom_constraint_layout_item_post_gallery_type) | ||||
|         ConstraintLayout bottomConstraintLayout; | ||||
|         @BindView(R.id.plus_button_item_post_gallery_type) | ||||
|         ImageView upvoteButton; | ||||
|         @BindView(R.id.score_text_view_item_post_gallery_type) | ||||
|         TextView scoreTextView; | ||||
|         @BindView(R.id.minus_button_item_post_gallery_type) | ||||
|         ImageView downvoteButton; | ||||
|         @BindView(R.id.comments_count_item_post_gallery_type) | ||||
|         TextView commentsCountTextView; | ||||
|         @BindView(R.id.save_button_item_post_gallery_type) | ||||
|         ImageView saveButton; | ||||
|         @BindView(R.id.share_button_item_post_gallery_type) | ||||
|         ImageView shareButton; | ||||
|  | ||||
|         PostGalleryTypeViewHolder(View itemView) { | ||||
|             super(itemView); | ||||
|             ButterKnife.bind(this, itemView); | ||||
|             setBaseView(cardView, | ||||
|                     iconGifImageView, | ||||
|                     subredditTextView, | ||||
|                     userTextView, | ||||
|                     stickiedPostImageView, | ||||
|                     postTimeTextView, | ||||
|                     titleTextView, | ||||
|                     typeTextView, | ||||
|                     archivedImageView, | ||||
|                     lockedImageView, | ||||
|                     crosspostImageView, | ||||
|                     nsfwTextView, | ||||
|                     spoilerTextView, | ||||
|                     flairTextView, | ||||
|                     awardsTextView, | ||||
|                     bottomConstraintLayout, | ||||
|                     upvoteButton, | ||||
|                     scoreTextView, | ||||
|                     downvoteButton, | ||||
|                     commentsCountTextView, | ||||
|                     saveButton, | ||||
|                     shareButton); | ||||
|  | ||||
|             noPreviewLinkImageView.setBackgroundColor(mNoPreviewLinkBackgroundColor); | ||||
|             progressBar.setIndeterminateTintList(ColorStateList.valueOf(mColorAccent)); | ||||
|             errorTextView.setTextColor(mPrimaryTextColor); | ||||
|  | ||||
|             imageView.setOnClickListener(view -> { | ||||
|                 Post post = getItem(getAdapterPosition()); | ||||
|                 if (post != null) { | ||||
|                     Intent intent = new Intent(mActivity, ViewRedditGalleryActivity.class); | ||||
|                     intent.putParcelableArrayListExtra(ViewRedditGalleryActivity.EXTRA_REDDIT_GALLERY, post.getGallery()); | ||||
|                     mActivity.startActivity(intent); | ||||
|                 } | ||||
|             }); | ||||
|  | ||||
|             noPreviewLinkImageView.setOnClickListener(view -> { | ||||
|                 imageView.performClick(); | ||||
|             }); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     class PostTextTypeViewHolder extends PostBaseViewHolder { | ||||
|         @BindView(R.id.card_view_item_post_text_type) | ||||
|         MaterialCardView cardView; | ||||
|   | ||||
| @@ -38,6 +38,7 @@ import ml.docilealligator.infinityforreddit.Activity.InboxActivity; | ||||
| import ml.docilealligator.infinityforreddit.Activity.ViewMultiRedditDetailActivity; | ||||
| import ml.docilealligator.infinityforreddit.Activity.ViewPostDetailActivity; | ||||
| import ml.docilealligator.infinityforreddit.Activity.ViewPrivateMessagesActivity; | ||||
| import ml.docilealligator.infinityforreddit.Activity.ViewRedditGalleryActivity; | ||||
| import ml.docilealligator.infinityforreddit.Activity.ViewSubredditDetailActivity; | ||||
| import ml.docilealligator.infinityforreddit.Activity.ViewUserDetailActivity; | ||||
| import ml.docilealligator.infinityforreddit.Activity.ViewVideoActivity; | ||||
| @@ -52,6 +53,7 @@ import ml.docilealligator.infinityforreddit.Fragment.SubredditListingFragment; | ||||
| import ml.docilealligator.infinityforreddit.Fragment.SubscribedSubredditsListingFragment; | ||||
| import ml.docilealligator.infinityforreddit.Fragment.UserListingFragment; | ||||
| import ml.docilealligator.infinityforreddit.Fragment.ViewImgurVideoFragment; | ||||
| import ml.docilealligator.infinityforreddit.Fragment.ViewRedditGalleryVideoFragment; | ||||
| import ml.docilealligator.infinityforreddit.Service.DownloadRedditVideoService; | ||||
| import ml.docilealligator.infinityforreddit.Service.SubmitPostService; | ||||
| import ml.docilealligator.infinityforreddit.Settings.AdvancedPreferenceFragment; | ||||
| @@ -182,4 +184,8 @@ public interface AppComponent { | ||||
|     void inject(SendPrivateMessageActivity sendPrivateMessageActivity); | ||||
|  | ||||
|     void inject(VideoPreferenceFragment videoPreferenceFragment); | ||||
|  | ||||
|     void inject(ViewRedditGalleryActivity viewRedditGalleryActivity); | ||||
|  | ||||
|     void inject(ViewRedditGalleryVideoFragment viewRedditGalleryVideoFragment); | ||||
| } | ||||
|   | ||||
| @@ -139,14 +139,14 @@ public class ViewImgurImageFragment extends Fragment { | ||||
|  | ||||
|     @Override | ||||
|     public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) { | ||||
|         inflater.inflate(R.menu.view_imgur_image_fragments, menu); | ||||
|         inflater.inflate(R.menu.view_imgur_image_fragment, menu); | ||||
|         super.onCreateOptionsMenu(menu, inflater); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public boolean onOptionsItemSelected(@NonNull MenuItem item) { | ||||
|         switch (item.getItemId()) { | ||||
|             case R.id.action_download_view_imgur_image_fragments: | ||||
|             case R.id.action_download_view_imgur_image_fragment: | ||||
|                 if (isDownloading) { | ||||
|                     return false; | ||||
|                 } | ||||
| @@ -172,7 +172,7 @@ public class ViewImgurImageFragment extends Fragment { | ||||
|                 } | ||||
|  | ||||
|                 return true; | ||||
|             case R.id.action_share_view_imgur_image_fragments: | ||||
|             case R.id.action_share_view_imgur_image_fragment: | ||||
|                 glide.asBitmap().load(imgurMedia.getLink()).into(new CustomTarget<Bitmap>() { | ||||
|  | ||||
|                     @Override | ||||
| @@ -212,7 +212,7 @@ public class ViewImgurImageFragment extends Fragment { | ||||
|                     } | ||||
|                 }); | ||||
|                 return true; | ||||
|             case R.id.action_set_wallpaper_view_imgur_image_fragments: | ||||
|             case R.id.action_set_wallpaper_view_imgur_image_fragment: | ||||
|                 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { | ||||
|                     SetAsWallpaperBottomSheetFragment setAsWallpaperBottomSheetFragment = new SetAsWallpaperBottomSheetFragment(); | ||||
|                     Bundle bundle = new Bundle(); | ||||
|   | ||||
| @@ -52,9 +52,6 @@ import ml.docilealligator.infinityforreddit.MediaDownloaderImpl; | ||||
| import ml.docilealligator.infinityforreddit.R; | ||||
| import ml.docilealligator.infinityforreddit.Utils.SharedPreferencesUtils; | ||||
|  | ||||
| /** | ||||
|  * A simple {@link Fragment} subclass. | ||||
|  */ | ||||
| public class ViewImgurVideoFragment extends Fragment { | ||||
|  | ||||
|     public static final String EXTRA_IMGUR_VIDEO = "EIV"; | ||||
| @@ -154,7 +151,7 @@ public class ViewImgurVideoFragment extends Fragment { | ||||
|  | ||||
|     @Override | ||||
|     public boolean onOptionsItemSelected(@NonNull MenuItem item) { | ||||
|         if (item.getItemId() == R.id.action_download_view_imgur_image_fragments) { | ||||
|         if (item.getItemId() == R.id.action_download_view_imgur_video_fragment) { | ||||
|             isDownloading = true; | ||||
|             if (Build.VERSION.SDK_INT >= 23) { | ||||
|                 if (ContextCompat.checkSelfPermission(activity, | ||||
|   | ||||
| @@ -0,0 +1,297 @@ | ||||
| package ml.docilealligator.infinityforreddit.Fragment; | ||||
|  | ||||
| import android.Manifest; | ||||
| import android.content.Context; | ||||
| import android.content.Intent; | ||||
| import android.content.pm.PackageManager; | ||||
| import android.graphics.Bitmap; | ||||
| import android.graphics.drawable.Drawable; | ||||
| import android.net.Uri; | ||||
| import android.os.Build; | ||||
| import android.os.Bundle; | ||||
| import android.view.LayoutInflater; | ||||
| import android.view.Menu; | ||||
| import android.view.MenuInflater; | ||||
| import android.view.MenuItem; | ||||
| import android.view.View; | ||||
| import android.view.ViewGroup; | ||||
| import android.widget.LinearLayout; | ||||
| import android.widget.ProgressBar; | ||||
| import android.widget.Toast; | ||||
|  | ||||
| import androidx.annotation.NonNull; | ||||
| import androidx.annotation.Nullable; | ||||
| import androidx.core.app.ActivityCompat; | ||||
| import androidx.core.content.ContextCompat; | ||||
| import androidx.core.content.FileProvider; | ||||
| import androidx.fragment.app.Fragment; | ||||
|  | ||||
| import com.bumptech.glide.Glide; | ||||
| import com.bumptech.glide.RequestManager; | ||||
| import com.bumptech.glide.load.DataSource; | ||||
| import com.bumptech.glide.load.engine.GlideException; | ||||
| import com.bumptech.glide.load.resource.gif.GifDrawable; | ||||
| import com.bumptech.glide.request.RequestListener; | ||||
| import com.bumptech.glide.request.target.CustomTarget; | ||||
| import com.bumptech.glide.request.target.Target; | ||||
| import com.bumptech.glide.request.transition.Transition; | ||||
| import com.davemorrissey.labs.subscaleview.ImageSource; | ||||
| import com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView; | ||||
|  | ||||
| import java.io.File; | ||||
|  | ||||
| import butterknife.BindView; | ||||
| import butterknife.ButterKnife; | ||||
| import ml.docilealligator.infinityforreddit.Activity.ViewRedditGalleryActivity; | ||||
| import ml.docilealligator.infinityforreddit.AsyncTask.SaveGIFToFileAsyncTask; | ||||
| import ml.docilealligator.infinityforreddit.AsyncTask.SaveImageToFileAsyncTask; | ||||
| import ml.docilealligator.infinityforreddit.BottomSheetFragment.SetAsWallpaperBottomSheetFragment; | ||||
| import ml.docilealligator.infinityforreddit.BuildConfig; | ||||
| import ml.docilealligator.infinityforreddit.MediaDownloader; | ||||
| import ml.docilealligator.infinityforreddit.MediaDownloaderImpl; | ||||
| import ml.docilealligator.infinityforreddit.Post.Post; | ||||
| import ml.docilealligator.infinityforreddit.R; | ||||
| import ml.docilealligator.infinityforreddit.SetAsWallpaperCallback; | ||||
|  | ||||
| public class ViewRedditGalleryImageOrGifFragment extends Fragment { | ||||
|  | ||||
|     public static final String EXTRA_REDDIT_GALLERY_MEDIA = "ERGM"; | ||||
|     private static final int PERMISSION_REQUEST_WRITE_EXTERNAL_STORAGE = 0; | ||||
|  | ||||
|     @BindView(R.id.progress_bar_view_reddit_gallery_image_or_gif_fragment) | ||||
|     ProgressBar progressBar; | ||||
|     @BindView(R.id.image_view_view_reddit_gallery_image_or_gif_fragment) | ||||
|     SubsamplingScaleImageView imageView; | ||||
|     @BindView(R.id.load_image_error_linear_layout_view_reddit_gallery_image_or_gif_fragment) | ||||
|     LinearLayout errorLinearLayout; | ||||
|  | ||||
|     private ViewRedditGalleryActivity activity; | ||||
|     private RequestManager glide; | ||||
|     private MediaDownloader mediaDownloader; | ||||
|     private Post.Gallery media; | ||||
|     private boolean isDownloading = false; | ||||
|     private boolean isActionBarHidden = false; | ||||
|  | ||||
|     public ViewRedditGalleryImageOrGifFragment() { | ||||
|         // Required empty public constructor | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public View onCreateView(LayoutInflater inflater, ViewGroup container, | ||||
|                              Bundle savedInstanceState) { | ||||
|         View rootView = inflater.inflate(R.layout.fragment_view_reddit_gallery_image_or_gif, container, false); | ||||
|  | ||||
|         ButterKnife.bind(this, rootView); | ||||
|  | ||||
|         setHasOptionsMenu(true); | ||||
|  | ||||
|         media = getArguments().getParcelable(EXTRA_REDDIT_GALLERY_MEDIA); | ||||
|         glide = Glide.with(activity); | ||||
|         mediaDownloader = new MediaDownloaderImpl(); | ||||
|         loadImage(); | ||||
|  | ||||
|         imageView.setOnClickListener(view -> { | ||||
|             if (isActionBarHidden) { | ||||
|                 activity.getWindow().getDecorView().setSystemUiVisibility( | ||||
|                         View.SYSTEM_UI_FLAG_LAYOUT_STABLE | ||||
|                                 | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | ||||
|                                 | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN); | ||||
|                 isActionBarHidden = false; | ||||
|             } else { | ||||
|                 activity.getWindow().getDecorView().setSystemUiVisibility( | ||||
|                         View.SYSTEM_UI_FLAG_LAYOUT_STABLE | ||||
|                                 | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | ||||
|                                 | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | ||||
|                                 | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | ||||
|                                 | View.SYSTEM_UI_FLAG_FULLSCREEN | ||||
|                                 | View.SYSTEM_UI_FLAG_IMMERSIVE); | ||||
|                 isActionBarHidden = true; | ||||
|             } | ||||
|         }); | ||||
|  | ||||
|         return rootView; | ||||
|     } | ||||
|  | ||||
|     private void loadImage() { | ||||
|         glide.asBitmap().load(media.url).listener(new RequestListener<Bitmap>() { | ||||
|             @Override | ||||
|             public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<Bitmap> target, boolean isFirstResource) { | ||||
|                 progressBar.setVisibility(View.GONE); | ||||
|                 errorLinearLayout.setVisibility(View.VISIBLE); | ||||
|                 return false; | ||||
|             } | ||||
|  | ||||
|             @Override | ||||
|             public boolean onResourceReady(Bitmap resource, Object model, Target<Bitmap> target, DataSource dataSource, boolean isFirstResource) { | ||||
|                 progressBar.setVisibility(View.GONE); | ||||
|                 return false; | ||||
|             } | ||||
|         }).into(new CustomTarget<Bitmap>() { | ||||
|             @Override | ||||
|             public void onResourceReady(@NonNull Bitmap resource, @Nullable Transition<? super Bitmap> transition) { | ||||
|                 imageView.setImage(ImageSource.bitmap(resource)); | ||||
|             } | ||||
|  | ||||
|             @Override | ||||
|             public void onLoadCleared(@Nullable Drawable placeholder) { | ||||
|  | ||||
|             } | ||||
|         }); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) { | ||||
|         inflater.inflate(R.menu.view_reddit_gallery_image_or_gif_fragment, menu); | ||||
|         super.onCreateOptionsMenu(menu, inflater); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public boolean onOptionsItemSelected(@NonNull MenuItem item) { | ||||
|         switch (item.getItemId()) { | ||||
|             case R.id.action_download_view_reddit_gallery_image_or_gif_fragment: | ||||
|                 if (isDownloading) { | ||||
|                     return false; | ||||
|                 } | ||||
|  | ||||
|                 isDownloading = true; | ||||
|  | ||||
|                 if (Build.VERSION.SDK_INT >= 23) { | ||||
|                     if (ContextCompat.checkSelfPermission(activity, | ||||
|                             Manifest.permission.WRITE_EXTERNAL_STORAGE) | ||||
|                             != PackageManager.PERMISSION_GRANTED) { | ||||
|  | ||||
|                         // Permission is not granted | ||||
|                         // No explanation needed; request the permission | ||||
|                         ActivityCompat.requestPermissions(activity, | ||||
|                                 new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, | ||||
|                                 PERMISSION_REQUEST_WRITE_EXTERNAL_STORAGE); | ||||
|                     } else { | ||||
|                         // Permission has already been granted | ||||
|                         mediaDownloader.download(media.url, media.fileName, getContext()); | ||||
|                     } | ||||
|                 } else { | ||||
|                     mediaDownloader.download(media.url, media.fileName, getContext()); | ||||
|                 } | ||||
|  | ||||
|                 return true; | ||||
|             case R.id.action_share_view_reddit_gallery_image_or_gif_fragment: | ||||
|                 if (media.mediaType == Post.Gallery.TYPE_GIF) { | ||||
|                     shareGif(); | ||||
|                 } else { | ||||
|                     shareImage(); | ||||
|                 } | ||||
|                 return true; | ||||
|             case R.id.action_set_wallpaper_view_reddit_gallery_image_or_gif_fragment: | ||||
|                 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { | ||||
|                     SetAsWallpaperBottomSheetFragment setAsWallpaperBottomSheetFragment = new SetAsWallpaperBottomSheetFragment(); | ||||
|                     Bundle bundle = new Bundle(); | ||||
|                     bundle.putInt(SetAsWallpaperBottomSheetFragment.EXTRA_VIEW_PAGER_POSITION, activity.getCurrentPagePosition()); | ||||
|                     setAsWallpaperBottomSheetFragment.setArguments(bundle); | ||||
|                     setAsWallpaperBottomSheetFragment.show(activity.getSupportFragmentManager(), setAsWallpaperBottomSheetFragment.getTag()); | ||||
|                 } else { | ||||
|                     ((SetAsWallpaperCallback) activity).setToBoth(activity.getCurrentPagePosition()); | ||||
|                 } | ||||
|                 return true; | ||||
|         } | ||||
|  | ||||
|         return false; | ||||
|     } | ||||
|  | ||||
|     private void shareImage() { | ||||
|         glide.asBitmap().load(media.url).into(new CustomTarget<Bitmap>() { | ||||
|             @Override | ||||
|             public void onResourceReady(@NonNull Bitmap resource, @Nullable Transition<? super Bitmap> transition) { | ||||
|                 if (activity.getExternalCacheDir() != null) { | ||||
|                     Toast.makeText(activity, R.string.save_image_first, Toast.LENGTH_SHORT).show(); | ||||
|                     new SaveImageToFileAsyncTask(resource, activity.getExternalCacheDir().getPath(), | ||||
|                             media.fileName, | ||||
|                             new SaveImageToFileAsyncTask.SaveImageToFileAsyncTaskListener() { | ||||
|                                 @Override | ||||
|                                 public void saveSuccess(File imageFile) { | ||||
|                                     Uri uri = FileProvider.getUriForFile(activity, | ||||
|                                             BuildConfig.APPLICATION_ID + ".provider", imageFile); | ||||
|                                     Intent shareIntent = new Intent(); | ||||
|                                     shareIntent.setAction(Intent.ACTION_SEND); | ||||
|                                     shareIntent.putExtra(Intent.EXTRA_STREAM, uri); | ||||
|                                     shareIntent.setType("image/*"); | ||||
|                                     shareIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); | ||||
|                                     startActivity(Intent.createChooser(shareIntent, getString(R.string.share))); | ||||
|                                 } | ||||
|  | ||||
|                                 @Override | ||||
|                                 public void saveFailed() { | ||||
|                                     Toast.makeText(activity, | ||||
|                                             R.string.cannot_save_image, Toast.LENGTH_SHORT).show(); | ||||
|                                 } | ||||
|                             }).execute(); | ||||
|                 } else { | ||||
|                     Toast.makeText(activity, | ||||
|                             R.string.cannot_get_storage, Toast.LENGTH_SHORT).show(); | ||||
|                 } | ||||
|             } | ||||
|  | ||||
|             @Override | ||||
|             public void onLoadCleared(@Nullable Drawable placeholder) { | ||||
|  | ||||
|             } | ||||
|         }); | ||||
|     } | ||||
|  | ||||
|     private void shareGif() { | ||||
|         Toast.makeText(activity, R.string.save_gif_first, Toast.LENGTH_SHORT).show(); | ||||
|         glide.asGif().load(media.url).listener(new RequestListener<GifDrawable>() { | ||||
|             @Override | ||||
|             public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<GifDrawable> target, boolean isFirstResource) { | ||||
|                 return false; | ||||
|             } | ||||
|  | ||||
|             @Override | ||||
|             public boolean onResourceReady(GifDrawable resource, Object model, Target<GifDrawable> target, DataSource dataSource, boolean isFirstResource) { | ||||
|                 if (activity.getExternalCacheDir() != null) { | ||||
|                     new SaveGIFToFileAsyncTask(resource, activity.getExternalCacheDir().getPath(), media.fileName, | ||||
|                             new SaveGIFToFileAsyncTask.SaveGIFToFileAsyncTaskListener() { | ||||
|                                 @Override | ||||
|                                 public void saveSuccess(File imageFile) { | ||||
|                                     Uri uri = FileProvider.getUriForFile(activity, | ||||
|                                             BuildConfig.APPLICATION_ID + ".provider", imageFile); | ||||
|                                     Intent shareIntent = new Intent(); | ||||
|                                     shareIntent.setAction(Intent.ACTION_SEND); | ||||
|                                     shareIntent.putExtra(Intent.EXTRA_STREAM, uri); | ||||
|                                     shareIntent.setType("image/*"); | ||||
|                                     shareIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); | ||||
|                                     startActivity(Intent.createChooser(shareIntent, getString(R.string.share))); | ||||
|                                 } | ||||
|  | ||||
|                                 @Override | ||||
|                                 public void saveFailed() { | ||||
|                                     Toast.makeText(activity, | ||||
|                                             R.string.cannot_save_gif, Toast.LENGTH_SHORT).show(); | ||||
|                                 } | ||||
|                             }).execute(); | ||||
|                 } else { | ||||
|                     Toast.makeText(activity, | ||||
|                             R.string.cannot_get_storage, Toast.LENGTH_SHORT).show(); | ||||
|                 } | ||||
|                 return false; | ||||
|             } | ||||
|         }).submit(); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { | ||||
|         if (requestCode == PERMISSION_REQUEST_WRITE_EXTERNAL_STORAGE && grantResults.length > 0) { | ||||
|             if (grantResults[0] == PackageManager.PERMISSION_DENIED) { | ||||
|                 Toast.makeText(activity, R.string.no_storage_permission, Toast.LENGTH_SHORT).show(); | ||||
|             } else if (grantResults[0] == PackageManager.PERMISSION_GRANTED && isDownloading) { | ||||
|                 mediaDownloader.download(media.url, media.fileName, getContext()); | ||||
|             } | ||||
|             isDownloading = false; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public void onAttach(@NonNull Context context) { | ||||
|         super.onAttach(context); | ||||
|         activity = (ViewRedditGalleryActivity) context; | ||||
|     } | ||||
| } | ||||
| @@ -0,0 +1,285 @@ | ||||
| package ml.docilealligator.infinityforreddit.Fragment; | ||||
|  | ||||
| import android.Manifest; | ||||
| import android.app.Activity; | ||||
| import android.content.Context; | ||||
| import android.content.SharedPreferences; | ||||
| import android.content.pm.PackageManager; | ||||
| import android.content.res.Configuration; | ||||
| import android.media.AudioManager; | ||||
| import android.net.Uri; | ||||
| import android.os.Build; | ||||
| import android.os.Bundle; | ||||
| import android.view.LayoutInflater; | ||||
| import android.view.Menu; | ||||
| import android.view.MenuInflater; | ||||
| import android.view.MenuItem; | ||||
| import android.view.View; | ||||
| import android.view.ViewGroup; | ||||
| import android.widget.ImageButton; | ||||
| import android.widget.LinearLayout; | ||||
| import android.widget.Toast; | ||||
|  | ||||
| import androidx.annotation.NonNull; | ||||
| import androidx.core.app.ActivityCompat; | ||||
| import androidx.core.content.ContextCompat; | ||||
| import androidx.fragment.app.Fragment; | ||||
|  | ||||
| import com.google.android.exoplayer2.ExoPlayerFactory; | ||||
| import com.google.android.exoplayer2.Player; | ||||
| import com.google.android.exoplayer2.SimpleExoPlayer; | ||||
| import com.google.android.exoplayer2.source.ProgressiveMediaSource; | ||||
| import com.google.android.exoplayer2.source.TrackGroupArray; | ||||
| import com.google.android.exoplayer2.trackselection.AdaptiveTrackSelection; | ||||
| import com.google.android.exoplayer2.trackselection.DefaultTrackSelector; | ||||
| import com.google.android.exoplayer2.trackselection.TrackSelection; | ||||
| import com.google.android.exoplayer2.trackselection.TrackSelectionArray; | ||||
| import com.google.android.exoplayer2.trackselection.TrackSelector; | ||||
| import com.google.android.exoplayer2.ui.PlayerView; | ||||
| import com.google.android.exoplayer2.upstream.DataSource; | ||||
| import com.google.android.exoplayer2.upstream.DefaultDataSourceFactory; | ||||
| import com.google.android.exoplayer2.util.Util; | ||||
|  | ||||
| import javax.inject.Inject; | ||||
| import javax.inject.Named; | ||||
|  | ||||
| import butterknife.BindView; | ||||
| import butterknife.ButterKnife; | ||||
| import ml.docilealligator.infinityforreddit.Infinity; | ||||
| import ml.docilealligator.infinityforreddit.MediaDownloader; | ||||
| import ml.docilealligator.infinityforreddit.MediaDownloaderImpl; | ||||
| import ml.docilealligator.infinityforreddit.Post.Post; | ||||
| import ml.docilealligator.infinityforreddit.R; | ||||
| import ml.docilealligator.infinityforreddit.Utils.SharedPreferencesUtils; | ||||
|  | ||||
| public class ViewRedditGalleryVideoFragment extends Fragment { | ||||
|  | ||||
|     public static final String EXTRA_REDDIT_GALLERY_VIDEO = "EIV"; | ||||
|     private static final String IS_MUTE_STATE = "IMS"; | ||||
|     private static final String POSITION_STATE = "PS"; | ||||
|     private static final int PERMISSION_REQUEST_WRITE_EXTERNAL_STORAGE = 0; | ||||
|     @BindView(R.id.player_view_view_reddit_gallery_video_fragment) | ||||
|     PlayerView videoPlayerView; | ||||
|     @BindView(R.id.mute_exo_playback_control_view) | ||||
|     ImageButton muteButton; | ||||
|     private Activity activity; | ||||
|     private Post.Gallery galleryVideo; | ||||
|     private SimpleExoPlayer player; | ||||
|     private DataSource.Factory dataSourceFactory; | ||||
|     private MediaDownloader mediaDownloader; | ||||
|     private boolean wasPlaying = false; | ||||
|     private boolean isMute = false; | ||||
|     private boolean isDownloading = false; | ||||
|     @Inject | ||||
|     @Named("default") | ||||
|     SharedPreferences mSharedPreferences; | ||||
|  | ||||
|     public ViewRedditGalleryVideoFragment() { | ||||
|         // Required empty public constructor | ||||
|     } | ||||
|  | ||||
|  | ||||
|     @Override | ||||
|     public View onCreateView(LayoutInflater inflater, ViewGroup container, | ||||
|                              Bundle savedInstanceState) { | ||||
|         View rootView = inflater.inflate(R.layout.fragment_view_reddit_gallery_video, container, false); | ||||
|  | ||||
|         ((Infinity) activity.getApplication()).getAppComponent().inject(this); | ||||
|  | ||||
|         ButterKnife.bind(this, rootView); | ||||
|  | ||||
|         setHasOptionsMenu(true); | ||||
|  | ||||
|         activity.setVolumeControlStream(AudioManager.STREAM_MUSIC); | ||||
|  | ||||
|         galleryVideo = getArguments().getParcelable(EXTRA_REDDIT_GALLERY_VIDEO); | ||||
|  | ||||
|         if (!mSharedPreferences.getBoolean(SharedPreferencesUtils.VIDEO_PLAYER_IGNORE_NAV_BAR, false)) { | ||||
|             if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT || getResources().getBoolean(R.bool.isTablet)) { | ||||
|                 //Set player controller bottom margin in order to display it above the navbar | ||||
|                 int resourceId = getResources().getIdentifier("navigation_bar_height", "dimen", "android"); | ||||
|                 LinearLayout controllerLinearLayout = rootView.findViewById(R.id.linear_layout_exo_playback_control_view); | ||||
|                 ViewGroup.MarginLayoutParams params = (ViewGroup.MarginLayoutParams) controllerLinearLayout.getLayoutParams(); | ||||
|                 params.bottomMargin = getResources().getDimensionPixelSize(resourceId); | ||||
|             } else { | ||||
|                 //Set player controller right margin in order to display it above the navbar | ||||
|                 int resourceId = getResources().getIdentifier("navigation_bar_height", "dimen", "android"); | ||||
|                 LinearLayout controllerLinearLayout = rootView.findViewById(R.id.linear_layout_exo_playback_control_view); | ||||
|                 ViewGroup.MarginLayoutParams params = (ViewGroup.MarginLayoutParams) controllerLinearLayout.getLayoutParams(); | ||||
|                 params.rightMargin = getResources().getDimensionPixelSize(resourceId); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         videoPlayerView.setControllerVisibilityListener(visibility -> { | ||||
|             switch (visibility) { | ||||
|                 case View.GONE: | ||||
|                     activity.getWindow().getDecorView().setSystemUiVisibility( | ||||
|                             View.SYSTEM_UI_FLAG_LAYOUT_STABLE | ||||
|                                     | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | ||||
|                                     | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | ||||
|                                     | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | ||||
|                                     | View.SYSTEM_UI_FLAG_FULLSCREEN | ||||
|                                     | View.SYSTEM_UI_FLAG_IMMERSIVE); | ||||
|                     break; | ||||
|                 case View.VISIBLE: | ||||
|                     activity.getWindow().getDecorView().setSystemUiVisibility( | ||||
|                             View.SYSTEM_UI_FLAG_LAYOUT_STABLE | ||||
|                                     | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | ||||
|                                     | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN); | ||||
|             } | ||||
|         }); | ||||
|  | ||||
|         mediaDownloader = new MediaDownloaderImpl(); | ||||
|  | ||||
|         TrackSelection.Factory videoTrackSelectionFactory = new AdaptiveTrackSelection.Factory(); | ||||
|         TrackSelector trackSelector = new DefaultTrackSelector(videoTrackSelectionFactory); | ||||
|         player = ExoPlayerFactory.newSimpleInstance(activity, trackSelector); | ||||
|         videoPlayerView.setPlayer(player); | ||||
|         dataSourceFactory = new DefaultDataSourceFactory(activity, | ||||
|                 Util.getUserAgent(activity, "Infinity")); | ||||
|         player.prepare(new ProgressiveMediaSource.Factory(dataSourceFactory).createMediaSource(Uri.parse(galleryVideo.url))); | ||||
|         preparePlayer(savedInstanceState); | ||||
|  | ||||
|         return rootView; | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) { | ||||
|         inflater.inflate(R.menu.view_reddit_gallery_video_fragment, menu); | ||||
|         super.onCreateOptionsMenu(menu, inflater); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public boolean onOptionsItemSelected(@NonNull MenuItem item) { | ||||
|         if (item.getItemId() == R.id.action_download_view_reddit_gallery_video_fragment) { | ||||
|             isDownloading = true; | ||||
|             if (Build.VERSION.SDK_INT >= 23) { | ||||
|                 if (ContextCompat.checkSelfPermission(activity, | ||||
|                         Manifest.permission.WRITE_EXTERNAL_STORAGE) | ||||
|                         != PackageManager.PERMISSION_GRANTED) { | ||||
|  | ||||
|                     // Permission is not granted | ||||
|                     // No explanation needed; request the permission | ||||
|                     ActivityCompat.requestPermissions(activity, | ||||
|                             new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, | ||||
|                             PERMISSION_REQUEST_WRITE_EXTERNAL_STORAGE); | ||||
|                 } else { | ||||
|                     // Permission has already been granted | ||||
|                     download(); | ||||
|                 } | ||||
|             } else { | ||||
|                 download(); | ||||
|             } | ||||
|             return true; | ||||
|         } | ||||
|         return false; | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { | ||||
|         if (requestCode == PERMISSION_REQUEST_WRITE_EXTERNAL_STORAGE && grantResults.length > 0) { | ||||
|             if (grantResults[0] == PackageManager.PERMISSION_DENIED) { | ||||
|                 Toast.makeText(activity, R.string.no_storage_permission, Toast.LENGTH_SHORT).show(); | ||||
|             } else if (grantResults[0] == PackageManager.PERMISSION_GRANTED && isDownloading) { | ||||
|                 download(); | ||||
|             } | ||||
|             isDownloading = false; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private void download() { | ||||
|         isDownloading = false; | ||||
|  | ||||
|         mediaDownloader.download(galleryVideo.url, galleryVideo.fileName, getContext()); | ||||
|     } | ||||
|  | ||||
|     private void preparePlayer(Bundle savedInstanceState) { | ||||
|         player.setRepeatMode(Player.REPEAT_MODE_ALL); | ||||
|         wasPlaying = true; | ||||
|  | ||||
|         boolean muteVideo = mSharedPreferences.getBoolean(SharedPreferencesUtils.MUTE_VIDEO, false); | ||||
|  | ||||
|         if (savedInstanceState != null) { | ||||
|             long position = savedInstanceState.getLong(POSITION_STATE); | ||||
|             if (position > 0) { | ||||
|                 player.seekTo(position); | ||||
|             } | ||||
|             isMute = savedInstanceState.getBoolean(IS_MUTE_STATE); | ||||
|             if (isMute) { | ||||
|                 player.setVolume(0f); | ||||
|                 muteButton.setImageResource(R.drawable.ic_mute_24dp); | ||||
|             } else { | ||||
|                 player.setVolume(1f); | ||||
|                 muteButton.setImageResource(R.drawable.ic_unmute_24dp); | ||||
|             } | ||||
|         } else if (muteVideo) { | ||||
|             isMute = true; | ||||
|             player.setVolume(0f); | ||||
|             muteButton.setImageResource(R.drawable.ic_mute_24dp); | ||||
|         } else { | ||||
|             muteButton.setImageResource(R.drawable.ic_unmute_24dp); | ||||
|         } | ||||
|  | ||||
|         player.addListener(new Player.EventListener() { | ||||
|             @Override | ||||
|             public void onTracksChanged(TrackGroupArray trackGroups, TrackSelectionArray trackSelections) { | ||||
|                 if (!trackGroups.isEmpty()) { | ||||
|                     for (int i = 0; i < trackGroups.length; i++) { | ||||
|                         String mimeType = trackGroups.get(i).getFormat(0).sampleMimeType; | ||||
|                         if (mimeType != null && mimeType.contains("audio")) { | ||||
|                             muteButton.setVisibility(View.VISIBLE); | ||||
|                             muteButton.setOnClickListener(view -> { | ||||
|                                 if (isMute) { | ||||
|                                     isMute = false; | ||||
|                                     player.setVolume(1f); | ||||
|                                     muteButton.setImageResource(R.drawable.ic_unmute_24dp); | ||||
|                                 } else { | ||||
|                                     isMute = true; | ||||
|                                     player.setVolume(0f); | ||||
|                                     muteButton.setImageResource(R.drawable.ic_mute_24dp); | ||||
|                                 } | ||||
|                             }); | ||||
|                             break; | ||||
|                         } | ||||
|                     } | ||||
|                 } else { | ||||
|                     muteButton.setVisibility(View.GONE); | ||||
|                 } | ||||
|             } | ||||
|         }); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public void onResume() { | ||||
|         super.onResume(); | ||||
|         if (wasPlaying) { | ||||
|             player.setPlayWhenReady(true); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public void onPause() { | ||||
|         super.onPause(); | ||||
|         wasPlaying = player.getPlayWhenReady(); | ||||
|         player.setPlayWhenReady(false); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public void onSaveInstanceState(@NonNull Bundle outState) { | ||||
|         super.onSaveInstanceState(outState); | ||||
|         outState.putBoolean(IS_MUTE_STATE, isMute); | ||||
|         outState.putLong(POSITION_STATE, player.getCurrentPosition()); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public void onDestroy() { | ||||
|         super.onDestroy(); | ||||
|         player.release(); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public void onAttach(@NonNull Context context) { | ||||
|         super.onAttach(context); | ||||
|         activity = (Activity) context; | ||||
|     } | ||||
| } | ||||
| @@ -8,6 +8,7 @@ import org.json.JSONArray; | ||||
| import org.json.JSONException; | ||||
| import org.json.JSONObject; | ||||
|  | ||||
| import java.util.ArrayList; | ||||
| import java.util.LinkedHashSet; | ||||
| import java.util.Locale; | ||||
|  | ||||
| @@ -388,6 +389,30 @@ public class ParsePost { | ||||
|                     post.setUrl(url); | ||||
|                 } | ||||
|             } catch (IllegalArgumentException ignore) { } | ||||
|         } else if (post.getPostType() == Post.LINK_TYPE || post.getPostType() == Post.NO_PREVIEW_LINK_TYPE) { | ||||
|             if (data.has(JSONUtils.GALLERY_DATA_KEY)) { | ||||
|                 JSONArray galleryIdsArray = data.getJSONObject(JSONUtils.GALLERY_DATA_KEY).getJSONArray(JSONUtils.ITEMS_KEY); | ||||
|                 JSONObject galleryObject = data.getJSONObject(JSONUtils.MEDIA_METADATA_KEY); | ||||
|                 ArrayList<Post.Gallery> gallery = new ArrayList<>(); | ||||
|                 for (int i = 0; i < galleryIdsArray.length(); i++) { | ||||
|                     String galleryId = galleryIdsArray.getJSONObject(i).getString(JSONUtils.MEDIA_ID_KEY); | ||||
|                     JSONObject singleGalleryObject = galleryObject.getJSONObject(galleryId); | ||||
|                     String mimeType = singleGalleryObject.getString(JSONUtils.M_KEY); | ||||
|                     String galleryItemUrl = singleGalleryObject.getJSONObject(JSONUtils.S_KEY).getString(JSONUtils.U_KEY); | ||||
|                     if ((previewUrl.equals("")) && mimeType.contains("jpg") || mimeType.contains("png")) { | ||||
|                         previewUrl = galleryItemUrl; | ||||
|                         post.setPreviewUrl(previewUrl); | ||||
|                         post.setPreviewWidth(singleGalleryObject.getJSONObject(JSONUtils.S_KEY).getInt(JSONUtils.X_KEY)); | ||||
|                         post.setPreviewHeight(singleGalleryObject.getJSONObject(JSONUtils.S_KEY).getInt(JSONUtils.Y_KEY)); | ||||
|                     } | ||||
|                     gallery.add(new Post.Gallery(mimeType, galleryItemUrl, subredditName + "-" + galleryId + "." + mimeType.substring(mimeType.lastIndexOf("/") + 1))); | ||||
|                 } | ||||
|  | ||||
|                 if (!gallery.isEmpty()) { | ||||
|                     post.setPostType(Post.GALLERY_TYPE); | ||||
|                     post.setGallery(gallery); | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         return post; | ||||
|   | ||||
| @@ -5,6 +5,8 @@ import android.os.Parcelable; | ||||
|  | ||||
| import androidx.annotation.Nullable; | ||||
|  | ||||
| import java.util.ArrayList; | ||||
|  | ||||
| import ml.docilealligator.infinityforreddit.Utils.APIUtils; | ||||
|  | ||||
| /** | ||||
| @@ -19,6 +21,7 @@ public class Post implements Parcelable { | ||||
|     public static final int VIDEO_TYPE = 3; | ||||
|     public static final int GIF_TYPE = 4; | ||||
|     public static final int NO_PREVIEW_LINK_TYPE = 5; | ||||
|     public static final int GALLERY_TYPE = 6; | ||||
|     public static final Creator<Post> CREATOR = new Creator<Post>() { | ||||
|         @Override | ||||
|         public Post createFromParcel(Parcel in) { | ||||
| @@ -69,6 +72,7 @@ public class Post implements Parcelable { | ||||
|     private boolean saved; | ||||
|     private boolean isCrosspost; | ||||
|     private String crosspostParentId; | ||||
|     private ArrayList<Gallery> gallery = new ArrayList<>(); | ||||
|  | ||||
|     public Post(String id, String fullName, String subredditName, String subredditNamePrefixed, | ||||
|                 String author, String authorFlair, String authorFlairHTML, | ||||
| @@ -217,6 +221,7 @@ public class Post implements Parcelable { | ||||
|         saved = in.readByte() != 0; | ||||
|         isCrosspost = in.readByte() != 0; | ||||
|         crosspostParentId = in.readString(); | ||||
|         in.readTypedList(gallery, Gallery.CREATOR); | ||||
|     } | ||||
|  | ||||
|     public String getId() { | ||||
| @@ -312,6 +317,10 @@ public class Post implements Parcelable { | ||||
|         return previewUrl; | ||||
|     } | ||||
|  | ||||
|     public void setPreviewUrl(String previewUrl) { | ||||
|         this.previewUrl = previewUrl; | ||||
|     } | ||||
|  | ||||
|     public String getThumbnailPreviewUrl() { | ||||
|         return thumbnailPreviewUrl; | ||||
|     } | ||||
| @@ -473,6 +482,14 @@ public class Post implements Parcelable { | ||||
|         this.crosspostParentId = crosspostParentId; | ||||
|     } | ||||
|  | ||||
|     public ArrayList<Gallery> getGallery() { | ||||
|         return gallery; | ||||
|     } | ||||
|  | ||||
|     public void setGallery(ArrayList<Gallery> gallery) { | ||||
|         this.gallery = gallery; | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public void writeToParcel(Parcel parcel, int i) { | ||||
|         parcel.writeString(id); | ||||
| @@ -514,6 +531,7 @@ public class Post implements Parcelable { | ||||
|         parcel.writeByte((byte) (saved ? 1 : 0)); | ||||
|         parcel.writeByte((byte) (isCrosspost ? 1 : 0)); | ||||
|         parcel.writeString(crosspostParentId); | ||||
|         parcel.writeTypedList(gallery); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
| @@ -528,4 +546,60 @@ public class Post implements Parcelable { | ||||
|     public int hashCode() { | ||||
|         return id.hashCode(); | ||||
|     } | ||||
|  | ||||
|     public static class Gallery implements Parcelable{ | ||||
|         public static final int TYPE_IMAGE = 0; | ||||
|         public static final int TYPE_GIF = 1; | ||||
|         public static final int TYPE_VIDEO = 2; | ||||
|  | ||||
|         public String mimeType; | ||||
|         public String url; | ||||
|         public String fileName; | ||||
|         public int mediaType; | ||||
|  | ||||
|         public Gallery(String mimeType, String url, String fileName) { | ||||
|             this.mimeType = mimeType; | ||||
|             this.url = url; | ||||
|             this.fileName = fileName; | ||||
|             if (mimeType.contains("gif")) { | ||||
|                 mediaType = TYPE_GIF; | ||||
|             } else if (mimeType.contains("jpg") || mimeType.contains("png")) { | ||||
|                 mediaType = TYPE_IMAGE; | ||||
|             } else { | ||||
|                 mediaType = TYPE_VIDEO; | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         protected Gallery(Parcel in) { | ||||
|             mimeType = in.readString(); | ||||
|             url = in.readString(); | ||||
|             fileName = in.readString(); | ||||
|             mediaType = in.readInt(); | ||||
|         } | ||||
|  | ||||
|         public static final Creator<Gallery> CREATOR = new Creator<Gallery>() { | ||||
|             @Override | ||||
|             public Gallery createFromParcel(Parcel in) { | ||||
|                 return new Gallery(in); | ||||
|             } | ||||
|  | ||||
|             @Override | ||||
|             public Gallery[] newArray(int size) { | ||||
|                 return new Gallery[size]; | ||||
|             } | ||||
|         }; | ||||
|  | ||||
|         @Override | ||||
|         public int describeContents() { | ||||
|             return 0; | ||||
|         } | ||||
|  | ||||
|         @Override | ||||
|         public void writeToParcel(Parcel parcel, int i) { | ||||
|             parcel.writeString(mimeType); | ||||
|             parcel.writeString(url); | ||||
|             parcel.writeString(fileName); | ||||
|             parcel.writeInt(mediaType); | ||||
|         } | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -113,4 +113,12 @@ public class JSONUtils { | ||||
|     public static final String TYPE_KEY = "type"; | ||||
|     public static final String MP4_KEY = "mp4"; | ||||
|     public static final String THINGS_KEY = "things"; | ||||
|     public static final String MEDIA_METADATA_KEY = "media_metadata"; | ||||
|     public static final String GALLERY_DATA_KEY = "gallery_data"; | ||||
|     public static final String ITEMS_KEY = "items"; | ||||
|     public static final String M_KEY = "m"; | ||||
|     public static final String MEDIA_ID_KEY = "media_id"; | ||||
|     public static final String S_KEY = "s"; | ||||
|     public static final String X_KEY = "x"; | ||||
|     public static final String Y_KEY = "y"; | ||||
| } | ||||
|   | ||||
							
								
								
									
										23
									
								
								app/src/main/res/layout/activity_view_reddit_gallery.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								app/src/main/res/layout/activity_view_reddit_gallery.xml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,23 @@ | ||||
| <?xml version="1.0" encoding="utf-8"?> | ||||
| <com.thefuntasty.hauler.HaulerView 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:id="@+id/hauler_view_view_reddit_gallery_activity" | ||||
|     android:layout_width="match_parent" | ||||
|     android:layout_height="match_parent" | ||||
|     app:dragUpEnabled="true" | ||||
|     tools:context=".Activity.ViewRedditGalleryActivity"> | ||||
|  | ||||
|     <androidx.core.widget.NestedScrollView | ||||
|         android:layout_width="match_parent" | ||||
|         android:layout_height="match_parent" | ||||
|         android:fillViewport="true"> | ||||
|  | ||||
|         <androidx.viewpager.widget.ViewPager | ||||
|             android:id="@+id/view_pager_view_reddit_gallery_activity" | ||||
|             android:layout_width="match_parent" | ||||
|             android:layout_height="match_parent" /> | ||||
|  | ||||
|     </androidx.core.widget.NestedScrollView> | ||||
|  | ||||
| </com.thefuntasty.hauler.HaulerView> | ||||
| @@ -0,0 +1,41 @@ | ||||
| <?xml version="1.0" encoding="utf-8"?> | ||||
| <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" | ||||
|     xmlns:tools="http://schemas.android.com/tools" | ||||
|     xmlns:app="http://schemas.android.com/apk/res-auto" | ||||
|     android:id="@+id/constraintLayout" | ||||
|     android:layout_width="match_parent" | ||||
|     android:layout_height="match_parent" | ||||
|     tools:context=".Fragment.ViewImgurImageFragment"> | ||||
|  | ||||
|     <ProgressBar | ||||
|         android:id="@+id/progress_bar_view_reddit_gallery_image_or_gif_fragment" | ||||
|         android:layout_width="wrap_content" | ||||
|         android:layout_height="wrap_content" | ||||
|         android:layout_centerInParent="true" /> | ||||
|  | ||||
|     <com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView | ||||
|         android:id="@+id/image_view_view_reddit_gallery_image_or_gif_fragment" | ||||
|         android:layout_width="match_parent" | ||||
|         android:layout_height="match_parent" | ||||
|         app:quickScaleEnabled="false" /> | ||||
|  | ||||
|     <LinearLayout | ||||
|         android:id="@+id/load_image_error_linear_layout_view_reddit_gallery_image_or_gif_fragment" | ||||
|         android:layout_width="match_parent" | ||||
|         android:layout_height="match_parent" | ||||
|         android:visibility="gone"> | ||||
|  | ||||
|         <TextView | ||||
|             android:layout_width="match_parent" | ||||
|             android:layout_height="wrap_content" | ||||
|             android:drawableTop="@drawable/ic_error_outline_white_24dp" | ||||
|             android:layout_gravity="center" | ||||
|             android:gravity="center" | ||||
|             android:textColor="@android:color/white" | ||||
|             android:text="@string/error_loading_image_tap_to_retry" | ||||
|             android:textSize="?attr/font_default" | ||||
|             android:fontFamily="?attr/font_family" /> | ||||
|  | ||||
|     </LinearLayout> | ||||
|  | ||||
| </RelativeLayout> | ||||
| @@ -0,0 +1,15 @@ | ||||
| <?xml version="1.0" encoding="utf-8"?> | ||||
| <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" | ||||
|     xmlns:tools="http://schemas.android.com/tools" | ||||
|     android:layout_width="match_parent" | ||||
|     android:layout_height="match_parent" | ||||
|     xmlns:app="http://schemas.android.com/apk/res-auto" | ||||
|     tools:context=".Fragment.ViewRedditGalleryVideoFragment"> | ||||
|  | ||||
|     <com.google.android.exoplayer2.ui.PlayerView | ||||
|         android:id="@+id/player_view_view_reddit_gallery_video_fragment" | ||||
|         android:layout_width="match_parent" | ||||
|         android:layout_height="match_parent" | ||||
|         app:controller_layout_id="@layout/exo_playback_control_view"/> | ||||
|  | ||||
| </RelativeLayout> | ||||
							
								
								
									
										338
									
								
								app/src/main/res/layout/item_post_detail_gallery.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										338
									
								
								app/src/main/res/layout/item_post_detail_gallery.xml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,338 @@ | ||||
| <?xml version="1.0" encoding="utf-8"?> | ||||
| <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" | ||||
|     xmlns:app="http://schemas.android.com/apk/res-auto" | ||||
|     android:layout_width="match_parent" | ||||
|     android:layout_height="wrap_content" | ||||
|     android:orientation="vertical" | ||||
|     android:background="?attr/cardViewBackgroundColor"> | ||||
|  | ||||
|     <androidx.constraintlayout.widget.ConstraintLayout | ||||
|         android:id="@+id/constraint_layout_item_post_detail_gallery" | ||||
|         android:layout_width="match_parent" | ||||
|         android:layout_height="wrap_content" | ||||
|         android:padding="16dp"> | ||||
|  | ||||
|         <ml.docilealligator.infinityforreddit.CustomView.AspectRatioGifImageView | ||||
|             android:id="@+id/icon_gif_image_view_item_post_detail_gallery" | ||||
|             android:layout_width="24dp" | ||||
|             android:layout_height="24dp" | ||||
|             app:layout_constraintBottom_toBottomOf="parent" | ||||
|             app:layout_constraintStart_toStartOf="parent" | ||||
|             app:layout_constraintTop_toTopOf="parent" /> | ||||
|  | ||||
|         <TextView | ||||
|             android:id="@+id/subreddit_text_view_item_post_detail_gallery" | ||||
|             android:layout_width="0dp" | ||||
|             android:layout_height="wrap_content" | ||||
|             android:layout_marginStart="16dp" | ||||
|             android:layout_marginEnd="8dp" | ||||
|             android:textSize="?attr/font_default" | ||||
|             android:fontFamily="?attr/font_family" | ||||
|             android:maxLines="2" | ||||
|             android:ellipsize="end" | ||||
|             app:layout_constraintStart_toEndOf="@+id/icon_gif_image_view_item_post_detail_gallery" | ||||
|             app:layout_constraintEnd_toStartOf="@id/guideline" | ||||
|             app:layout_constraintTop_toTopOf="parent" | ||||
|             app:layout_constraintHorizontal_bias="0" /> | ||||
|  | ||||
|         <TextView | ||||
|             android:id="@+id/user_text_view_item_post_detail_gallery" | ||||
|             android:layout_width="0dp" | ||||
|             android:layout_height="wrap_content" | ||||
|             android:layout_marginStart="16dp" | ||||
|             android:layout_marginEnd="8dp" | ||||
|             android:textSize="?attr/font_default" | ||||
|             android:fontFamily="?attr/font_family" | ||||
|             android:maxLines="2" | ||||
|             android:ellipsize="end" | ||||
|             app:layout_constraintBottom_toTopOf="@+id/author_flair_text_view_item_post_detail_gallery" | ||||
|             app:layout_constraintStart_toEndOf="@+id/icon_gif_image_view_item_post_detail_gallery" | ||||
|             app:layout_constraintEnd_toStartOf="@id/guideline" | ||||
|             app:layout_constraintTop_toBottomOf="@+id/subreddit_text_view_item_post_detail_gallery" | ||||
|             app:layout_constraintHorizontal_bias="0" /> | ||||
|  | ||||
|         <TextView | ||||
|             android:id="@+id/author_flair_text_view_item_post_detail_gallery" | ||||
|             android:layout_width="0dp" | ||||
|             android:layout_height="wrap_content" | ||||
|             android:layout_marginStart="16dp" | ||||
|             android:layout_marginEnd="8dp" | ||||
|             android:textSize="?attr/font_12" | ||||
|             android:fontFamily="?attr/font_family" | ||||
|             android:maxLines="2" | ||||
|             android:ellipsize="end" | ||||
|             android:visibility="gone" | ||||
|             app:layout_constraintBottom_toBottomOf="parent" | ||||
|             app:layout_constraintStart_toEndOf="@+id/icon_gif_image_view_item_post_detail_gallery" | ||||
|             app:layout_constraintEnd_toStartOf="@id/guideline" | ||||
|             app:layout_constraintTop_toBottomOf="@+id/user_text_view_item_post_detail_gallery" | ||||
|             app:layout_constraintHorizontal_bias="0" /> | ||||
|  | ||||
|         <TextView | ||||
|             android:id="@+id/post_time_text_view_item_post_detail_gallery" | ||||
|             android:layout_width="0dp" | ||||
|             android:layout_height="wrap_content" | ||||
|             android:gravity="end" | ||||
|             android:textSize="?attr/font_default" | ||||
|             android:fontFamily="?attr/font_family" | ||||
|             app:layout_constraintHorizontal_bias="1" | ||||
|             app:layout_constraintBottom_toBottomOf="parent" | ||||
|             app:layout_constraintStart_toEndOf="@id/guideline" | ||||
|             app:layout_constraintEnd_toEndOf="parent" | ||||
|             app:layout_constraintTop_toTopOf="parent" /> | ||||
|  | ||||
|         <androidx.constraintlayout.widget.Guideline | ||||
|             android:id="@+id/guideline" | ||||
|             android:layout_width="wrap_content" | ||||
|             android:layout_height="wrap_content" | ||||
|             android:orientation="vertical" | ||||
|             app:layout_constraintGuide_percent="0.6" /> | ||||
|  | ||||
|     </androidx.constraintlayout.widget.ConstraintLayout> | ||||
|  | ||||
|     <TextView | ||||
|         android:id="@+id/title_text_view_item_post_detail_gallery" | ||||
|         android:layout_width="match_parent" | ||||
|         android:layout_height="wrap_content" | ||||
|         android:paddingStart="16dp" | ||||
|         android:paddingEnd="16dp" | ||||
|         android:textColor="?attr/primaryTextColor" | ||||
|         android:textSize="?attr/title_font_18" | ||||
|         android:fontFamily="?attr/title_font_family" | ||||
|         android:textIsSelectable="true" | ||||
|         android:enabled="true" | ||||
|         android:focusable="true" | ||||
|         android:longClickable="true" /> | ||||
|  | ||||
|     <com.nex3z.flowlayout.FlowLayout | ||||
|         android:layout_width="match_parent" | ||||
|         android:layout_height="wrap_content" | ||||
|         android:padding="16dp" | ||||
|         app:flChildSpacing="16dp" | ||||
|         app:flChildSpacingForLastRow="align" | ||||
|         app:flRowSpacing="8dp"> | ||||
|  | ||||
|         <com.libRG.CustomTextView | ||||
|             android:id="@+id/type_text_view_item_post_detail_gallery" | ||||
|             android:layout_width="wrap_content" | ||||
|             android:layout_height="wrap_content" | ||||
|             android:padding="4dp" | ||||
|             android:text="@string/gallery" | ||||
|             android:textSize="?attr/font_12" | ||||
|             android:fontFamily="?attr/font_family" | ||||
|             app:lib_setRadius="3dp" | ||||
|             app:lib_setRoundedView="true" | ||||
|             app:lib_setShape="rectangle" /> | ||||
|  | ||||
|         <com.libRG.CustomTextView | ||||
|             android:id="@+id/spoiler_custom_text_view_item_post_detail_gallery" | ||||
|             android:layout_width="wrap_content" | ||||
|             android:layout_height="wrap_content" | ||||
|             android:layout_gravity="center" | ||||
|             android:text="@string/spoiler" | ||||
|             android:textSize="?attr/font_12" | ||||
|             android:fontFamily="?attr/font_family" | ||||
|             android:padding="4dp" | ||||
|             android:visibility="gone" | ||||
|             app:lib_setRadius="3dp" | ||||
|             app:lib_setRoundedView="true" | ||||
|             app:lib_setShape="rectangle" /> | ||||
|  | ||||
|         <com.libRG.CustomTextView | ||||
|             android:id="@+id/nsfw_text_view_item_post_detail_gallery" | ||||
|             android:layout_width="wrap_content" | ||||
|             android:layout_height="wrap_content" | ||||
|             android:padding="4dp" | ||||
|             android:text="@string/nsfw" | ||||
|             android:textSize="?attr/font_12" | ||||
|             android:fontFamily="?attr/font_family" | ||||
|             android:visibility="gone" | ||||
|             app:lib_setRadius="3dp" | ||||
|             app:lib_setRoundedView="true" | ||||
|             app:lib_setShape="rectangle" /> | ||||
|  | ||||
|         <com.libRG.CustomTextView | ||||
|             android:id="@+id/flair_custom_text_view_item_post_detail_gallery" | ||||
|             android:layout_width="wrap_content" | ||||
|             android:layout_height="wrap_content" | ||||
|             android:layout_gravity="center" | ||||
|             android:padding="4dp" | ||||
|             android:textSize="?attr/font_12" | ||||
|             android:fontFamily="?attr/font_family" | ||||
|             android:visibility="gone" | ||||
|             app:lib_setRadius="3dp" | ||||
|             app:lib_setRoundedView="true" | ||||
|             app:lib_setShape="rectangle" /> | ||||
|  | ||||
|         <ImageView | ||||
|             android:id="@+id/archived_image_view_item_post_detail_gallery" | ||||
|             android:layout_width="20dp" | ||||
|             android:layout_height="20dp" | ||||
|             android:src="@drawable/ic_archive_outline" | ||||
|             android:visibility="gone" /> | ||||
|  | ||||
|         <ImageView | ||||
|             android:id="@+id/locked_image_view_item_post_detail_gallery" | ||||
|             android:layout_width="20dp" | ||||
|             android:layout_height="20dp" | ||||
|             android:src="@drawable/ic_outline_lock_24dp" | ||||
|             android:visibility="gone" /> | ||||
|  | ||||
|         <ImageView | ||||
|             android:id="@+id/crosspost_image_view_item_post_detail_gallery" | ||||
|             android:layout_width="20dp" | ||||
|             android:layout_height="20dp" | ||||
|             android:src="@drawable/crosspost" | ||||
|             android:visibility="gone" /> | ||||
|  | ||||
|         <TextView | ||||
|             android:id="@+id/awards_text_view_item_post_detail_gallery" | ||||
|             android:layout_width="wrap_content" | ||||
|             android:layout_height="wrap_content" | ||||
|             android:textSize="?attr/font_12" | ||||
|             android:fontFamily="?attr/font_family" | ||||
|             android:visibility="gone" /> | ||||
|  | ||||
|     </com.nex3z.flowlayout.FlowLayout> | ||||
|  | ||||
|     <RelativeLayout | ||||
|         android:id="@+id/image_view_wrapper_item_post_detail_gallery" | ||||
|         android:layout_width="match_parent" | ||||
|         android:layout_height="wrap_content" | ||||
|         android:visibility="gone"> | ||||
|  | ||||
|         <ml.docilealligator.infinityforreddit.CustomView.AspectRatioGifImageView | ||||
|             android:id="@+id/image_view_item_post_detail_gallery" | ||||
|             android:layout_width="match_parent" | ||||
|             android:layout_height="wrap_content" | ||||
|             android:adjustViewBounds="true" | ||||
|             android:scaleType="fitStart" /> | ||||
|  | ||||
|         <RelativeLayout | ||||
|             android:id="@+id/load_wrapper_item_post_detail_gallery" | ||||
|             android:layout_width="match_parent" | ||||
|             android:layout_height="wrap_content" | ||||
|             android:layout_centerInParent="true" | ||||
|             android:visibility="gone"> | ||||
|  | ||||
|             <ProgressBar | ||||
|                 android:id="@+id/progress_bar_item_post_detail_gallery" | ||||
|                 android:layout_width="wrap_content" | ||||
|                 android:layout_height="wrap_content" | ||||
|                 android:layout_centerInParent="true" /> | ||||
|  | ||||
|             <TextView | ||||
|                 android:id="@+id/load_image_error_text_view_item_post_detail_gallery" | ||||
|                 android:layout_width="match_parent" | ||||
|                 android:layout_height="wrap_content" | ||||
|                 android:drawableTop="@drawable/ic_error_outline_black_24dp" | ||||
|                 android:layout_centerInParent="true" | ||||
|                 android:gravity="center" | ||||
|                 android:text="@string/error_loading_image_tap_to_retry" | ||||
|                 android:textSize="?attr/font_default" | ||||
|                 android:fontFamily="?attr/font_family" | ||||
|                 android:visibility="gone" /> | ||||
|  | ||||
|         </RelativeLayout> | ||||
|  | ||||
|     </RelativeLayout> | ||||
|  | ||||
|     <ImageView | ||||
|         android:id="@+id/image_view_no_preview_link_item_post_detail_gallery" | ||||
|         android:layout_width="match_parent" | ||||
|         android:layout_height="150dp" | ||||
|         android:scaleType="center" | ||||
|         android:src="@drawable/ic_link" | ||||
|         android:visibility="gone" /> | ||||
|  | ||||
|     <androidx.constraintlayout.widget.ConstraintLayout | ||||
|         android:layout_width="match_parent" | ||||
|         android:layout_height="wrap_content" | ||||
|         android:id="@+id/bottom_constraint_layout_item_post_detail_gallery"> | ||||
|  | ||||
|         <ImageView | ||||
|             android:id="@+id/plus_button_item_post_detail_gallery" | ||||
|             android:layout_width="wrap_content" | ||||
|             android:layout_height="wrap_content" | ||||
|             android:padding="12dp" | ||||
|             android:src="@drawable/ic_arrow_upward_grey_24dp" | ||||
|             android:tint="@android:color/tab_indicator_text" | ||||
|             android:background="?actionBarItemBackground" | ||||
|             android:clickable="true" | ||||
|             android:focusable="true" | ||||
|             app:layout_constraintTop_toTopOf="parent" | ||||
|             app:layout_constraintBottom_toBottomOf="parent" | ||||
|             app:layout_constraintStart_toStartOf="parent" /> | ||||
|  | ||||
|         <TextView | ||||
|             android:id="@+id/score_text_view_item_post_detail_gallery" | ||||
|             android:layout_width="64dp" | ||||
|             android:layout_height="wrap_content" | ||||
|             android:gravity="center" | ||||
|             android:textSize="?attr/font_12" | ||||
|             android:textStyle="bold" | ||||
|             android:fontFamily="?attr/font_family" | ||||
|             app:layout_constraintTop_toTopOf="parent" | ||||
|             app:layout_constraintBottom_toBottomOf="parent" | ||||
|             app:layout_constraintStart_toEndOf="@id/plus_button_item_post_detail_gallery" /> | ||||
|  | ||||
|         <ImageView | ||||
|             android:id="@+id/minus_button_item_post_detail_gallery" | ||||
|             android:layout_width="wrap_content" | ||||
|             android:layout_height="wrap_content" | ||||
|             android:padding="12dp" | ||||
|             android:src="@drawable/ic_arrow_downward_grey_24dp" | ||||
|             android:tint="@android:color/tab_indicator_text" | ||||
|             android:background="?actionBarItemBackground" | ||||
|             android:clickable="true" | ||||
|             android:focusable="true" | ||||
|             app:layout_constraintTop_toTopOf="parent" | ||||
|             app:layout_constraintBottom_toBottomOf="parent" | ||||
|             app:layout_constraintStart_toEndOf="@id/score_text_view_item_post_detail_gallery" /> | ||||
|  | ||||
|         <TextView | ||||
|             android:id="@+id/comments_count_item_post_detail_gallery" | ||||
|             android:layout_width="wrap_content" | ||||
|             android:layout_height="wrap_content" | ||||
|             android:padding="12dp" | ||||
|             android:gravity="center_vertical" | ||||
|             android:textSize="?attr/font_12" | ||||
|             android:textStyle="bold" | ||||
|             android:fontFamily="?attr/font_family" | ||||
|             android:drawableStart="@drawable/ic_comment_grey_24dp" | ||||
|             android:drawablePadding="12dp" | ||||
|             app:layout_constraintTop_toTopOf="parent" | ||||
|             app:layout_constraintBottom_toBottomOf="parent" | ||||
|             app:layout_constraintStart_toEndOf="@id/minus_button_item_post_detail_gallery" /> | ||||
|  | ||||
|         <ImageView | ||||
|             android:id="@+id/save_button_item_post_detail_gallery" | ||||
|             android:layout_width="wrap_content" | ||||
|             android:layout_height="wrap_content" | ||||
|             android:padding="12dp" | ||||
|             android:tint="@android:color/tab_indicator_text" | ||||
|             android:background="?actionBarItemBackground" | ||||
|             android:clickable="true" | ||||
|             android:focusable="true" | ||||
|             app:layout_constraintHorizontal_bias="1" | ||||
|             app:layout_constraintTop_toTopOf="parent" | ||||
|             app:layout_constraintBottom_toBottomOf="parent" | ||||
|             app:layout_constraintStart_toEndOf="@id/comments_count_item_post_detail_gallery" | ||||
|             app:layout_constraintEnd_toStartOf="@id/share_button_item_post_detail_gallery" /> | ||||
|  | ||||
|         <ImageView | ||||
|             android:id="@+id/share_button_item_post_detail_gallery" | ||||
|             android:layout_width="wrap_content" | ||||
|             android:layout_height="wrap_content" | ||||
|             android:padding="12dp" | ||||
|             android:src="@drawable/ic_share_grey_24dp" | ||||
|             android:background="?actionBarItemBackground" | ||||
|             android:clickable="true" | ||||
|             android:focusable="true" | ||||
|             app:layout_constraintTop_toTopOf="parent" | ||||
|             app:layout_constraintBottom_toBottomOf="parent" | ||||
|             app:layout_constraintEnd_toEndOf="parent" /> | ||||
|  | ||||
|     </androidx.constraintlayout.widget.ConstraintLayout> | ||||
|  | ||||
| </LinearLayout> | ||||
| @@ -219,8 +219,7 @@ | ||||
|         android:layout_width="match_parent" | ||||
|         android:layout_height="150dp" | ||||
|         android:scaleType="center" | ||||
|         android:src="@drawable/ic_link" | ||||
|         android:tint="@android:color/tab_indicator_text" /> | ||||
|         android:src="@drawable/ic_link" /> | ||||
|  | ||||
|     <androidx.constraintlayout.widget.ConstraintLayout | ||||
|         android:layout_width="match_parent" | ||||
|   | ||||
							
								
								
									
										337
									
								
								app/src/main/res/layout/item_post_gallery.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										337
									
								
								app/src/main/res/layout/item_post_gallery.xml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,337 @@ | ||||
| <?xml version="1.0" encoding="utf-8"?> | ||||
| <com.google.android.material.card.MaterialCardView xmlns:android="http://schemas.android.com/apk/res/android" | ||||
|     xmlns:app="http://schemas.android.com/apk/res-auto" | ||||
|     android:layout_width="match_parent" | ||||
|     android:layout_height="wrap_content" | ||||
|     android:layout_marginTop="8dp" | ||||
|     android:layout_marginBottom="8dp" | ||||
|     android:id="@+id/card_view_item_post_gallery_type" | ||||
|     app:cardBackgroundColor="?attr/cardViewBackgroundColor" | ||||
|     app:cardElevation="2dp" | ||||
|     app:cardCornerRadius="16dp"> | ||||
|  | ||||
|     <LinearLayout | ||||
|         android:layout_width="match_parent" | ||||
|         android:layout_height="wrap_content" | ||||
|         android:orientation="vertical"> | ||||
|  | ||||
|         <androidx.constraintlayout.widget.ConstraintLayout | ||||
|             android:layout_width="match_parent" | ||||
|             android:layout_height="wrap_content" | ||||
|             android:padding="16dp"> | ||||
|  | ||||
|             <ml.docilealligator.infinityforreddit.CustomView.AspectRatioGifImageView | ||||
|                 android:id="@+id/icon_gif_image_view_item_post_gallery_type" | ||||
|                 android:layout_width="24dp" | ||||
|                 android:layout_height="24dp" | ||||
|                 android:layout_gravity="center" | ||||
|                 app:layout_constraintBottom_toBottomOf="parent" | ||||
|                 app:layout_constraintStart_toStartOf="parent" | ||||
|                 app:layout_constraintTop_toTopOf="parent"/> | ||||
|  | ||||
|             <TextView | ||||
|                 android:id="@+id/subreddit_name_text_view_item_post_gallery_type" | ||||
|                 android:layout_width="0dp" | ||||
|                 android:layout_height="wrap_content" | ||||
|                 android:layout_gravity="center" | ||||
|                 android:layout_marginStart="16dp" | ||||
|                 android:layout_marginEnd="8dp" | ||||
|                 android:textSize="?attr/font_default" | ||||
|                 android:fontFamily="?attr/font_family" | ||||
|                 app:layout_constraintBottom_toTopOf="@id/user_text_view_item_post_gallery_type" | ||||
|                 app:layout_constraintStart_toEndOf="@id/icon_gif_image_view_item_post_gallery_type" | ||||
|                 app:layout_constraintEnd_toStartOf="@id/stickied_post_image_view_item_post_gallery_type" | ||||
|                 app:layout_constraintTop_toTopOf="parent"/> | ||||
|  | ||||
|             <TextView | ||||
|                 android:id="@+id/user_text_view_item_post_gallery_type" | ||||
|                 android:layout_width="0dp" | ||||
|                 android:layout_height="wrap_content" | ||||
|                 android:layout_marginStart="16dp" | ||||
|                 android:layout_marginEnd="8dp" | ||||
|                 android:textSize="?attr/font_default" | ||||
|                 android:fontFamily="?attr/font_family" | ||||
|                 android:maxLines="2" | ||||
|                 android:ellipsize="end" | ||||
|                 app:layout_constraintBottom_toBottomOf="parent" | ||||
|                 app:layout_constraintStart_toEndOf="@+id/icon_gif_image_view_item_post_gallery_type" | ||||
|                 app:layout_constraintEnd_toStartOf="@id/stickied_post_image_view_item_post_gallery_type" | ||||
|                 app:layout_constraintTop_toBottomOf="@+id/subreddit_name_text_view_item_post_gallery_type" | ||||
|                 app:layout_constraintHorizontal_bias="0" /> | ||||
|  | ||||
|             <ImageView | ||||
|                 android:id="@+id/stickied_post_image_view_item_post_gallery_type" | ||||
|                 android:layout_width="24dp" | ||||
|                 android:layout_height="24dp" | ||||
|                 android:layout_marginEnd="8dp" | ||||
|                 android:visibility="gone" | ||||
|                 app:layout_constraintBottom_toBottomOf="parent" | ||||
|                 app:layout_constraintStart_toEndOf="@id/subreddit_name_text_view_item_post_gallery_type" | ||||
|                 app:layout_constraintEnd_toStartOf="@+id/guideline2" | ||||
|                 app:layout_constraintTop_toTopOf="parent"/> | ||||
|  | ||||
|             <TextView | ||||
|                 android:id="@+id/post_time_text_view_item_post_gallery_type" | ||||
|                 android:layout_width="0dp" | ||||
|                 android:layout_height="wrap_content" | ||||
|                 android:gravity="end" | ||||
|                 android:textSize="?attr/font_default" | ||||
|                 android:fontFamily="?attr/font_family" | ||||
|                 app:layout_constraintBottom_toBottomOf="parent" | ||||
|                 app:layout_constraintEnd_toEndOf="parent" | ||||
|                 app:layout_constraintStart_toEndOf="@id/guideline2" | ||||
|                 app:layout_constraintTop_toTopOf="parent" /> | ||||
|  | ||||
|             <androidx.constraintlayout.widget.Guideline | ||||
|                 android:id="@+id/guideline2" | ||||
|                 android:layout_width="wrap_content" | ||||
|                 android:layout_height="wrap_content" | ||||
|                 android:orientation="vertical" | ||||
|                 app:layout_constraintGuide_percent="0.6" /> | ||||
|  | ||||
|         </androidx.constraintlayout.widget.ConstraintLayout> | ||||
|  | ||||
|         <TextView | ||||
|             android:id="@+id/title_text_view_item_post_gallery_type" | ||||
|             android:layout_width="match_parent" | ||||
|             android:layout_height="wrap_content" | ||||
|             android:paddingStart="16dp" | ||||
|             android:paddingEnd="16dp" | ||||
|             android:textSize="?attr/title_font_18" | ||||
|             android:fontFamily="?attr/title_font_family" /> | ||||
|  | ||||
|         <com.nex3z.flowlayout.FlowLayout | ||||
|             android:layout_width="match_parent" | ||||
|             android:layout_height="wrap_content" | ||||
|             android:padding="16dp" | ||||
|             app:flChildSpacing="16dp" | ||||
|             app:flChildSpacingForLastRow="align" | ||||
|             app:flRowSpacing="8dp"> | ||||
|  | ||||
|             <com.libRG.CustomTextView | ||||
|                 android:id="@+id/type_text_view_item_post_gallery_type" | ||||
|                 android:layout_width="wrap_content" | ||||
|                 android:layout_height="wrap_content" | ||||
|                 android:padding="4dp" | ||||
|                 android:text="@string/gallery" | ||||
|                 android:textSize="?attr/font_12" | ||||
|                 android:fontFamily="?attr/font_family" | ||||
|                 app:lib_setRadius="3dp" | ||||
|                 app:lib_setRoundedView="true" | ||||
|                 app:lib_setShape="rectangle" /> | ||||
|  | ||||
|             <com.libRG.CustomTextView | ||||
|                 android:id="@+id/spoiler_custom_text_view_item_post_gallery_type" | ||||
|                 android:layout_width="wrap_content" | ||||
|                 android:layout_height="wrap_content" | ||||
|                 android:layout_gravity="center" | ||||
|                 android:text="@string/spoiler" | ||||
|                 android:textSize="?attr/font_12" | ||||
|                 android:fontFamily="?attr/font_family" | ||||
|                 android:padding="4dp" | ||||
|                 android:visibility="gone" | ||||
|                 app:lib_setRadius="3dp" | ||||
|                 app:lib_setRoundedView="true" | ||||
|                 app:lib_setShape="rectangle" /> | ||||
|  | ||||
|             <com.libRG.CustomTextView | ||||
|                 android:id="@+id/nsfw_text_view_item_post_gallery_type" | ||||
|                 android:layout_width="wrap_content" | ||||
|                 android:layout_height="wrap_content" | ||||
|                 android:padding="4dp" | ||||
|                 android:text="@string/nsfw" | ||||
|                 android:textSize="?attr/font_12" | ||||
|                 android:fontFamily="?attr/font_family" | ||||
|                 android:visibility="gone" | ||||
|                 app:lib_setRadius="3dp" | ||||
|                 app:lib_setRoundedView="true" | ||||
|                 app:lib_setShape="rectangle" /> | ||||
|  | ||||
|             <com.libRG.CustomTextView | ||||
|                 android:id="@+id/flair_custom_text_view_item_post_gallery_type" | ||||
|                 android:layout_width="wrap_content" | ||||
|                 android:layout_height="wrap_content" | ||||
|                 android:layout_gravity="center" | ||||
|                 android:textSize="?attr/font_12" | ||||
|                 android:fontFamily="?attr/font_family" | ||||
|                 android:padding="4dp" | ||||
|                 android:visibility="gone" | ||||
|                 app:lib_setRadius="3dp" | ||||
|                 app:lib_setRoundedView="true" | ||||
|                 app:lib_setShape="rectangle" /> | ||||
|  | ||||
|             <com.libRG.CustomTextView | ||||
|                 android:id="@+id/awards_text_view_item_post_gallery_type" | ||||
|                 android:layout_width="wrap_content" | ||||
|                 android:layout_height="wrap_content" | ||||
|                 android:padding="4dp" | ||||
|                 android:textSize="?attr/font_12" | ||||
|                 android:fontFamily="?attr/font_family" | ||||
|                 android:visibility="gone" | ||||
|                 app:lib_setRadius="3dp" | ||||
|                 app:lib_setRoundedView="true" | ||||
|                 app:lib_setShape="rectangle" /> | ||||
|  | ||||
|             <ImageView | ||||
|                 android:id="@+id/archived_image_view_item_post_gallery_type" | ||||
|                 android:layout_width="24dp" | ||||
|                 android:layout_height="24dp" | ||||
|                 android:src="@drawable/ic_archive_outline" | ||||
|                 android:visibility="gone" /> | ||||
|  | ||||
|             <ImageView | ||||
|                 android:id="@+id/locked_image_view_item_post_gallery_type" | ||||
|                 android:layout_width="24dp" | ||||
|                 android:layout_height="24dp" | ||||
|                 android:src="@drawable/ic_outline_lock_24dp" | ||||
|                 android:visibility="gone" /> | ||||
|  | ||||
|             <ImageView | ||||
|                 android:id="@+id/crosspost_image_view_item_post_gallery_type" | ||||
|                 android:layout_width="24dp" | ||||
|                 android:layout_height="24dp" | ||||
|                 android:src="@drawable/crosspost" | ||||
|                 android:visibility="gone" /> | ||||
|  | ||||
|         </com.nex3z.flowlayout.FlowLayout> | ||||
|  | ||||
|         <RelativeLayout | ||||
|             android:id="@+id/image_wrapper_relative_layout_item_post_gallery" | ||||
|             android:layout_width="match_parent" | ||||
|             android:layout_height="wrap_content" | ||||
|             android:visibility="gone"> | ||||
|  | ||||
|             <ml.docilealligator.infinityforreddit.CustomView.AspectRatioGifImageView | ||||
|                 android:id="@+id/image_view_item_post_gallery_type" | ||||
|                 android:layout_width="match_parent" | ||||
|                 android:layout_height="wrap_content" | ||||
|                 android:adjustViewBounds="true" | ||||
|                 android:scaleType="fitStart" /> | ||||
|  | ||||
|             <ProgressBar | ||||
|                 android:id="@+id/progress_bar_item_post_gallery_type" | ||||
|                 android:layout_width="wrap_content" | ||||
|                 android:layout_height="wrap_content" | ||||
|                 android:layout_centerInParent="true" /> | ||||
|  | ||||
|             <RelativeLayout | ||||
|                 android:id="@+id/load_image_error_relative_layout_item_post_gallery_type" | ||||
|                 android:layout_width="match_parent" | ||||
|                 android:layout_height="match_parent" | ||||
|                 android:layout_centerInParent="true" | ||||
|                 android:visibility="gone"> | ||||
|  | ||||
|                 <TextView | ||||
|                     android:id="@+id/load_image_error_text_view_item_post_gallery_type" | ||||
|                     android:layout_width="match_parent" | ||||
|                     android:layout_height="wrap_content" | ||||
|                     android:drawableTop="@drawable/ic_error_outline_black_24dp" | ||||
|                     android:layout_gravity="center" | ||||
|                     android:gravity="center" | ||||
|                     android:text="@string/error_loading_image_tap_to_retry" | ||||
|                     android:textSize="?attr/font_default" | ||||
|                     android:fontFamily="?attr/font_family" /> | ||||
|  | ||||
|             </RelativeLayout> | ||||
|  | ||||
|         </RelativeLayout> | ||||
|  | ||||
|         <ImageView | ||||
|             android:id="@+id/image_view_no_preview_gallery_item_post_gallery_type" | ||||
|             android:layout_width="match_parent" | ||||
|             android:layout_height="150dp" | ||||
|             android:scaleType="center" | ||||
|             android:src="@drawable/ic_link" | ||||
|             android:tint="@android:color/tab_indicator_text" | ||||
|             android:visibility="gone" /> | ||||
|  | ||||
|         <androidx.constraintlayout.widget.ConstraintLayout | ||||
|             android:id="@+id/bottom_constraint_layout_item_post_gallery_type" | ||||
|             android:layout_width="match_parent" | ||||
|             android:layout_height="wrap_content"> | ||||
|  | ||||
|             <ImageView | ||||
|                 android:id="@+id/plus_button_item_post_gallery_type" | ||||
|                 android:layout_width="wrap_content" | ||||
|                 android:layout_height="wrap_content" | ||||
|                 android:padding="12dp" | ||||
|                 android:src="@drawable/ic_arrow_upward_grey_24dp" | ||||
|                 android:background="?actionBarItemBackground" | ||||
|                 android:clickable="true" | ||||
|                 android:focusable="true" | ||||
|                 app:layout_constraintTop_toTopOf="parent" | ||||
|                 app:layout_constraintBottom_toBottomOf="parent" | ||||
|                 app:layout_constraintStart_toStartOf="parent" /> | ||||
|  | ||||
|             <TextView | ||||
|                 android:id="@+id/score_text_view_item_post_gallery_type" | ||||
|                 android:layout_width="64dp" | ||||
|                 android:layout_height="wrap_content" | ||||
|                 android:gravity="center" | ||||
|                 android:textSize="?attr/font_12" | ||||
|                 android:textStyle="bold" | ||||
|                 android:fontFamily="?attr/font_family" | ||||
|                 app:layout_constraintTop_toTopOf="parent" | ||||
|                 app:layout_constraintBottom_toBottomOf="parent" | ||||
|                 app:layout_constraintStart_toEndOf="@id/plus_button_item_post_gallery_type" /> | ||||
|  | ||||
|             <ImageView | ||||
|                 android:id="@+id/minus_button_item_post_gallery_type" | ||||
|                 android:layout_width="wrap_content" | ||||
|                 android:layout_height="wrap_content" | ||||
|                 android:padding="12dp" | ||||
|                 android:src="@drawable/ic_arrow_downward_grey_24dp" | ||||
|                 android:background="?actionBarItemBackground" | ||||
|                 android:clickable="true" | ||||
|                 android:focusable="true" | ||||
|                 app:layout_constraintTop_toTopOf="parent" | ||||
|                 app:layout_constraintBottom_toBottomOf="parent" | ||||
|                 app:layout_constraintStart_toEndOf="@id/score_text_view_item_post_gallery_type" /> | ||||
|  | ||||
|             <TextView | ||||
|                 android:id="@+id/comments_count_item_post_gallery_type" | ||||
|                 android:layout_width="wrap_content" | ||||
|                 android:layout_height="wrap_content" | ||||
|                 android:padding="12dp" | ||||
|                 android:gravity="center_vertical" | ||||
|                 android:textSize="?attr/font_12" | ||||
|                 android:textStyle="bold" | ||||
|                 android:fontFamily="?attr/font_family" | ||||
|                 android:drawableStart="@drawable/ic_comment_grey_24dp" | ||||
|                 android:drawablePadding="12dp" | ||||
|                 app:layout_constraintTop_toTopOf="parent" | ||||
|                 app:layout_constraintBottom_toBottomOf="parent" | ||||
|                 app:layout_constraintStart_toEndOf="@id/minus_button_item_post_gallery_type" /> | ||||
|  | ||||
|             <ImageView | ||||
|                 android:id="@+id/save_button_item_post_gallery_type" | ||||
|                 android:layout_width="wrap_content" | ||||
|                 android:layout_height="wrap_content" | ||||
|                 android:padding="12dp" | ||||
|                 android:background="?actionBarItemBackground" | ||||
|                 android:clickable="true" | ||||
|                 android:focusable="true" | ||||
|                 app:layout_constraintHorizontal_bias="1" | ||||
|                 app:layout_constraintTop_toTopOf="parent" | ||||
|                 app:layout_constraintBottom_toBottomOf="parent" | ||||
|                 app:layout_constraintStart_toEndOf="@id/comments_count_item_post_gallery_type" | ||||
|                 app:layout_constraintEnd_toStartOf="@id/share_button_item_post_gallery_type" /> | ||||
|  | ||||
|             <ImageView | ||||
|                 android:id="@+id/share_button_item_post_gallery_type" | ||||
|                 android:layout_width="wrap_content" | ||||
|                 android:layout_height="wrap_content" | ||||
|                 android:padding="12dp" | ||||
|                 android:src="@drawable/ic_share_grey_24dp" | ||||
|                 android:background="?actionBarItemBackground" | ||||
|                 android:clickable="true" | ||||
|                 android:focusable="true" | ||||
|                 app:layout_constraintTop_toTopOf="parent" | ||||
|                 app:layout_constraintBottom_toBottomOf="parent" | ||||
|                 app:layout_constraintEnd_toEndOf="parent" /> | ||||
|  | ||||
|         </androidx.constraintlayout.widget.ConstraintLayout> | ||||
|  | ||||
|     </LinearLayout> | ||||
|  | ||||
| </com.google.android.material.card.MaterialCardView> | ||||
| @@ -2,21 +2,21 @@ | ||||
| <menu xmlns:android="http://schemas.android.com/apk/res/android" | ||||
|     xmlns:app="http://schemas.android.com/apk/res-auto"> | ||||
|     <item | ||||
|         android:id="@+id/action_download_view_imgur_image_fragments" | ||||
|         android:id="@+id/action_download_view_imgur_image_fragment" | ||||
|         android:orderInCategory="1" | ||||
|         android:title="@string/action_download" | ||||
|         android:icon="@drawable/ic_file_download_toolbar_white_24dp" | ||||
|         app:showAsAction="ifRoom" /> | ||||
| 
 | ||||
|     <item | ||||
|         android:id="@+id/action_share_view_imgur_image_fragments" | ||||
|         android:id="@+id/action_share_view_imgur_image_fragment" | ||||
|         android:orderInCategory="2" | ||||
|         android:title="@string/action_share" | ||||
|         android:icon="@drawable/ic_share_toolbar_white_24dp" | ||||
|         app:showAsAction="ifRoom" /> | ||||
| 
 | ||||
|     <item | ||||
|         android:id="@+id/action_set_wallpaper_view_imgur_image_fragments" | ||||
|         android:id="@+id/action_set_wallpaper_view_imgur_image_fragment" | ||||
|         android:orderInCategory="3" | ||||
|         android:title="@string/action_set_wallpaper" | ||||
|         app:showAsAction="never" /> | ||||
| @@ -2,7 +2,7 @@ | ||||
| <menu xmlns:android="http://schemas.android.com/apk/res/android" | ||||
|     xmlns:app="http://schemas.android.com/apk/res-auto"> | ||||
|     <item | ||||
|         android:id="@+id/action_download_view_imgur_image_fragments" | ||||
|         android:id="@+id/action_download_view_imgur_video_fragment" | ||||
|         android:orderInCategory="1" | ||||
|         android:title="@string/action_download" | ||||
|         android:icon="@drawable/ic_file_download_toolbar_white_24dp" | ||||
|   | ||||
| @@ -0,0 +1,23 @@ | ||||
| <?xml version="1.0" encoding="utf-8"?> | ||||
| <menu xmlns:android="http://schemas.android.com/apk/res/android" | ||||
|     xmlns:app="http://schemas.android.com/apk/res-auto"> | ||||
|     <item | ||||
|         android:id="@+id/action_download_view_reddit_gallery_image_or_gif_fragment" | ||||
|         android:orderInCategory="1" | ||||
|         android:title="@string/action_download" | ||||
|         android:icon="@drawable/ic_file_download_toolbar_white_24dp" | ||||
|         app:showAsAction="ifRoom" /> | ||||
|  | ||||
|     <item | ||||
|         android:id="@+id/action_share_view_reddit_gallery_image_or_gif_fragment" | ||||
|         android:orderInCategory="2" | ||||
|         android:title="@string/action_share" | ||||
|         android:icon="@drawable/ic_share_toolbar_white_24dp" | ||||
|         app:showAsAction="ifRoom" /> | ||||
|  | ||||
|     <item | ||||
|         android:id="@+id/action_set_wallpaper_view_reddit_gallery_image_or_gif_fragment" | ||||
|         android:orderInCategory="3" | ||||
|         android:title="@string/action_set_wallpaper" | ||||
|         app:showAsAction="never" /> | ||||
| </menu> | ||||
							
								
								
									
										10
									
								
								app/src/main/res/menu/view_reddit_gallery_video_fragment.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								app/src/main/res/menu/view_reddit_gallery_video_fragment.xml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,10 @@ | ||||
| <?xml version="1.0" encoding="utf-8"?> | ||||
| <menu xmlns:android="http://schemas.android.com/apk/res/android" | ||||
|     xmlns:app="http://schemas.android.com/apk/res-auto"> | ||||
|     <item | ||||
|         android:id="@+id/action_download_view_reddit_gallery_video_fragment" | ||||
|         android:orderInCategory="1" | ||||
|         android:title="@string/action_download" | ||||
|         android:icon="@drawable/ic_file_download_toolbar_white_24dp" | ||||
|         app:showAsAction="ifRoom" /> | ||||
| </menu> | ||||
| @@ -29,6 +29,9 @@ | ||||
|     <string name="view_imgur_media_activity_image_label">Image %1$d/%2$d</string> | ||||
|     <string name="view_imgur_media_activity_video_label">Video %1$d/%2$d</string> | ||||
|     <string name="send_private_message_activity_label">Send PM</string> | ||||
|     <string name="view_reddit_gallery_activity_image_label">Image %1$d/%2$d</string> | ||||
|     <string name="view_reddit_gallery_activity_gif_label">Gif %1$d/%2$d</string> | ||||
|     <string name="view_reddit_gallery_activity_video_label">Video %1$d/%2$d</string> | ||||
|  | ||||
|     <string name="navigation_drawer_open">Open navigation drawer</string> | ||||
|     <string name="navigation_drawer_close">Close navigation drawer</string> | ||||
| @@ -263,6 +266,7 @@ | ||||
|     <string name="image">IMAGE</string> | ||||
|     <string name="video">VIDEO</string> | ||||
|     <string name="gif">GIF</string> | ||||
|     <string name="gallery">GALLERY</string> | ||||
|     <string name="best">Best</string> | ||||
|     <string name="search">Search</string> | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user