Improve menu for videos

This commit is contained in:
Thomas 2020-10-07 17:46:15 +02:00
parent 0a84b75518
commit bd0c59a69e
15 changed files with 226 additions and 87 deletions

View File

@ -193,11 +193,12 @@
<string name="video_settings">Paramètres des vidéos</string>
<string name="app_interface">Interface</string>
<string name="modify_playlists">Vidéo dans les listes de lecture</string>
<string-array name="settings_video_mode">
<item>Normal</item>
<item>Streaming</item>
<item>Navigateur</item>
<item>Streaming</item>
</string-array>
<string name="set_cache_mode">Cache</string>

View File

@ -235,6 +235,7 @@
<string name="delete_channel">Remove channel</string>
<string name="action_channel_confirm_delete">Are you sure to permanently delete this channel?</string>
<string name="modify_playlists">Video in playlists</string>
<string name="no_muted">No muted accounts!</string>
<string name="error_display_name_channel">You must define a name and a display name for this channel!</string>

View File

@ -1087,7 +1087,9 @@ public class PeertubeActivity extends AppCompatActivity implements CommentListAd
public void manageVIewPlaylists(PlaylistsVM.action actionType, APIResponse apiResponse) {
if (actionType == GET_PLAYLISTS && apiResponse != null) {
playlists = apiResponse.getPlaylists();
playlistsViewModel.videoExists(videoId).observe(PeertubeActivity.this, this::manageVIewVideosExist);
List<String> videoIds = new ArrayList<>();
videoIds.add(videoId);
playlistsViewModel.videoExists(videoIds).observe(PeertubeActivity.this, this::manageVIewVideosExist);
}
}

View File

