Loading app/src/main/java/app/fedilab/android/peertube/drawer/PeertubeAdapter.java +381 −175 Original line number Diff line number Diff line Loading @@ -59,6 +59,7 @@ import java.util.Map; import app.fedilab.android.R; import app.fedilab.android.databinding.DrawerPeertubeBinding; import app.fedilab.android.databinding.DrawerPeertubeListBinding; import app.fedilab.android.peertube.activities.PeertubeActivity; import app.fedilab.android.peertube.activities.PeertubeEditUploadActivity; import app.fedilab.android.peertube.activities.ShowChannelActivity; Loading Loading @@ -90,6 +91,22 @@ public class PeertubeAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolde private ChannelData.Channel forChannel; private AccountData.PeertubeAccount forAccount; @NonNull @Override public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { context = parent.getContext(); SharedPreferences sharedpreferences = PreferenceManager.getDefaultSharedPreferences(context); boolean videoInList = sharedpreferences.getBoolean(context.getString(R.string.set_video_in_list_choice), false); if (videoInList) { DrawerPeertubeListBinding itemBinding = DrawerPeertubeListBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false); return new VideoListViewHolder(itemBinding); } else { DrawerPeertubeBinding itemBinding = DrawerPeertubeBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false); return new VideoViewHolder(itemBinding); } } public PeertubeAdapter(List<VideoData.Video> videos, TimelineVM.TimelineType timelineType, boolean sepiaSearch, ChannelData.Channel forChannel, AccountData.PeertubeAccount forAccount) { this.videos = videos; this.timelineType = timelineType; Loading @@ -103,27 +120,207 @@ public class PeertubeAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolde this.videos = videos; } @NonNull @Override public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { context = parent.getContext(); DrawerPeertubeBinding itemBinding = DrawerPeertubeBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false); return new ViewHolder(itemBinding); public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int position) { SharedPreferences sharedpreferences = PreferenceManager.getDefaultSharedPreferences(context); boolean videoInList = sharedpreferences.getBoolean(context.getString(R.string.set_video_in_list_choice), false); if (videoInList) { final VideoListViewHolder holder = (VideoListViewHolder) viewHolder; final VideoData.Video video = videos.get(position); if (video == null) { return; } boolean ownVideos; if (timelineType == TimelineVM.TimelineType.MY_VIDEOS) { ownVideos = true; } else { ownVideos = Helper.isVideoOwner(context, video); } String instance = null; if (sepiaSearch) { instance = video.getAccount().getHost(); } else if (forChannel != null) { instance = forChannel.getHost(); } else if (forAccount != null) { instance = forAccount.getHost(); } holder.binding.peertubeDisplayname.setText(video.getChannel().getDisplayName()); holder.binding.peertubeUsername.setText(video.getChannel().getAcct()); Helper.loadAvatar(context, video.getChannel(), holder.binding.peertubeChannelAvatar); holder.binding.peertubeTitle.setText(video.getName()); if (video.isLive()) { holder.binding.peertubeDuration.setText(R.string.live); holder.binding.peertubeDuration.setBackgroundResource(R.drawable.rounded_live); } else { holder.binding.peertubeDuration.setText(Helper.secondsToString(video.getDuration())); holder.binding.peertubeDuration.setBackgroundResource(R.drawable.rounded_corner); } @Override public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int position) { holder.binding.peertubeDate.setText(String.format(" - %s", Helper.dateDiffFull(video.getCreatedAt()))); holder.binding.peertubeViews.setText(context.getString(R.string.number_view_video, Helper.withSuffix(video.getViews()))); boolean blur = sharedpreferences.getString(context.getString(R.string.set_video_sensitive_choice), Helper.BLUR).compareTo("blur") == 0 && video.isNsfw(); loadImage(holder.binding.peertubeVideoImage, instance, video.getPreviewPath(), video.getThumbnailPath(), blur); holder.binding.previewContainer.setVisibility(View.VISIBLE); //For Overview Videos: boolean values for displaying title is managed in the fragment if (video.isHasTitle()) { holder.binding.headerTitle.setVisibility(View.VISIBLE); switch (video.getTitleType()) { case TAG: holder.binding.headerTitle.setText(String.format("#%s", video.getTitle())); break; case CHANNEL: case CATEGORY: holder.binding.headerTitle.setText(String.format("%s", video.getTitle())); break; } } else { holder.binding.headerTitle.setVisibility(View.GONE); } if (!ownVideos) { holder.binding.peertubeChannelInfo.setOnClickListener(v -> { Intent intent = new Intent(context, ShowChannelActivity.class); Bundle b = new Bundle(); b.putSerializable("channel", video.getChannel()); b.putBoolean("sepia_search", sepiaSearch || forChannel != null); if (sepiaSearch || forChannel != null) { b.putString("peertube_instance", video.getAccount().getHost()); } intent.putExtras(b); context.startActivity(intent); }); } final ViewHolder holder = (ViewHolder) viewHolder; holder.binding.moreActions.setOnClickListener(view -> { PopupMenu popup = new PopupMenu(context, holder.binding.moreActions); popup.getMenuInflater() .inflate(R.menu.video_drawer_menu_peertube, popup.getMenu()); if (timelineType == MY_VIDEOS) { popup.getMenu().findItem(R.id.action_report).setVisible(false); popup.getMenu().findItem(R.id.action_follow).setVisible(false); } else { popup.getMenu().findItem(R.id.action_edit).setVisible(false); if (relationShipListener == null || relationShipListener.getRelationShip() == null || relationShipListener.getRelationShip().size() == 0) { popup.getMenu().findItem(R.id.action_follow).setVisible(false); } else { popup.getMenu().findItem(R.id.action_follow).setVisible(true); if (relationShipListener.getRelationShip().containsKey(video.getChannel().getAcct()) && relationShipListener.getRelationShip().get(video.getChannel().getAcct())) { popup.getMenu().findItem(R.id.action_follow).setTitle(context.getString(R.string.action_unfollow)); } else { popup.getMenu().findItem(R.id.action_follow).setTitle(context.getString(R.string.action_follow)); } } } popup.getMenu().findItem(R.id.action_playlist).setVisible(playlistListener != null && playlistListener.getPlaylist() != null && playlistListener.getPlaylist().size() != 0); popup.setOnMenuItemClickListener(item -> { int itemId = item.getItemId(); if (itemId == R.id.action_follow) { if (relationShipListener.getRelationShip().containsKey(video.getChannel().getAcct()) && relationShipListener.getRelationShip().get(video.getChannel().getAcct())) { relationShipListener.getRelationShip().put(video.getChannel().getAcct(), false); popup.getMenu().findItem(R.id.action_follow).setTitle(context.getString(R.string.action_follow)); boolean confirm_unfollow = sharedpreferences.getBoolean(Helper.SET_UNFOLLOW_VALIDATION, true); if (confirm_unfollow) { AlertDialog.Builder unfollowConfirm = new MaterialAlertDialogBuilder(context); unfollowConfirm.setTitle(context.getString(R.string.unfollow_confirm)); unfollowConfirm.setMessage(video.getChannel().getAcct()); unfollowConfirm.setNegativeButton(R.string.cancel, (dialog, which) -> dialog.dismiss()); unfollowConfirm.setPositiveButton(R.string.yes, (dialog, which) -> { PostActionsVM viewModel = new ViewModelProvider((ViewModelStoreOwner) context).get(PostActionsVM.class); viewModel.post(UNFOLLOW, video.getChannel().getAcct(), null).observe((LifecycleOwner) context, apiResponse -> manageVIewPostActions(UNFOLLOW, apiResponse)); dialog.dismiss(); }); unfollowConfirm.show(); } else { PostActionsVM viewModel = new ViewModelProvider((ViewModelStoreOwner) context).get(PostActionsVM.class); viewModel.post(UNFOLLOW, video.getChannel().getAcct(), null).observe((LifecycleOwner) context, apiResponse -> manageVIewPostActions(UNFOLLOW, apiResponse)); } } else { relationShipListener.getRelationShip().put(video.getChannel().getAcct(), true); popup.getMenu().findItem(R.id.action_follow).setTitle(context.getString(R.string.action_unfollow)); PostActionsVM viewModel = new ViewModelProvider((ViewModelStoreOwner) context).get(PostActionsVM.class); viewModel.post(FOLLOW, video.getChannel().getAcct(), null).observe((LifecycleOwner) context, apiResponse -> manageVIewPostActions(FOLLOW, apiResponse)); } } else if (itemId == R.id.action_playlist) { PlaylistsVM viewModelOwnerPlaylist = new ViewModelProvider((ViewModelStoreOwner) context).get(PlaylistsVM.class); viewModelOwnerPlaylist.manage(PlaylistsVM.action.GET_PLAYLISTS, null, null).observe((LifecycleOwner) context, apiResponse -> manageVIewPlaylists(video, apiResponse)); } else if (itemId == R.id.action_edit) { Intent intent = new Intent(context, PeertubeEditUploadActivity.class); Bundle b = new Bundle(); b.putString("video_id", video.getUuid()); intent.putExtras(b); context.startActivity(intent); } else if (itemId == R.id.action_report) { AlertDialog.Builder dialogBuilder = new MaterialAlertDialogBuilder(context); LayoutInflater inflater1 = ((Activity) context).getLayoutInflater(); View dialogView = inflater1.inflate(R.layout.popup_report_peertube, new LinearLayout(context), false); dialogBuilder.setView(dialogView); EditText report_content = dialogView.findViewById(R.id.report_content); dialogBuilder.setNeutralButton(R.string.cancel, (dialog2, id) -> dialog2.dismiss()); dialogBuilder.setPositiveButton(R.string.report, (dialog2, id) -> { if (report_content.getText().toString().trim().length() == 0) { Toasty.info(context, context.getString(R.string.report_comment_size), Toasty.LENGTH_LONG).show(); } else { PostActionsVM viewModel = new ViewModelProvider((ViewModelStoreOwner) context).get(PostActionsVM.class); Report report = new Report(); Report.VideoReport videoReport = new Report.VideoReport(); videoReport.setId(video.getId()); report.setVideo(videoReport); report.setReason(report_content.getText().toString()); viewModel.report(report).observe((LifecycleOwner) context, apiResponse -> manageVIewPostActions(RetrofitPeertubeAPI.ActionType.REPORT_VIDEO, apiResponse)); dialog2.dismiss(); } }); AlertDialog alertDialog2 = dialogBuilder.create(); alertDialog2.show(); } return true; }); popup.show(); }); holder.binding.peertubeVideoInfo.setOnClickListener(v -> { Intent intent = new Intent(context, PeertubeActivity.class); Bundle b = new Bundle(); b.putString("video_id", video.getId()); b.putString("video_uuid", video.getUuid()); b.putBoolean("isMyVideo", ownVideos); b.putBoolean("sepia_search", sepiaSearch); b.putSerializable("video", video); if (sepiaSearch) { b.putString("peertube_instance", video.getAccount().getHost()); } intent.putExtras(b); context.startActivity(intent); }); holder.binding.peertubeVideoImage.setOnClickListener(v -> { Intent intent = new Intent(context, PeertubeActivity.class); Bundle b = new Bundle(); b.putString("video_id", video.getId()); b.putSerializable("video", video); b.putString("video_uuid", video.getUuid()); b.putBoolean("isMyVideo", ownVideos); b.putBoolean("sepia_search", sepiaSearch); if (sepiaSearch) { b.putString("peertube_instance", video.getAccount().getHost()); } intent.putExtras(b); context.startActivity(intent); }); } else { final VideoViewHolder holder = (VideoViewHolder) viewHolder; final VideoData.Video video = videos.get(position); if (video == null) { return; } SharedPreferences sharedpreferences = PreferenceManager.getDefaultSharedPreferences(context); boolean videoInList = sharedpreferences.getBoolean(context.getString(R.string.set_video_in_list_choice), false); boolean ownVideos; if (timelineType == TimelineVM.TimelineType.MY_VIDEOS) { Loading Loading @@ -155,19 +352,12 @@ public class PeertubeAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolde } holder.binding.peertubeDate.setText(String.format(" - %s", Helper.dateDiff(context, video.getCreatedAt()))); holder.binding.peertubeDate.setText(String.format(" - %s", Helper.dateDiffFull(video.getCreatedAt()))); holder.binding.peertubeViews.setText(context.getString(R.string.number_view_video, Helper.withSuffix(video.getViews()))); boolean blur = sharedpreferences.getString(context.getString(R.string.set_video_sensitive_choice), Helper.BLUR).compareTo("blur") == 0 && video.isNsfw(); if (videoInList) { Helper.loadGiF(context, instance, video.getThumbnailPath(), holder.binding.peertubeVideoImageSmall, blur); holder.binding.peertubeVideoImageSmall.setVisibility(View.VISIBLE); holder.binding.previewContainer.setVisibility(View.GONE); } else { loadImage(holder.binding.peertubeVideoImage, instance, video.getPreviewPath(), video.getThumbnailPath(), blur); holder.binding.peertubeVideoImageSmall.setVisibility(View.GONE); holder.binding.previewContainer.setVisibility(View.VISIBLE); } //For Overview Videos: boolean values for displaying title is managed in the fragment if (video.isHasTitle()) { Loading Loading @@ -314,10 +504,18 @@ public class PeertubeAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolde intent.putExtras(b); context.startActivity(intent); }); } } enum typeOfTimeline { CLASSIC, LIST } public void manageVIewPlaylists(VideoData.Video video, APIResponse apiResponse) { if (apiResponse.getError() != null) { return; Loading Loading @@ -477,14 +675,22 @@ public class PeertubeAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolde Map<String, List<PlaylistExist>> getPlaylist(); } static class ViewHolder extends RecyclerView.ViewHolder { static class VideoViewHolder extends RecyclerView.ViewHolder { DrawerPeertubeBinding binding; ViewHolder(DrawerPeertubeBinding itemView) { VideoViewHolder(DrawerPeertubeBinding itemView) { super(itemView.getRoot()); binding = itemView; } } static class VideoListViewHolder extends RecyclerView.ViewHolder { DrawerPeertubeListBinding binding; VideoListViewHolder(DrawerPeertubeListBinding itemView) { super(itemView.getRoot()); binding = itemView; } } } No newline at end of file app/src/main/java/app/fedilab/android/peertube/helper/Helper.java +10 −0 Original line number Diff line number Diff line Loading @@ -216,6 +216,16 @@ public class Helper { return String.format(Locale.getDefault(), "%s:%s", strMin, strSec); } public static String dateDiffFull(Date dateToot) { SimpleDateFormat df = (SimpleDateFormat) DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.SHORT, Locale.getDefault()); try { return df.format(dateToot); } catch (Exception e) { return ""; } } /*** * Returns a String depending of the date * @param context Context Loading app/src/main/res/layouts/peertube/layout/drawer_peertube.xml +7 −20 Original line number Diff line number Diff line Loading @@ -31,10 +31,8 @@ android:padding="6dp" android:textAlignment="center" android:textAppearance="@style/TextAppearance.Material3.TitleLarge" android:visibility="gone" app:layout_constraintTop_toTopOf="parent" tools:text="Science" tools:visibility="visible" /> tools:text="Science" /> <com.google.android.material.card.MaterialCardView style="@style/Widget.Material3.CardView.Elevated" Loading Loading @@ -135,17 +133,6 @@ android:padding="6dp" android:paddingHorizontal="6dp"> <ImageView android:id="@+id/peertube_video_image_small" android:layout_width="72dp" android:layout_height="72dp" android:layout_marginEnd="6dp" android:contentDescription="@string/image_preview" android:scaleType="centerCrop" android:visibility="gone" tools:src="@tools:sample/backgrounds/scenic" tools:visibility="visible" /> <androidx.appcompat.widget.LinearLayoutCompat android:layout_width="0dp" android:layout_height="wrap_content" Loading @@ -156,7 +143,7 @@ android:id="@+id/peertube_title" android:layout_width="match_parent" android:layout_height="wrap_content" android:textAppearance="@style/TextAppearance.Material3.TitleMedium" android:textAppearance="@style/TextAppearance.Material3.BodyMedium" android:textColor="?colorPrimary" android:textStyle="bold" tools:maxLines="1" Loading @@ -171,7 +158,7 @@ android:id="@+id/peertube_views" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textAppearance="@style/TextAppearance.Material3.ActionBar.Subtitle" android:textAppearance="@style/TextAppearance.Material3.BodyLarge" tools:text="100 views" /> <TextView Loading @@ -179,7 +166,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="6dp" android:textAppearance="@style/TextAppearance.Material3.ActionBar.Subtitle" android:textAppearance="@style/TextAppearance.Material3.BodyLarge" tools:text="- 1 h" /> </androidx.appcompat.widget.LinearLayoutCompat> Loading @@ -190,9 +177,9 @@ <com.google.android.material.button.MaterialButton android:id="@+id/more_actions" style="@style/Widget.Material3.Button.IconButton" android:layout_width="wrap_content" android:layout_height="wrap_content" style="@style/Widget.Material3.Button.OutlinedButton.Icon" android:layout_width="48dp" android:layout_height="48dp" app:icon="@drawable/ic_baseline_more_vert_24" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toBottomOf="@id/peertube_video_image" /> Loading app/src/main/res/layouts/peertube/layout/drawer_peertube_list.xml 0 → 100644 +188 −0 File added.Preview size limit exceeded, changes collapsed. Show changes Loading
app/src/main/java/app/fedilab/android/peertube/drawer/PeertubeAdapter.java +381 −175 Original line number Diff line number Diff line Loading @@ -59,6 +59,7 @@ import java.util.Map; import app.fedilab.android.R; import app.fedilab.android.databinding.DrawerPeertubeBinding; import app.fedilab.android.databinding.DrawerPeertubeListBinding; import app.fedilab.android.peertube.activities.PeertubeActivity; import app.fedilab.android.peertube.activities.PeertubeEditUploadActivity; import app.fedilab.android.peertube.activities.ShowChannelActivity; Loading Loading @@ -90,6 +91,22 @@ public class PeertubeAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolde private ChannelData.Channel forChannel; private AccountData.PeertubeAccount forAccount; @NonNull @Override public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { context = parent.getContext(); SharedPreferences sharedpreferences = PreferenceManager.getDefaultSharedPreferences(context); boolean videoInList = sharedpreferences.getBoolean(context.getString(R.string.set_video_in_list_choice), false); if (videoInList) { DrawerPeertubeListBinding itemBinding = DrawerPeertubeListBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false); return new VideoListViewHolder(itemBinding); } else { DrawerPeertubeBinding itemBinding = DrawerPeertubeBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false); return new VideoViewHolder(itemBinding); } } public PeertubeAdapter(List<VideoData.Video> videos, TimelineVM.TimelineType timelineType, boolean sepiaSearch, ChannelData.Channel forChannel, AccountData.PeertubeAccount forAccount) { this.videos = videos; this.timelineType = timelineType; Loading @@ -103,27 +120,207 @@ public class PeertubeAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolde this.videos = videos; } @NonNull @Override public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { context = parent.getContext(); DrawerPeertubeBinding itemBinding = DrawerPeertubeBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false); return new ViewHolder(itemBinding); public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int position) { SharedPreferences sharedpreferences = PreferenceManager.getDefaultSharedPreferences(context); boolean videoInList = sharedpreferences.getBoolean(context.getString(R.string.set_video_in_list_choice), false); if (videoInList) { final VideoListViewHolder holder = (VideoListViewHolder) viewHolder; final VideoData.Video video = videos.get(position); if (video == null) { return; } boolean ownVideos; if (timelineType == TimelineVM.TimelineType.MY_VIDEOS) { ownVideos = true; } else { ownVideos = Helper.isVideoOwner(context, video); } String instance = null; if (sepiaSearch) { instance = video.getAccount().getHost(); } else if (forChannel != null) { instance = forChannel.getHost(); } else if (forAccount != null) { instance = forAccount.getHost(); } holder.binding.peertubeDisplayname.setText(video.getChannel().getDisplayName()); holder.binding.peertubeUsername.setText(video.getChannel().getAcct()); Helper.loadAvatar(context, video.getChannel(), holder.binding.peertubeChannelAvatar); holder.binding.peertubeTitle.setText(video.getName()); if (video.isLive()) { holder.binding.peertubeDuration.setText(R.string.live); holder.binding.peertubeDuration.setBackgroundResource(R.drawable.rounded_live); } else { holder.binding.peertubeDuration.setText(Helper.secondsToString(video.getDuration())); holder.binding.peertubeDuration.setBackgroundResource(R.drawable.rounded_corner); } @Override public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int position) { holder.binding.peertubeDate.setText(String.format(" - %s", Helper.dateDiffFull(video.getCreatedAt()))); holder.binding.peertubeViews.setText(context.getString(R.string.number_view_video, Helper.withSuffix(video.getViews()))); boolean blur = sharedpreferences.getString(context.getString(R.string.set_video_sensitive_choice), Helper.BLUR).compareTo("blur") == 0 && video.isNsfw(); loadImage(holder.binding.peertubeVideoImage, instance, video.getPreviewPath(), video.getThumbnailPath(), blur); holder.binding.previewContainer.setVisibility(View.VISIBLE); //For Overview Videos: boolean values for displaying title is managed in the fragment if (video.isHasTitle()) { holder.binding.headerTitle.setVisibility(View.VISIBLE); switch (video.getTitleType()) { case TAG: holder.binding.headerTitle.setText(String.format("#%s", video.getTitle())); break; case CHANNEL: case CATEGORY: holder.binding.headerTitle.setText(String.format("%s", video.getTitle())); break; } } else { holder.binding.headerTitle.setVisibility(View.GONE); } if (!ownVideos) { holder.binding.peertubeChannelInfo.setOnClickListener(v -> { Intent intent = new Intent(context, ShowChannelActivity.class); Bundle b = new Bundle(); b.putSerializable("channel", video.getChannel()); b.putBoolean("sepia_search", sepiaSearch || forChannel != null); if (sepiaSearch || forChannel != null) { b.putString("peertube_instance", video.getAccount().getHost()); } intent.putExtras(b); context.startActivity(intent); }); } final ViewHolder holder = (ViewHolder) viewHolder; holder.binding.moreActions.setOnClickListener(view -> { PopupMenu popup = new PopupMenu(context, holder.binding.moreActions); popup.getMenuInflater() .inflate(R.menu.video_drawer_menu_peertube, popup.getMenu()); if (timelineType == MY_VIDEOS) { popup.getMenu().findItem(R.id.action_report).setVisible(false); popup.getMenu().findItem(R.id.action_follow).setVisible(false); } else { popup.getMenu().findItem(R.id.action_edit).setVisible(false); if (relationShipListener == null || relationShipListener.getRelationShip() == null || relationShipListener.getRelationShip().size() == 0) { popup.getMenu().findItem(R.id.action_follow).setVisible(false); } else { popup.getMenu().findItem(R.id.action_follow).setVisible(true); if (relationShipListener.getRelationShip().containsKey(video.getChannel().getAcct()) && relationShipListener.getRelationShip().get(video.getChannel().getAcct())) { popup.getMenu().findItem(R.id.action_follow).setTitle(context.getString(R.string.action_unfollow)); } else { popup.getMenu().findItem(R.id.action_follow).setTitle(context.getString(R.string.action_follow)); } } } popup.getMenu().findItem(R.id.action_playlist).setVisible(playlistListener != null && playlistListener.getPlaylist() != null && playlistListener.getPlaylist().size() != 0); popup.setOnMenuItemClickListener(item -> { int itemId = item.getItemId(); if (itemId == R.id.action_follow) { if (relationShipListener.getRelationShip().containsKey(video.getChannel().getAcct()) && relationShipListener.getRelationShip().get(video.getChannel().getAcct())) { relationShipListener.getRelationShip().put(video.getChannel().getAcct(), false); popup.getMenu().findItem(R.id.action_follow).setTitle(context.getString(R.string.action_follow)); boolean confirm_unfollow = sharedpreferences.getBoolean(Helper.SET_UNFOLLOW_VALIDATION, true); if (confirm_unfollow) { AlertDialog.Builder unfollowConfirm = new MaterialAlertDialogBuilder(context); unfollowConfirm.setTitle(context.getString(R.string.unfollow_confirm)); unfollowConfirm.setMessage(video.getChannel().getAcct()); unfollowConfirm.setNegativeButton(R.string.cancel, (dialog, which) -> dialog.dismiss()); unfollowConfirm.setPositiveButton(R.string.yes, (dialog, which) -> { PostActionsVM viewModel = new ViewModelProvider((ViewModelStoreOwner) context).get(PostActionsVM.class); viewModel.post(UNFOLLOW, video.getChannel().getAcct(), null).observe((LifecycleOwner) context, apiResponse -> manageVIewPostActions(UNFOLLOW, apiResponse)); dialog.dismiss(); }); unfollowConfirm.show(); } else { PostActionsVM viewModel = new ViewModelProvider((ViewModelStoreOwner) context).get(PostActionsVM.class); viewModel.post(UNFOLLOW, video.getChannel().getAcct(), null).observe((LifecycleOwner) context, apiResponse -> manageVIewPostActions(UNFOLLOW, apiResponse)); } } else { relationShipListener.getRelationShip().put(video.getChannel().getAcct(), true); popup.getMenu().findItem(R.id.action_follow).setTitle(context.getString(R.string.action_unfollow)); PostActionsVM viewModel = new ViewModelProvider((ViewModelStoreOwner) context).get(PostActionsVM.class); viewModel.post(FOLLOW, video.getChannel().getAcct(), null).observe((LifecycleOwner) context, apiResponse -> manageVIewPostActions(FOLLOW, apiResponse)); } } else if (itemId == R.id.action_playlist) { PlaylistsVM viewModelOwnerPlaylist = new ViewModelProvider((ViewModelStoreOwner) context).get(PlaylistsVM.class); viewModelOwnerPlaylist.manage(PlaylistsVM.action.GET_PLAYLISTS, null, null).observe((LifecycleOwner) context, apiResponse -> manageVIewPlaylists(video, apiResponse)); } else if (itemId == R.id.action_edit) { Intent intent = new Intent(context, PeertubeEditUploadActivity.class); Bundle b = new Bundle(); b.putString("video_id", video.getUuid()); intent.putExtras(b); context.startActivity(intent); } else if (itemId == R.id.action_report) { AlertDialog.Builder dialogBuilder = new MaterialAlertDialogBuilder(context); LayoutInflater inflater1 = ((Activity) context).getLayoutInflater(); View dialogView = inflater1.inflate(R.layout.popup_report_peertube, new LinearLayout(context), false); dialogBuilder.setView(dialogView); EditText report_content = dialogView.findViewById(R.id.report_content); dialogBuilder.setNeutralButton(R.string.cancel, (dialog2, id) -> dialog2.dismiss()); dialogBuilder.setPositiveButton(R.string.report, (dialog2, id) -> { if (report_content.getText().toString().trim().length() == 0) { Toasty.info(context, context.getString(R.string.report_comment_size), Toasty.LENGTH_LONG).show(); } else { PostActionsVM viewModel = new ViewModelProvider((ViewModelStoreOwner) context).get(PostActionsVM.class); Report report = new Report(); Report.VideoReport videoReport = new Report.VideoReport(); videoReport.setId(video.getId()); report.setVideo(videoReport); report.setReason(report_content.getText().toString()); viewModel.report(report).observe((LifecycleOwner) context, apiResponse -> manageVIewPostActions(RetrofitPeertubeAPI.ActionType.REPORT_VIDEO, apiResponse)); dialog2.dismiss(); } }); AlertDialog alertDialog2 = dialogBuilder.create(); alertDialog2.show(); } return true; }); popup.show(); }); holder.binding.peertubeVideoInfo.setOnClickListener(v -> { Intent intent = new Intent(context, PeertubeActivity.class); Bundle b = new Bundle(); b.putString("video_id", video.getId()); b.putString("video_uuid", video.getUuid()); b.putBoolean("isMyVideo", ownVideos); b.putBoolean("sepia_search", sepiaSearch); b.putSerializable("video", video); if (sepiaSearch) { b.putString("peertube_instance", video.getAccount().getHost()); } intent.putExtras(b); context.startActivity(intent); }); holder.binding.peertubeVideoImage.setOnClickListener(v -> { Intent intent = new Intent(context, PeertubeActivity.class); Bundle b = new Bundle(); b.putString("video_id", video.getId()); b.putSerializable("video", video); b.putString("video_uuid", video.getUuid()); b.putBoolean("isMyVideo", ownVideos); b.putBoolean("sepia_search", sepiaSearch); if (sepiaSearch) { b.putString("peertube_instance", video.getAccount().getHost()); } intent.putExtras(b); context.startActivity(intent); }); } else { final VideoViewHolder holder = (VideoViewHolder) viewHolder; final VideoData.Video video = videos.get(position); if (video == null) { return; } SharedPreferences sharedpreferences = PreferenceManager.getDefaultSharedPreferences(context); boolean videoInList = sharedpreferences.getBoolean(context.getString(R.string.set_video_in_list_choice), false); boolean ownVideos; if (timelineType == TimelineVM.TimelineType.MY_VIDEOS) { Loading Loading @@ -155,19 +352,12 @@ public class PeertubeAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolde } holder.binding.peertubeDate.setText(String.format(" - %s", Helper.dateDiff(context, video.getCreatedAt()))); holder.binding.peertubeDate.setText(String.format(" - %s", Helper.dateDiffFull(video.getCreatedAt()))); holder.binding.peertubeViews.setText(context.getString(R.string.number_view_video, Helper.withSuffix(video.getViews()))); boolean blur = sharedpreferences.getString(context.getString(R.string.set_video_sensitive_choice), Helper.BLUR).compareTo("blur") == 0 && video.isNsfw(); if (videoInList) { Helper.loadGiF(context, instance, video.getThumbnailPath(), holder.binding.peertubeVideoImageSmall, blur); holder.binding.peertubeVideoImageSmall.setVisibility(View.VISIBLE); holder.binding.previewContainer.setVisibility(View.GONE); } else { loadImage(holder.binding.peertubeVideoImage, instance, video.getPreviewPath(), video.getThumbnailPath(), blur); holder.binding.peertubeVideoImageSmall.setVisibility(View.GONE); holder.binding.previewContainer.setVisibility(View.VISIBLE); } //For Overview Videos: boolean values for displaying title is managed in the fragment if (video.isHasTitle()) { Loading Loading @@ -314,10 +504,18 @@ public class PeertubeAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolde intent.putExtras(b); context.startActivity(intent); }); } } enum typeOfTimeline { CLASSIC, LIST } public void manageVIewPlaylists(VideoData.Video video, APIResponse apiResponse) { if (apiResponse.getError() != null) { return; Loading Loading @@ -477,14 +675,22 @@ public class PeertubeAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolde Map<String, List<PlaylistExist>> getPlaylist(); } static class ViewHolder extends RecyclerView.ViewHolder { static class VideoViewHolder extends RecyclerView.ViewHolder { DrawerPeertubeBinding binding; ViewHolder(DrawerPeertubeBinding itemView) { VideoViewHolder(DrawerPeertubeBinding itemView) { super(itemView.getRoot()); binding = itemView; } } static class VideoListViewHolder extends RecyclerView.ViewHolder { DrawerPeertubeListBinding binding; VideoListViewHolder(DrawerPeertubeListBinding itemView) { super(itemView.getRoot()); binding = itemView; } } } No newline at end of file
app/src/main/java/app/fedilab/android/peertube/helper/Helper.java +10 −0 Original line number Diff line number Diff line Loading @@ -216,6 +216,16 @@ public class Helper { return String.format(Locale.getDefault(), "%s:%s", strMin, strSec); } public static String dateDiffFull(Date dateToot) { SimpleDateFormat df = (SimpleDateFormat) DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.SHORT, Locale.getDefault()); try { return df.format(dateToot); } catch (Exception e) { return ""; } } /*** * Returns a String depending of the date * @param context Context Loading
app/src/main/res/layouts/peertube/layout/drawer_peertube.xml +7 −20 Original line number Diff line number Diff line Loading @@ -31,10 +31,8 @@ android:padding="6dp" android:textAlignment="center" android:textAppearance="@style/TextAppearance.Material3.TitleLarge" android:visibility="gone" app:layout_constraintTop_toTopOf="parent" tools:text="Science" tools:visibility="visible" /> tools:text="Science" /> <com.google.android.material.card.MaterialCardView style="@style/Widget.Material3.CardView.Elevated" Loading Loading @@ -135,17 +133,6 @@ android:padding="6dp" android:paddingHorizontal="6dp"> <ImageView android:id="@+id/peertube_video_image_small" android:layout_width="72dp" android:layout_height="72dp" android:layout_marginEnd="6dp" android:contentDescription="@string/image_preview" android:scaleType="centerCrop" android:visibility="gone" tools:src="@tools:sample/backgrounds/scenic" tools:visibility="visible" /> <androidx.appcompat.widget.LinearLayoutCompat android:layout_width="0dp" android:layout_height="wrap_content" Loading @@ -156,7 +143,7 @@ android:id="@+id/peertube_title" android:layout_width="match_parent" android:layout_height="wrap_content" android:textAppearance="@style/TextAppearance.Material3.TitleMedium" android:textAppearance="@style/TextAppearance.Material3.BodyMedium" android:textColor="?colorPrimary" android:textStyle="bold" tools:maxLines="1" Loading @@ -171,7 +158,7 @@ android:id="@+id/peertube_views" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textAppearance="@style/TextAppearance.Material3.ActionBar.Subtitle" android:textAppearance="@style/TextAppearance.Material3.BodyLarge" tools:text="100 views" /> <TextView Loading @@ -179,7 +166,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="6dp" android:textAppearance="@style/TextAppearance.Material3.ActionBar.Subtitle" android:textAppearance="@style/TextAppearance.Material3.BodyLarge" tools:text="- 1 h" /> </androidx.appcompat.widget.LinearLayoutCompat> Loading @@ -190,9 +177,9 @@ <com.google.android.material.button.MaterialButton android:id="@+id/more_actions" style="@style/Widget.Material3.Button.IconButton" android:layout_width="wrap_content" android:layout_height="wrap_content" style="@style/Widget.Material3.Button.OutlinedButton.Icon" android:layout_width="48dp" android:layout_height="48dp" app:icon="@drawable/ic_baseline_more_vert_24" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toBottomOf="@id/peertube_video_image" /> Loading
app/src/main/res/layouts/peertube/layout/drawer_peertube_list.xml 0 → 100644 +188 −0 File added.Preview size limit exceeded, changes collapsed. Show changes