@ -81,7 +81,7 @@ public class ShowAccountActivity extends AppCompatActivity {
private ViewPager mPager;
private TabLayout tabLayout;
private TextView account_note, subscriber_count;
private List<Map<String, Boolean>> relationship;
private Map<String, Boolean> relationship;
private ImageView account_pp;
private TextView account_dn;
private Channel channel;
@ -312,7 +312,7 @@ public class ShowAccountActivity extends AppCompatActivity {
}
account_follow.setEnabled(true);
boolean isFollowing = relationship.get(0).get(channel.getAcct());
boolean isFollowing = relationship.get(channel.getAcct());
if (isFollowing) {
account_follow.setText(R.string.action_unfollow);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {

View File

@ -81,7 +81,7 @@ public class ShowChannelActivity extends AppCompatActivity {
private ViewPager mPager;
private TabLayout tabLayout;
private TextView account_note, subscriber_count;
private List<Map<String, Boolean>> relationship;
private Map<String, Boolean> relationship;
private ImageView account_pp;
private TextView account_dn;
private Channel channel;
@ -311,7 +311,7 @@ public class ShowChannelActivity extends AppCompatActivity {
}
account_follow.setEnabled(true);
boolean isFollowing = relationship.get(0).get(channel.getAcct());
boolean isFollowing = relationship.get(channel.getAcct());
if (isFollowing) {
account_follow.setText(R.string.action_unfollow);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {

View File

@ -49,7 +49,7 @@ public class APIResponse {
private List<NotificationData.Notification> peertubeNotifications = null;
private List<PlaylistData.Playlist> playlists = null;
private List<String> domains = null;
private List<Map<String, Boolean>> relationships = null;
private Map<String, Boolean> relationships = null;
private List<CaptionData.Caption> captions = null;
private Error error = null;
private String since_id, max_id;
@ -152,11 +152,11 @@ public class APIResponse {
this.statusCode = statusCode;
}
public List<Map<String, Boolean>> getRelationships() {
public Map<String, Boolean> getRelationships() {
return relationships;
}
public void setRelationships(List<Map<String, Boolean>> relationships) {
public void setRelationships(Map<String, Boolean> relationships) {
this.relationships = relationships;
}

View File

@ -238,7 +238,7 @@ public interface PeertubeService {
Call<VideoPlaylistData> getVideosPlayList(@Header("Authorization") String credentials, @Path("id") String id);
@GET("users/me/video-playlists/videos-exist")
Call<Map<String, List<PlaylistExist>>> getVideoExistsInPlaylist(@Header("Authorization") String credentials, @Query("videoIds") String videoIds);
Call<Map<String, List<PlaylistExist>>> getVideoExistsInPlaylist(@Header("Authorization") String credentials, @Query("videoIds") List<String> videoIds);
@Multipart
@POST("video-playlists")
@ -290,10 +290,7 @@ public interface PeertubeService {
Call<AccountData> getSubscription(@Header("Authorization") String credentials, @Query("start") String maxId);
@GET("users/me/subscriptions/exist")
Call<List<Map<String, Boolean>>> getSubscriptionsExist(@Header("Authorization") String credentials, @Query("uris") List<String> uris);
@GET("users/me/subscriptions/exist")
Call<Map<String, Boolean>> getSubscriptionExists(@Header("Authorization") String credentials, @Query("uris") String uris);
Call<Map<String, Boolean>> getSubscriptionsExist(@Header("Authorization") String credentials, @Query("uris") List<String> uris);
@FormUrlEncoded
@POST("users/me/subscriptions")

View File

@ -379,21 +379,19 @@ public class RetrofitPeertubeAPI {
/**
* Check if users via their uris are following the authenticated user
* Retrieves playlists for a video *synchronously*
*
* @param uris List<String>
* @param videoIds List<String> ids of videos
* @return APIResponse
*/
public APIResponse isFollowing(String uris) {
APIResponse apiResponse = new APIResponse();
public APIResponse getVideosExist(List<String> videoIds) {
PeertubeService peertubeService = init();
Call<Map<String, Boolean>> followingCall = peertubeService.getSubscriptionExists(getToken(), uris);
APIResponse apiResponse = new APIResponse();
try {
Response<Map<String, Boolean>> response = followingCall.execute();
if (response.isSuccessful()) {
List<Map<String, Boolean>> relations = new ArrayList<>();
relations.add(response.body());
apiResponse.setRelationships(relations);
Call<Map<String, List<PlaylistExist>>> videoExistsInPlaylist = peertubeService.getVideoExistsInPlaylist(getToken(), videoIds);
Response<Map<String, List<PlaylistExist>>> response = videoExistsInPlaylist.execute();
if (response.isSuccessful() && response.body() != null) {
apiResponse.setVideoExistPlaylist(response.body());
} else {
setError(apiResponse, response.code(), response.errorBody());
}
@ -403,6 +401,7 @@ public class RetrofitPeertubeAPI {
return apiResponse;
}
/**
* Check if users via their uris are following the authenticated user
*
@ -412,9 +411,9 @@ public class RetrofitPeertubeAPI {
public APIResponse areFollowing(List<String> uris) {
APIResponse apiResponse = new APIResponse();
PeertubeService peertubeService = init();
Call<List<Map<String, Boolean>>> followingCall = peertubeService.getSubscriptionsExist(getToken(), uris);
Call<Map<String, Boolean>> followingCall = peertubeService.getSubscriptionsExist(getToken(), uris);
try {
Response<List<Map<String, Boolean>>> response = followingCall.execute();
Response<Map<String, Boolean>> response = followingCall.execute();
if (response.isSuccessful()) {
apiResponse.setRelationships(response.body());
} else {
@ -1075,30 +1074,6 @@ public class RetrofitPeertubeAPI {
}
/**
* Retrieves playlists for a video *synchronously*
*
* @param videoIds List<String> ids of videos
* @return APIResponse
*/
public APIResponse getVideosExist(String videoIds) {
PeertubeService peertubeService = init();
APIResponse apiResponse = new APIResponse();
try {
Call<Map<String, List<PlaylistExist>>> videoExistsInPlaylist = peertubeService.getVideoExistsInPlaylist(getToken(), videoIds);
Response<Map<String, List<PlaylistExist>>> response = videoExistsInPlaylist.execute();
if (response.isSuccessful() && response.body() != null) {
apiResponse.setVideoExistPlaylist(response.body());
} else {
setError(apiResponse, response.code(), response.errorBody());
}
} catch (IOException e) {
e.printStackTrace();
}
return apiResponse;
}
/**
* Retrieves playlist *synchronously*
*

View File

@ -19,8 +19,6 @@ import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
@ -36,7 +34,9 @@ import androidx.lifecycle.ViewModelProvider;
import androidx.lifecycle.ViewModelStoreOwner;
import androidx.recyclerview.widget.RecyclerView;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import app.fedilab.fedilabtube.PeertubeActivity;
import app.fedilab.fedilabtube.PeertubeEditUploadActivity;
@ -46,6 +46,7 @@ import app.fedilab.fedilabtube.client.APIResponse;
import app.fedilab.fedilabtube.client.RetrofitPeertubeAPI;
import app.fedilab.fedilabtube.client.data.PlaylistData;
import app.fedilab.fedilabtube.client.data.VideoData;
import app.fedilab.fedilabtube.client.entities.PlaylistExist;
import app.fedilab.fedilabtube.client.entities.Report;
import app.fedilab.fedilabtube.helper.Helper;
import app.fedilab.fedilabtube.viewmodel.PlaylistsVM;
@ -60,10 +61,12 @@ import static app.fedilab.fedilabtube.viewmodel.TimelineVM.TimelineType.VIDEOS_I
public class PeertubeAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
public AllVideoRemoved allVideoRemoved;
public RelationShipListener relationShipListener;
public PlaylistListener playlistListener;
public OwnerPlaylistsListener ownerPlaylistsListener;
private List<VideoData.Video> videos;
private Context context;
private TimelineVM.TimelineType timelineType;
private PlaylistData.Playlist playlist;
public PeertubeAdapter(List<VideoData.Video> videos, TimelineVM.TimelineType timelineType) {
this.videos = videos;
@ -72,7 +75,6 @@ public class PeertubeAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolde
public PeertubeAdapter(List<VideoData.Video> videos, PlaylistData.Playlist playlist) {
this.videos = videos;
this.playlist = playlist;
this.timelineType = VIDEOS_IN_PLAYLIST;
}
@ -152,28 +154,68 @@ public class PeertubeAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolde
.inflate(R.menu.video_drawer_menu, popup.getMenu());
if (timelineType == MY_VIDEOS) {
popup.getMenu().findItem(R.id.action_report).setVisible(false);
popup.getMenu().findItem(R.id.action_follow).setVisible(false);
if (playlistListener == null || playlistListener.getPlaylist() == null || playlistListener.getPlaylist().size() == 0) {
popup.getMenu().findItem(R.id.action_playlist).setVisible(false);
} else {
popup.getMenu().findItem(R.id.action_playlist).setVisible(true);
}
} else {
popup.getMenu().findItem(R.id.action_edit).setVisible(false);
if (timelineType != VIDEOS_IN_PLAYLIST) {
popup.getMenu().findItem(R.id.action_remove_playlist).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 (playlistListener == null || playlistListener.getPlaylist() == null || playlistListener.getPlaylist().size() == 0) {
popup.getMenu().findItem(R.id.action_playlist).setVisible(false);
} else {
popup.getMenu().findItem(R.id.action_playlist).setVisible(true);
}
}
popup.setOnMenuItemClickListener(item -> {
switch (item.getItemId()) {
case R.id.action_remove_playlist:
new Thread(() -> {
PlaylistsVM playlistsViewModel = new ViewModelProvider((ViewModelStoreOwner) context).get(PlaylistsVM.class);
playlistsViewModel.manage(PlaylistsVM.action.DELETE_VIDEOS, playlist, video.getIdInPlaylist());
Handler mainHandler = new Handler(Looper.getMainLooper());
Runnable myRunnable = () -> {
videos.remove(video);
notifyDataSetChanged();
if (videos.size() == 0) {
allVideoRemoved.onAllVideoRemoved();
case R.id.action_playlist:
androidx.appcompat.app.AlertDialog.Builder builder = new androidx.appcompat.app.AlertDialog.Builder(context);
builder.setTitle(R.string.modify_playlists);
List<PlaylistData.Playlist> ownerPlaylists = ownerPlaylistsListener.getOwnerPlaylists();
String[] label = new String[ownerPlaylists.size()];
boolean[] checked = new boolean[ownerPlaylists.size()];
int i = 0;
List<PlaylistExist> playlistsForVideo = playlistListener.getPlaylist().get(video.getId());
if (playlistsForVideo != null) {
for (PlaylistData.Playlist playlist : ownerPlaylists) {
for (PlaylistExist playlistExist : playlistsForVideo) {
if (playlistExist != null && playlistExist.getPlaylistId().compareTo(playlist.getId()) == 0) {
checked[i] = true;
break;
}
}
};
mainHandler.post(myRunnable);
}).start();
label[i] = playlist.getDisplayName();
i++;
}
}
builder.setMultiChoiceItems(label, checked, (dialog, which, isChecked) -> new Thread(() -> {
PlaylistsVM playlistsViewModel = new ViewModelProvider((ViewModelStoreOwner) context).get(PlaylistsVM.class);
if (isChecked) { //Add to playlist
playlistsViewModel.manage(PlaylistsVM.action.ADD_VIDEOS, ownerPlaylistsListener.getOwnerPlaylists().get(which), video.getUuid()).observe((LifecycleOwner) context, apiResponse3 -> addElement(ownerPlaylistsListener.getOwnerPlaylists().get(which).getId(), video.getId(), apiResponse3));
} else { //Remove from playlist
playlistsViewModel.manage(PlaylistsVM.action.DELETE_VIDEOS, ownerPlaylistsListener.getOwnerPlaylists().get(which), video.getIdInPlaylist());
playlistListener.getPlaylist().remove(video.getId());
}
}).start());
builder.setPositiveButton(R.string.close, (dialog, which) -> {
dialog.dismiss();
});
androidx.appcompat.app.AlertDialog dialog = builder.create();
dialog.show();
break;
case R.id.action_edit:
Intent intent = new Intent(context, PeertubeEditUploadActivity.class);
@ -188,8 +230,8 @@ public class PeertubeAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolde
View dialogView = inflater1.inflate(R.layout.popup_report, new LinearLayout(context), false);
dialogBuilder.setView(dialogView);
EditText report_content = dialogView.findViewById(R.id.report_content);
dialogBuilder.setNeutralButton(R.string.cancel, (dialog, id) -> dialog.dismiss());
dialogBuilder.setPositiveButton(R.string.report, (dialog, id) -> {
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 {
@ -200,7 +242,7 @@ public class PeertubeAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolde
report.setVideo(videoReport);
report.setReason(report_content.getText().toString());
viewModel.report(report).observe((LifecycleOwner) context, apiResponse -> manageVIewPostActions(RetrofitPeertubeAPI.ActionType.REPORT_VIDEO, apiResponse));
dialog.dismiss();
dialog2.dismiss();
}
});
androidx.appcompat.app.AlertDialog alertDialog2 = dialogBuilder.create();
@ -230,6 +272,20 @@ public class PeertubeAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolde
}
public void addElement(String playlistId, String videoId, APIResponse apiResponse) {
if (apiResponse != null && apiResponse.getActionReturn() != null) {
PlaylistExist playlistExist = new PlaylistExist();
playlistExist.setPlaylistId(playlistId);
List<PlaylistExist> playlistExistList = playlistListener.getPlaylist().get(videoId);
if (playlistExistList == null) {
playlistExistList = new ArrayList<>();
}
playlistExistList.add(playlistExist);
playlistListener.getPlaylist().put(videoId, playlistExistList);
}
}
@Override
public long getItemId(int position) {
return position;
@ -246,6 +302,18 @@ public class PeertubeAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolde
}
}
public interface RelationShipListener {
Map<String, Boolean> getRelationShip();
}
public interface PlaylistListener {
Map<String, List<PlaylistExist>> getPlaylist();
}
public interface OwnerPlaylistsListener {
List<PlaylistData.Playlist> getOwnerPlaylists();
}
public interface AllVideoRemoved {
void onAllVideoRemoved();

View File

@ -171,6 +171,8 @@ public class DisplayChannelsFragment extends Fragment implements ChannelListAdap
if (swiped) {
channelListAdapter = new ChannelListAdapter(this.channels);
channelListAdapter.allChannelRemoved = DisplayChannelsFragment.this;
channelListAdapter.editAlertDialog = DisplayChannelsFragment.this;
lv_channels.setAdapter(channelListAdapter);
swiped = false;
}

View File

@ -40,23 +40,29 @@ import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
import org.jetbrains.annotations.NotNull;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import app.fedilab.fedilabtube.R;
import app.fedilab.fedilabtube.client.APIResponse;
import app.fedilab.fedilabtube.client.RetrofitPeertubeAPI;
import app.fedilab.fedilabtube.client.data.AccountData.Account;
import app.fedilab.fedilabtube.client.data.PlaylistData;
import app.fedilab.fedilabtube.client.data.VideoData;
import app.fedilab.fedilabtube.client.entities.PlaylistExist;
import app.fedilab.fedilabtube.drawer.AccountsHorizontalListAdapter;
import app.fedilab.fedilabtube.drawer.PeertubeAdapter;
import app.fedilab.fedilabtube.helper.Helper;
import app.fedilab.fedilabtube.viewmodel.AccountsVM;
import app.fedilab.fedilabtube.viewmodel.PlaylistsVM;
import app.fedilab.fedilabtube.viewmodel.RelationshipVM;
import app.fedilab.fedilabtube.viewmodel.SearchVM;
import app.fedilab.fedilabtube.viewmodel.TimelineVM;
import es.dmoral.toasty.Toasty;
public class DisplayVideosFragment extends Fragment implements AccountsHorizontalListAdapter.EventListener, PeertubeAdapter.AllVideoRemoved {
public class DisplayVideosFragment extends Fragment implements AccountsHorizontalListAdapter.EventListener, PeertubeAdapter.AllVideoRemoved, PeertubeAdapter.RelationShipListener, PeertubeAdapter.PlaylistListener, PeertubeAdapter.OwnerPlaylistsListener {
private LinearLayoutManager mLayoutManager;
@ -84,6 +90,9 @@ public class DisplayVideosFragment extends Fragment implements AccountsHorizonta
private SearchVM viewModelSearch;
private AccountsVM viewModelAccounts;
private String channelId;
private Map<String, Boolean> relationship;
private Map<String, List<PlaylistExist>> playlists;
private List<PlaylistData.Playlist> ownerPlaylists;
public DisplayVideosFragment() {
}
@ -104,7 +113,6 @@ public class DisplayVideosFragment extends Fragment implements AccountsHorizonta
type = (TimelineVM.TimelineType) bundle.get("timelineType");
}
max_id = "0";
if (getArguments() != null && type == null) {
type = DisplayVideosFragmentArgs.fromBundle(getArguments()).getType();
}
@ -132,6 +140,10 @@ public class DisplayVideosFragment extends Fragment implements AccountsHorizonta
nextElementLoader.setVisibility(View.GONE);
peertubeAdapater = new PeertubeAdapter(this.peertubes, type);
peertubeAdapater.allVideoRemoved = this;
peertubeAdapater.playlistListener = this;
peertubeAdapater.relationShipListener = this;
peertubeAdapater.ownerPlaylistsListener = this;
lv_status.setAdapter(peertubeAdapater);
accountsHorizontalListAdapter = new AccountsHorizontalListAdapter(this.accounts, this);
@ -223,6 +235,10 @@ public class DisplayVideosFragment extends Fragment implements AccountsHorizonta
AccountsVM viewModel = new ViewModelProvider(this).get(AccountsVM.class);
viewModel.getAccounts(RetrofitPeertubeAPI.DataType.SUBSCRIBER, max_id).observe(DisplayVideosFragment.this.requireActivity(), this::manageViewAccounts);
}
if (Helper.isLoggedIn(context)) {
PlaylistsVM viewModel = new ViewModelProvider(this).get(PlaylistsVM.class);
viewModel.manage(PlaylistsVM.action.GET_PLAYLISTS, null, null).observe(DisplayVideosFragment.this.requireActivity(), apiResponse -> manageVIewPlaylists(PlaylistsVM.action.GET_PLAYLISTS, apiResponse));
}
loadTimeline(max_id);
display_all.setOnClickListener(v -> {
forAccount = null;
@ -231,6 +247,22 @@ public class DisplayVideosFragment extends Fragment implements AccountsHorizonta
return rootView;
}
public void manageVIewPlaylists(PlaylistsVM.action actionType, APIResponse apiResponse) {
if (apiResponse.getError() != null) {
return;
}
if (actionType == PlaylistsVM.action.GET_PLAYLISTS) {
if (apiResponse.getPlaylists() != null && apiResponse.getPlaylists().size() > 0) {
if (this.ownerPlaylists == null) {
this.ownerPlaylists = new ArrayList<>();
}
this.ownerPlaylists.addAll(apiResponse.getPlaylists());
}
}
}
@Override
public void onPause() {
super.onPause();
@ -318,6 +350,10 @@ public class DisplayVideosFragment extends Fragment implements AccountsHorizonta
//If no item were inserted previously the adapter is created
if (previousPosition == 0) {
peertubeAdapater = new PeertubeAdapter(this.peertubes, type);
peertubeAdapater.allVideoRemoved = DisplayVideosFragment.this;
peertubeAdapater.playlistListener = DisplayVideosFragment.this;
peertubeAdapater.relationShipListener = DisplayVideosFragment.this;
peertubeAdapater.ownerPlaylistsListener = DisplayVideosFragment.this;
lv_status.setAdapter(peertubeAdapater);
} else
peertubeAdapater.notifyItemRangeInserted(previousPosition, apiResponse.getPeertubes().size());
@ -330,8 +366,48 @@ public class DisplayVideosFragment extends Fragment implements AccountsHorizonta
}
flag_loading = false;
firstLoad = false;
if (Helper.isLoggedIn(context)) {
List<String> uids = new ArrayList<>();
for (VideoData.Video video : apiResponse.getPeertubes()) {
uids.add(video.getChannel().getName() + "@" + video.getChannel().getHost());
}
if (uids.size() > 0) {
RelationshipVM viewModel = new ViewModelProvider(this).get(RelationshipVM.class);
viewModel.get(uids).observe(DisplayVideosFragment.this.requireActivity(), this::manageVIewRelationship);
}
List<String> videoIds = new ArrayList<>();
for (VideoData.Video video : apiResponse.getPeertubes()) {
videoIds.add(video.getId());
}
if (videoIds.size() > 0) {
PlaylistsVM viewModel = new ViewModelProvider(this).get(PlaylistsVM.class);
viewModel.videoExists(videoIds).observe(DisplayVideosFragment.this.requireActivity(), this::manageVIewPlaylist);
}
}
}
public void manageVIewPlaylist(APIResponse apiResponse) {
if (apiResponse.getError() != null) {
return;
}
if (playlists == null) {
playlists = new HashMap<>();
}
playlists.putAll(apiResponse.getVideoExistPlaylist());
}
public void manageVIewRelationship(APIResponse apiResponse) {
if (apiResponse.getError() != null) {
return;
}
if (relationship == null) {
relationship = new HashMap<>();
}
relationship.putAll(apiResponse.getRelationships());
}
@Override
public void onDestroyView() {
@ -404,6 +480,21 @@ public class DisplayVideosFragment extends Fragment implements AccountsHorizonta
textviewNoAction.setVisibility(View.VISIBLE);
}
@Override
public Map<String, Boolean> getRelationShip() {
return relationship;
}
@Override
public Map<String, List<PlaylistExist>> getPlaylist() {
return playlists;
}
@Override
public List<PlaylistData.Playlist> getOwnerPlaylists() {
return ownerPlaylists;
}
static class GridSpacingItemDecoration extends RecyclerView.ItemDecoration {
private int spanCount;

View File

@ -27,6 +27,7 @@ import androidx.lifecycle.LiveData;
import androidx.lifecycle.MutableLiveData;
import java.util.ArrayList;
import java.util.List;
import app.fedilab.fedilabtube.client.APIResponse;
import app.fedilab.fedilabtube.client.RetrofitPeertubeAPI;
@ -50,13 +51,13 @@ public class PlaylistsVM extends AndroidViewModel {
return apiResponseMutableLiveData;
}
public LiveData<APIResponse> videoExists(String videoIds) {
public LiveData<APIResponse> videoExists(List<String> videoIds) {
apiResponseMutableLiveData = new MutableLiveData<>();
checkVideosExist(videoIds);
return apiResponseMutableLiveData;
}
private void checkVideosExist(String videoIds) {
private void checkVideosExist(List<String> videoIds) {
Context _mContext = getApplication().getApplicationContext();
new Thread(() -> {
APIResponse apiResponse = new RetrofitPeertubeAPI(_mContext).getVideosExist(videoIds);

View File

@ -49,11 +49,7 @@ public class RelationshipVM extends AndroidViewModel {
try {
RetrofitPeertubeAPI api = new RetrofitPeertubeAPI(_mContext);
APIResponse apiResponse;
if (uris.size() == 1) {
apiResponse = api.isFollowing(uris.get(0));
} else {
apiResponse = api.areFollowing(uris);
}
apiResponse = api.areFollowing(uris);
Handler mainHandler = new Handler(Looper.getMainLooper());
Runnable myRunnable = () -> apiResponseMutableLiveData.setValue(apiResponse);
mainHandler.post(myRunnable);

View File

@ -1,10 +1,10 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:tint="?attr/colorControlNormal"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="@android:color/white"
android:pathData="M15,12c2.21,0 4,-1.79 4,-4s-1.79,-4 -4,-4 -4,1.79 -4,4 1.79,4 4,4zM6,10L6,7L4,7v3L1,10v2h3v3h2v-3h3v-2L6,10zM15,14c-2.67,0 -8,1.34 -8,4v2h16v-2c0,-2.66 -5.33,-4 -8,-4z" />
android:viewportHeight="24"
android:tint="?attr/colorControlNormal">
<path
android:fillColor="@android:color/white"
android:pathData="M15,12c2.21,0 4,-1.79 4,-4s-1.79,-4 -4,-4 -4,1.79 -4,4 1.79,4 4,4zM6,10L6,7L4,7v3L1,10v2h3v3h2v-3h3v-2L6,10zM15,14c-2.67,0 -8,1.34 -8,4v2h16v-2c0,-2.66 -5.33,-4 -8,-4z"/>
</vector>

View File

@ -7,9 +7,14 @@
android:title="@string/report"
app:showAsAction="never" />
<item
android:id="@+id/action_remove_playlist"
android:id="@+id/action_playlist"
android:icon="@drawable/ic_baseline_playlist_play_24"
android:title="@string/remove_from_playlist"
android:title="@string/playlists"
app:showAsAction="never" />
<item
android:id="@+id/action_follow"
android:icon="@drawable/ic_baseline_person_add_24"
android:title="@string/action_follow"
app:showAsAction="never" />
<item
android:id="@+id/action_edit"