build: change of package name

This commit is contained in:
antonio 2023-06-17 15:30:23 +02:00
parent 49afdbe4eb
commit b76a38cb30
274 changed files with 1981 additions and 2161 deletions

View file

@ -0,0 +1,95 @@
package com.cappielloantonio.tempo.ui.adapter;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.cappielloantonio.tempo.databinding.ItemLibraryAlbumBinding;
import com.cappielloantonio.tempo.glide.CustomGlideRequest;
import com.cappielloantonio.tempo.interfaces.ClickCallback;
import com.cappielloantonio.tempo.subsonic.models.AlbumID3;
import com.cappielloantonio.tempo.util.Constants;
import com.cappielloantonio.tempo.util.MusicUtil;
import java.util.Collections;
import java.util.List;
public class AlbumAdapter extends RecyclerView.Adapter<AlbumAdapter.ViewHolder> {
private final ClickCallback click;
private List<AlbumID3> albums;
public AlbumAdapter(ClickCallback click) {
this.click = click;
this.albums = Collections.emptyList();
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
ItemLibraryAlbumBinding view = ItemLibraryAlbumBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
AlbumID3 album = albums.get(position);
holder.item.albumNameLabel.setText(MusicUtil.getReadableString(album.getName()));
holder.item.artistNameLabel.setText(MusicUtil.getReadableString(album.getArtist()));
CustomGlideRequest.Builder
.from(holder.itemView.getContext(), album.getCoverArtId())
.build()
.into(holder.item.albumCoverImageView);
}
@Override
public int getItemCount() {
return albums.size();
}
public AlbumID3 getItem(int position) {
return albums.get(position);
}
public void setItems(List<AlbumID3> albums) {
this.albums = albums;
notifyDataSetChanged();
}
public class ViewHolder extends RecyclerView.ViewHolder {
ItemLibraryAlbumBinding item;
ViewHolder(ItemLibraryAlbumBinding item) {
super(item.getRoot());
this.item = item;
item.albumNameLabel.setSelected(true);
item.artistNameLabel.setSelected(true);
itemView.setOnClickListener(v -> onClick());
itemView.setOnLongClickListener(v -> onLongClick());
}
private void onClick() {
Bundle bundle = new Bundle();
bundle.putParcelable(Constants.ALBUM_OBJECT, albums.get(getBindingAdapterPosition()));
click.onAlbumClick(bundle);
}
private boolean onLongClick() {
Bundle bundle = new Bundle();
bundle.putParcelable(Constants.ALBUM_OBJECT, albums.get(getBindingAdapterPosition()));
click.onAlbumLongClick(bundle);
return true;
}
}
}

View file

@ -0,0 +1,95 @@
package com.cappielloantonio.tempo.ui.adapter;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.cappielloantonio.tempo.databinding.ItemLibraryArtistPageOrSimilarAlbumBinding;
import com.cappielloantonio.tempo.glide.CustomGlideRequest;
import com.cappielloantonio.tempo.interfaces.ClickCallback;
import com.cappielloantonio.tempo.subsonic.models.AlbumID3;
import com.cappielloantonio.tempo.util.Constants;
import com.cappielloantonio.tempo.util.MusicUtil;
import java.util.Collections;
import java.util.List;
public class AlbumArtistPageOrSimilarAdapter extends RecyclerView.Adapter<AlbumArtistPageOrSimilarAdapter.ViewHolder> {
private final ClickCallback click;
private List<AlbumID3> albums;
public AlbumArtistPageOrSimilarAdapter(ClickCallback click) {
this.click = click;
this.albums = Collections.emptyList();
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
ItemLibraryArtistPageOrSimilarAlbumBinding view = ItemLibraryArtistPageOrSimilarAlbumBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
AlbumID3 album = albums.get(position);
holder.item.albumNameLabel.setText(MusicUtil.getReadableString(album.getName()));
holder.item.artistNameLabel.setText(MusicUtil.getReadableString(album.getArtist()));
CustomGlideRequest.Builder
.from(holder.itemView.getContext(), album.getCoverArtId())
.build()
.into(holder.item.artistPageAlbumCoverImageView);
}
@Override
public int getItemCount() {
return albums.size();
}
public AlbumID3 getItem(int position) {
return albums.get(position);
}
public void setItems(List<AlbumID3> albums) {
this.albums = albums;
notifyDataSetChanged();
}
public class ViewHolder extends RecyclerView.ViewHolder {
ItemLibraryArtistPageOrSimilarAlbumBinding item;
ViewHolder(ItemLibraryArtistPageOrSimilarAlbumBinding item) {
super(item.getRoot());
this.item = item;
item.albumNameLabel.setSelected(true);
item.artistNameLabel.setSelected(true);
itemView.setOnClickListener(v -> onClick());
itemView.setOnLongClickListener(v -> onLongClick());
}
private void onClick() {
Bundle bundle = new Bundle();
bundle.putParcelable(Constants.ALBUM_OBJECT, albums.get(getBindingAdapterPosition()));
click.onAlbumClick(bundle);
}
private boolean onLongClick() {
Bundle bundle = new Bundle();
bundle.putParcelable(Constants.ALBUM_OBJECT, albums.get(getBindingAdapterPosition()));
click.onAlbumLongClick(bundle);
return true;
}
}
}

View file

@ -0,0 +1,165 @@
package com.cappielloantonio.tempo.ui.adapter;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.ViewGroup;
import android.widget.Filter;
import android.widget.Filterable;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.cappielloantonio.tempo.databinding.ItemLibraryCatalogueAlbumBinding;
import com.cappielloantonio.tempo.glide.CustomGlideRequest;
import com.cappielloantonio.tempo.interfaces.ClickCallback;
import com.cappielloantonio.tempo.subsonic.models.AlbumID3;
import com.cappielloantonio.tempo.util.Constants;
import com.cappielloantonio.tempo.util.MusicUtil;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class AlbumCatalogueAdapter extends RecyclerView.Adapter<AlbumCatalogueAdapter.ViewHolder> implements Filterable {
private final ClickCallback click;
private final Filter filtering = new Filter() {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
List<AlbumID3> filteredList = new ArrayList<>();
if (constraint == null || constraint.length() == 0) {
filteredList.addAll(albumsFull);
} else {
String filterPattern = constraint.toString().toLowerCase().trim();
for (AlbumID3 item : albumsFull) {
if (item.getName().toLowerCase().contains(filterPattern)) {
filteredList.add(item);
}
}
}
FilterResults results = new FilterResults();
results.values = filteredList;
return results;
}
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
albums.clear();
albums.addAll((List) results.values);
notifyDataSetChanged();
}
};
private List<AlbumID3> albums;
private List<AlbumID3> albumsFull;
public AlbumCatalogueAdapter(ClickCallback click) {
this.click = click;
this.albums = Collections.emptyList();
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
ItemLibraryCatalogueAlbumBinding view = ItemLibraryCatalogueAlbumBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
AlbumID3 album = albums.get(position);
holder.item.albumNameLabel.setText(MusicUtil.getReadableString(album.getName()));
holder.item.artistNameLabel.setText(MusicUtil.getReadableString(album.getArtist()));
CustomGlideRequest.Builder
.from(holder.itemView.getContext(), album.getCoverArtId())
.build()
.into(holder.item.albumCatalogueCoverImageView);
}
@Override
public int getItemCount() {
return albums.size();
}
public AlbumID3 getItem(int position) {
return albums.get(position);
}
public void setItems(List<AlbumID3> albums) {
this.albums = albums;
this.albumsFull = new ArrayList<>(albums);
notifyDataSetChanged();
}
@Override
public int getItemViewType(int position) {
return position;
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public Filter getFilter() {
return filtering;
}
public class ViewHolder extends RecyclerView.ViewHolder {
ItemLibraryCatalogueAlbumBinding item;
ViewHolder(ItemLibraryCatalogueAlbumBinding item) {
super(item.getRoot());
this.item = item;
item.albumNameLabel.setSelected(true);
item.artistNameLabel.setSelected(true);
itemView.setOnClickListener(v -> onClick());
itemView.setOnLongClickListener(v -> onLongClick());
}
private void onClick() {
Bundle bundle = new Bundle();
bundle.putParcelable(Constants.ALBUM_OBJECT, albums.get(getBindingAdapterPosition()));
click.onAlbumClick(bundle);
}
private boolean onLongClick() {
Bundle bundle = new Bundle();
bundle.putParcelable(Constants.ALBUM_OBJECT, albums.get(getBindingAdapterPosition()));
click.onAlbumLongClick(bundle);
return true;
}
}
public void sort(String order) {
switch (order) {
case Constants.ALBUM_ORDER_BY_NAME:
albums.sort(Comparator.comparing(AlbumID3::getName));
break;
case Constants.ALBUM_ORDER_BY_ARTIST:
albums.sort(Comparator.comparing(AlbumID3::getArtist));
break;
case Constants.ALBUM_ORDER_BY_YEAR:
albums.sort(Comparator.comparing(AlbumID3::getYear));
break;
case Constants.ALBUM_ORDER_BY_RANDOM:
Collections.shuffle(albums);
break;
}
notifyDataSetChanged();
}
}

View file

@ -0,0 +1,98 @@
package com.cappielloantonio.tempo.ui.adapter;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.cappielloantonio.tempo.databinding.ItemHorizontalAlbumBinding;
import com.cappielloantonio.tempo.glide.CustomGlideRequest;
import com.cappielloantonio.tempo.interfaces.ClickCallback;
import com.cappielloantonio.tempo.subsonic.models.AlbumID3;
import com.cappielloantonio.tempo.util.Constants;
import com.cappielloantonio.tempo.util.MusicUtil;
import java.util.Collections;
import java.util.List;
public class AlbumHorizontalAdapter extends RecyclerView.Adapter<AlbumHorizontalAdapter.ViewHolder> {
private final ClickCallback click;
private final boolean isOffline;
private List<AlbumID3> albums;
public AlbumHorizontalAdapter(ClickCallback click, boolean isOffline) {
this.click = click;
this.isOffline = isOffline;
this.albums = Collections.emptyList();
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
ItemHorizontalAlbumBinding view = ItemHorizontalAlbumBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
AlbumID3 album = albums.get(position);
holder.item.albumTitleTextView.setText(MusicUtil.getReadableString(album.getName()));
holder.item.albumArtistTextView.setText(MusicUtil.getReadableString(album.getArtist()));
CustomGlideRequest.Builder
.from(holder.itemView.getContext(), album.getCoverArtId())
.build()
.into(holder.item.albumCoverImageView);
}
@Override
public int getItemCount() {
return albums.size();
}
public void setItems(List<AlbumID3> albums) {
this.albums = albums;
notifyDataSetChanged();
}
public AlbumID3 getItem(int id) {
return albums.get(id);
}
public class ViewHolder extends RecyclerView.ViewHolder {
ItemHorizontalAlbumBinding item;
ViewHolder(ItemHorizontalAlbumBinding item) {
super(item.getRoot());
this.item = item;
item.albumTitleTextView.setSelected(true);
itemView.setOnClickListener(v -> onClick());
itemView.setOnLongClickListener(v -> onLongClick());
item.albumMoreButton.setOnClickListener(v -> onLongClick());
}
private void onClick() {
Bundle bundle = new Bundle();
bundle.putParcelable(Constants.ALBUM_OBJECT, albums.get(getBindingAdapterPosition()));
click.onAlbumClick(bundle);
}
private boolean onLongClick() {
Bundle bundle = new Bundle();
bundle.putParcelable(Constants.ALBUM_OBJECT, albums.get(getBindingAdapterPosition()));
click.onAlbumLongClick(bundle);
return true;
}
}
}

View file

@ -0,0 +1,111 @@
package com.cappielloantonio.tempo.ui.adapter;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.media3.common.util.UnstableApi;
import androidx.recyclerview.widget.RecyclerView;
import com.cappielloantonio.tempo.databinding.ItemLibraryArtistBinding;
import com.cappielloantonio.tempo.glide.CustomGlideRequest;
import com.cappielloantonio.tempo.interfaces.ClickCallback;
import com.cappielloantonio.tempo.subsonic.models.ArtistID3;
import com.cappielloantonio.tempo.util.Constants;
import com.cappielloantonio.tempo.util.MusicUtil;
import java.util.Collections;
import java.util.List;
@UnstableApi
public class ArtistAdapter extends RecyclerView.Adapter<ArtistAdapter.ViewHolder> {
private final ClickCallback click;
private final boolean mix;
private final boolean bestOf;
private List<ArtistID3> artists;
public ArtistAdapter(ClickCallback click, Boolean mix, Boolean bestOf) {
this.click = click;
this.mix = mix;
this.bestOf = bestOf;
this.artists = Collections.emptyList();
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
ItemLibraryArtistBinding view = ItemLibraryArtistBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
ArtistID3 artist = artists.get(position);
holder.item.artistNameLabel.setText(MusicUtil.getReadableString(artist.getName()));
CustomGlideRequest.Builder
.from(holder.itemView.getContext(), artist.getCoverArtId())
.build()
.into(holder.item.artistCoverImageView);
}
@Override
public int getItemCount() {
return artists.size();
}
public ArtistID3 getItem(int position) {
return artists.get(position);
}
public void setItems(List<ArtistID3> artists) {
this.artists = artists;
notifyDataSetChanged();
}
@Override
public int getItemViewType(int position) {
return position;
}
@Override
public long getItemId(int position) {
return position;
}
public class ViewHolder extends RecyclerView.ViewHolder {
ItemLibraryArtistBinding item;
ViewHolder(ItemLibraryArtistBinding item) {
super(item.getRoot());
this.item = item;
item.artistNameLabel.setSelected(true);
itemView.setOnClickListener(v -> onClick());
itemView.setOnLongClickListener(v -> onLongClick());
}
public void onClick() {
Bundle bundle = new Bundle();
bundle.putParcelable(Constants.ARTIST_OBJECT, artists.get(getBindingAdapterPosition()));
bundle.putBoolean(Constants.MEDIA_MIX, mix);
bundle.putBoolean(Constants.MEDIA_BEST_OF, bestOf);
click.onArtistClick(bundle);
}
public boolean onLongClick() {
Bundle bundle = new Bundle();
bundle.putParcelable(Constants.ARTIST_OBJECT, artists.get(getBindingAdapterPosition()));
click.onArtistLongClick(bundle);
return true;
}
}
}

View file

@ -0,0 +1,158 @@
package com.cappielloantonio.tempo.ui.adapter;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.ViewGroup;
import android.widget.Filter;
import android.widget.Filterable;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.cappielloantonio.tempo.databinding.ItemLibraryCatalogueArtistBinding;
import com.cappielloantonio.tempo.glide.CustomGlideRequest;
import com.cappielloantonio.tempo.interfaces.ClickCallback;
import com.cappielloantonio.tempo.subsonic.models.ArtistID3;
import com.cappielloantonio.tempo.util.Constants;
import com.cappielloantonio.tempo.util.MusicUtil;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class ArtistCatalogueAdapter extends RecyclerView.Adapter<ArtistCatalogueAdapter.ViewHolder> implements Filterable {
private final ClickCallback click;
private final Filter filtering = new Filter() {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
List<ArtistID3> filteredList = new ArrayList<>();
if (constraint == null || constraint.length() == 0) {
filteredList.addAll(artistFull);
} else {
String filterPattern = constraint.toString().toLowerCase().trim();
for (ArtistID3 item : artistFull) {
if (item.getName().toLowerCase().contains(filterPattern)) {
filteredList.add(item);
}
}
}
FilterResults results = new FilterResults();
results.values = filteredList;
return results;
}
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
artists.clear();
artists.addAll((List) results.values);
notifyDataSetChanged();
}
};
private List<ArtistID3> artists;
private List<ArtistID3> artistFull;
public ArtistCatalogueAdapter(ClickCallback click) {
this.click = click;
this.artists = Collections.emptyList();
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
ItemLibraryCatalogueArtistBinding view = ItemLibraryCatalogueArtistBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
ArtistID3 artist = artists.get(position);
holder.item.artistNameLabel.setText(MusicUtil.getReadableString(artist.getName()));
CustomGlideRequest.Builder
.from(holder.itemView.getContext(), artist.getCoverArtId())
.build()
.into(holder.item.artistCatalogueCoverImageView);
}
@Override
public int getItemCount() {
return artists.size();
}
public ArtistID3 getItem(int position) {
return artists.get(position);
}
public void setItems(List<ArtistID3> artists) {
this.artists = artists;
this.artistFull = new ArrayList<>(artists);
notifyDataSetChanged();
}
@Override
public int getItemViewType(int position) {
return position;
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public Filter getFilter() {
return filtering;
}
public class ViewHolder extends RecyclerView.ViewHolder {
ItemLibraryCatalogueArtistBinding item;
ViewHolder(ItemLibraryCatalogueArtistBinding item) {
super(item.getRoot());
this.item = item;
item.artistNameLabel.setSelected(true);
itemView.setOnClickListener(v -> onClick());
itemView.setOnLongClickListener(v -> onLongClick());
}
public void onClick() {
Bundle bundle = new Bundle();
bundle.putParcelable(Constants.ARTIST_OBJECT, artists.get(getBindingAdapterPosition()));
click.onArtistClick(bundle);
}
public boolean onLongClick() {
Bundle bundle = new Bundle();
bundle.putParcelable(Constants.ARTIST_OBJECT, artists.get(getBindingAdapterPosition()));
click.onArtistLongClick(bundle);
return true;
}
}
public void sort(String order) {
switch (order) {
case Constants.ARTIST_ORDER_BY_NAME:
artists.sort(Comparator.comparing(ArtistID3::getName));
break;
case Constants.ARTIST_ORDER_BY_RANDOM:
Collections.shuffle(artists);
break;
}
notifyDataSetChanged();
}
}

View file

@ -0,0 +1,112 @@
package com.cappielloantonio.tempo.ui.adapter;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.cappielloantonio.tempo.databinding.ItemHorizontalArtistBinding;
import com.cappielloantonio.tempo.glide.CustomGlideRequest;
import com.cappielloantonio.tempo.interfaces.ClickCallback;
import com.cappielloantonio.tempo.subsonic.models.ArtistID3;
import com.cappielloantonio.tempo.util.Constants;
import com.cappielloantonio.tempo.util.MusicUtil;
import java.util.Collections;
import java.util.List;
public class ArtistHorizontalAdapter extends RecyclerView.Adapter<ArtistHorizontalAdapter.ViewHolder> {
private final ClickCallback click;
private List<ArtistID3> artists;
public ArtistHorizontalAdapter(ClickCallback click) {
this.click = click;
this.artists = Collections.emptyList();
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
ItemHorizontalArtistBinding view = ItemHorizontalArtistBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
ArtistID3 artist = artists.get(position);
holder.item.artistNameTextView.setText(MusicUtil.getReadableString(artist.getName()));
if (artist.getAlbumCount() > 0) {
holder.item.artistInfoTextView.setText("Album count: " + artist.getAlbumCount());
} else {
holder.item.artistInfoTextView.setVisibility(View.GONE);
}
CustomGlideRequest.Builder
.from(holder.itemView.getContext(), artist.getCoverArtId())
.build()
.into(holder.item.artistCoverImageView);
}
@Override
public int getItemCount() {
return artists.size();
}
public void setItems(List<ArtistID3> artists) {
this.artists = artists;
notifyDataSetChanged();
}
public ArtistID3 getItem(int id) {
return artists.get(id);
}
@Override
public int getItemViewType(int position) {
return position;
}
@Override
public long getItemId(int position) {
return position;
}
public class ViewHolder extends RecyclerView.ViewHolder {
ItemHorizontalArtistBinding item;
ViewHolder(ItemHorizontalArtistBinding item) {
super(item.getRoot());
this.item = item;
item.artistNameTextView.setSelected(true);
itemView.setOnClickListener(v -> onClick());
itemView.setOnLongClickListener(v -> onLongClick());
item.artistMoreButton.setOnClickListener(v -> onLongClick());
}
private void onClick() {
Bundle bundle = new Bundle();
bundle.putParcelable(Constants.ARTIST_OBJECT, artists.get(getBindingAdapterPosition()));
click.onArtistClick(bundle);
}
public boolean onLongClick() {
Bundle bundle = new Bundle();
bundle.putParcelable(Constants.ARTIST_OBJECT, artists.get(getBindingAdapterPosition()));
click.onArtistLongClick(bundle);
return true;
}
}
}

View file

@ -0,0 +1,103 @@
package com.cappielloantonio.tempo.ui.adapter;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.cappielloantonio.tempo.databinding.ItemLibrarySimilarArtistBinding;
import com.cappielloantonio.tempo.glide.CustomGlideRequest;
import com.cappielloantonio.tempo.interfaces.ClickCallback;
import com.cappielloantonio.tempo.subsonic.models.SimilarArtistID3;
import com.cappielloantonio.tempo.util.Constants;
import com.cappielloantonio.tempo.util.MusicUtil;
import java.util.Collections;
import java.util.List;
public class ArtistSimilarAdapter extends RecyclerView.Adapter<ArtistSimilarAdapter.ViewHolder> {
private final ClickCallback click;
private List<SimilarArtistID3> artists;
public ArtistSimilarAdapter(ClickCallback click) {
this.click = click;
this.artists = Collections.emptyList();
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
ItemLibrarySimilarArtistBinding view = ItemLibrarySimilarArtistBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
SimilarArtistID3 artist = artists.get(position);
holder.item.artistNameLabel.setText(MusicUtil.getReadableString(artist.getName()));
CustomGlideRequest.Builder
.from(holder.itemView.getContext(), artist.getCoverArtId())
.build()
.into(holder.item.similarArtistCoverImageView);
}
@Override
public int getItemCount() {
return artists.size();
}
public SimilarArtistID3 getItem(int position) {
return artists.get(position);
}
public void setItems(List<SimilarArtistID3> artists) {
this.artists = artists;
notifyDataSetChanged();
}
@Override
public int getItemViewType(int position) {
return position;
}
@Override
public long getItemId(int position) {
return position;
}
public class ViewHolder extends RecyclerView.ViewHolder {
ItemLibrarySimilarArtistBinding item;
ViewHolder(ItemLibrarySimilarArtistBinding item) {
super(item.getRoot());
this.item = item;
itemView.setOnClickListener(v -> onClick());
itemView.setOnLongClickListener(v -> onLongClick());
item.artistNameLabel.setSelected(true);
}
public void onClick() {
Bundle bundle = new Bundle();
bundle.putParcelable(Constants.ARTIST_OBJECT, artists.get(getBindingAdapterPosition()));
click.onArtistClick(bundle);
}
public boolean onLongClick() {
Bundle bundle = new Bundle();
bundle.putParcelable(Constants.ARTIST_OBJECT, artists.get(getBindingAdapterPosition()));
click.onArtistLongClick(bundle);
return true;
}
}
}

View file

@ -0,0 +1,96 @@
package com.cappielloantonio.tempo.ui.adapter;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.ViewGroup;
import android.view.animation.AccelerateDecelerateInterpolator;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.cappielloantonio.tempo.databinding.ItemHomeDiscoverSongBinding;
import com.cappielloantonio.tempo.glide.CustomGlideRequest;
import com.cappielloantonio.tempo.interfaces.ClickCallback;
import com.cappielloantonio.tempo.subsonic.models.Child;
import com.cappielloantonio.tempo.util.Constants;
import com.cappielloantonio.tempo.util.MusicUtil;
import java.util.Collections;
import java.util.List;
public class DiscoverSongAdapter extends RecyclerView.Adapter<DiscoverSongAdapter.ViewHolder> {
private final ClickCallback click;
private List<Child> songs;
public DiscoverSongAdapter(ClickCallback click) {
this.click = click;
this.songs = Collections.emptyList();
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
ItemHomeDiscoverSongBinding view = ItemHomeDiscoverSongBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
Child song = songs.get(position);
holder.item.titleDiscoverSongLabel.setText(MusicUtil.getReadableString(song.getTitle()));
holder.item.albumDiscoverSongLabel.setText(MusicUtil.getReadableString(song.getAlbum()));
CustomGlideRequest.Builder
.from(holder.itemView.getContext(), song.getCoverArtId())
.build()
.into(holder.item.discoverSongCoverImageView);
}
@Override
public void onViewAttachedToWindow(@NonNull ViewHolder holder) {
super.onViewAttachedToWindow(holder);
startAnimation(holder);
}
@Override
public int getItemCount() {
return songs.size();
}
public void setItems(List<Child> songs) {
this.songs = songs;
notifyDataSetChanged();
}
public class ViewHolder extends RecyclerView.ViewHolder {
ItemHomeDiscoverSongBinding item;
ViewHolder(ItemHomeDiscoverSongBinding item) {
super(item.getRoot());
this.item = item;
itemView.setOnClickListener(v -> onClick());
}
public void onClick() {
Bundle bundle = new Bundle();
bundle.putParcelable(Constants.TRACK_OBJECT, songs.get(getBindingAdapterPosition()));
bundle.putBoolean(Constants.MEDIA_MIX, true);
click.onMediaClick(bundle);
}
}
private void startAnimation(ViewHolder holder) {
holder.item.discoverSongCoverImageView.animate()
.setDuration(20000)
.setStartDelay(10)
.setInterpolator(new AccelerateDecelerateInterpolator())
.scaleX(1.4f)
.scaleY(1.4f)
.start();
}
}

View file

@ -0,0 +1,115 @@
package com.cappielloantonio.tempo.ui.adapter;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.media3.common.util.UnstableApi;
import androidx.recyclerview.widget.RecyclerView;
import com.cappielloantonio.tempo.R;
import com.cappielloantonio.tempo.databinding.ItemHorizontalDownloadBinding;
import com.cappielloantonio.tempo.interfaces.ClickCallback;
import com.cappielloantonio.tempo.subsonic.models.Child;
import com.cappielloantonio.tempo.util.Constants;
import com.cappielloantonio.tempo.util.MusicUtil;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Objects;
@UnstableApi
public class DownloadHorizontalAdapter extends RecyclerView.Adapter<DownloadHorizontalAdapter.ViewHolder> {
private final ClickCallback click;
private List<Child> songs;
public DownloadHorizontalAdapter(ClickCallback click) {
this.click = click;
this.songs = Collections.emptyList();
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
ItemHorizontalDownloadBinding view = ItemHorizontalDownloadBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
Child song = songs.get(position);
holder.item.downloadedSongTitleTextView.setText(MusicUtil.getReadableString(song.getTitle()));
holder.item.downloadedSongArtistTextView.setText(holder.itemView.getContext().getString(R.string.song_subtitle_formatter, MusicUtil.getReadableString(song.getArtist()), MusicUtil.getReadableDurationString(song.getDuration(), false)));
holder.item.downloadedSongAlbumTextView.setText(MusicUtil.getReadableString(song.getAlbum()));
if (position > 0 && songs.get(position - 1) != null && !Objects.equals(songs.get(position - 1).getAlbum(), songs.get(position).getAlbum())) {
holder.item.divider.setPadding(0, (int) holder.itemView.getContext().getResources().getDimension(R.dimen.downloaded_item_padding), 0, 0);
} else {
if (position > 0) holder.item.divider.setVisibility(View.GONE);
}
}
@Override
public int getItemCount() {
return songs.size();
}
public void setItems(List<Child> songs) {
this.songs = songs;
notifyDataSetChanged();
}
public Child getItem(int id) {
return songs.get(id);
}
@Override
public int getItemViewType(int position) {
return position;
}
@Override
public long getItemId(int position) {
return position;
}
public class ViewHolder extends RecyclerView.ViewHolder {
ItemHorizontalDownloadBinding item;
ViewHolder(ItemHorizontalDownloadBinding item) {
super(item.getRoot());
this.item = item;
item.downloadedSongTitleTextView.setSelected(true);
item.downloadedSongArtistTextView.setSelected(true);
itemView.setOnClickListener(v -> onClick());
itemView.setOnLongClickListener(v -> onLongClick());
item.downloadedSongMoreButton.setOnClickListener(v -> onLongClick());
}
public void onClick() {
Bundle bundle = new Bundle();
bundle.putParcelableArrayList(Constants.TRACKS_OBJECT, new ArrayList<>(songs));
bundle.putInt(Constants.ITEM_POSITION, getBindingAdapterPosition());
click.onMediaClick(bundle);
}
private boolean onLongClick() {
Bundle bundle = new Bundle();
bundle.putParcelable(Constants.TRACK_OBJECT, songs.get(getBindingAdapterPosition()));
click.onMediaLongClick(bundle);
return true;
}
}
}

View file

@ -0,0 +1,76 @@
package com.cappielloantonio.tempo.ui.adapter;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.cappielloantonio.tempo.databinding.ItemLibraryGenreBinding;
import com.cappielloantonio.tempo.interfaces.ClickCallback;
import com.cappielloantonio.tempo.subsonic.models.Genre;
import com.cappielloantonio.tempo.util.Constants;
import com.cappielloantonio.tempo.util.MusicUtil;
import java.util.Collections;
import java.util.List;
public class GenreAdapter extends RecyclerView.Adapter<GenreAdapter.ViewHolder> {
private final ClickCallback click;
private List<Genre> genres;
public GenreAdapter(ClickCallback click) {
this.click = click;
this.genres = Collections.emptyList();
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
ItemLibraryGenreBinding view = ItemLibraryGenreBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
Genre genre = genres.get(position);
holder.item.genreLabel.setText(MusicUtil.getReadableString(genre.getGenre()));
}
@Override
public int getItemCount() {
return genres.size();
}
public Genre getItem(int position) {
return genres.get(position);
}
public void setItems(List<Genre> genres) {
this.genres = genres;
notifyDataSetChanged();
}
public class ViewHolder extends RecyclerView.ViewHolder {
ItemLibraryGenreBinding item;
ViewHolder(ItemLibraryGenreBinding item) {
super(item.getRoot());
this.item = item;
itemView.setOnClickListener(v -> onClick());
}
private void onClick() {
Bundle bundle = new Bundle();
bundle.putString(Constants.MEDIA_BY_GENRE, Constants.MEDIA_BY_GENRE);
bundle.putParcelable(Constants.GENRE_OBJECT, genres.get(getBindingAdapterPosition()));
click.onGenreClick(bundle);
}
}
}

View file

@ -0,0 +1,129 @@
package com.cappielloantonio.tempo.ui.adapter;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.ViewGroup;
import android.widget.Filter;
import android.widget.Filterable;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.cappielloantonio.tempo.databinding.ItemLibraryCatalogueGenreBinding;
import com.cappielloantonio.tempo.interfaces.ClickCallback;
import com.cappielloantonio.tempo.subsonic.models.Genre;
import com.cappielloantonio.tempo.util.Constants;
import com.cappielloantonio.tempo.util.MusicUtil;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class GenreCatalogueAdapter extends RecyclerView.Adapter<GenreCatalogueAdapter.ViewHolder> implements Filterable {
private final ClickCallback click;
private final Filter filtering = new Filter() {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
List<Genre> filteredList = new ArrayList<>();
if (constraint == null || constraint.length() == 0) {
filteredList.addAll(genresFull);
} else {
String filterPattern = constraint.toString().toLowerCase().trim();
for (Genre item : genresFull) {
if (item.getGenre().toLowerCase().contains(filterPattern)) {
filteredList.add(item);
}
}
}
FilterResults results = new FilterResults();
results.values = filteredList;
return results;
}
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
genres.clear();
genres.addAll((List) results.values);
notifyDataSetChanged();
}
};
private List<Genre> genres;
private List<Genre> genresFull;
public GenreCatalogueAdapter(ClickCallback click) {
this.click = click;
this.genres = Collections.emptyList();
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
ItemLibraryCatalogueGenreBinding view = ItemLibraryCatalogueGenreBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
Genre genre = genres.get(position);
holder.item.genreLabel.setText(MusicUtil.getReadableString(genre.getGenre()));
}
@Override
public int getItemCount() {
return genres.size();
}
public Genre getItem(int position) {
return genres.get(position);
}
public void setItems(List<Genre> genres) {
this.genres = genres;
this.genresFull = new ArrayList<>(genres);
notifyDataSetChanged();
}
@Override
public Filter getFilter() {
return filtering;
}
public class ViewHolder extends RecyclerView.ViewHolder {
ItemLibraryCatalogueGenreBinding item;
ViewHolder(ItemLibraryCatalogueGenreBinding item) {
super(item.getRoot());
this.item = item;
itemView.setOnClickListener(v -> {
Bundle bundle = new Bundle();
bundle.putString(Constants.MEDIA_BY_GENRE, Constants.MEDIA_BY_GENRE);
bundle.putParcelable(Constants.GENRE_OBJECT, genres.get(getBindingAdapterPosition()));
click.onGenreClick(bundle);
});
}
}
public void sort(String order) {
switch (order) {
case Constants.GENRE_ORDER_BY_NAME:
genres.sort(Comparator.comparing(Genre::getGenre));
break;
case Constants.GENRE_ORDER_BY_RANDOM:
Collections.shuffle(genres);
break;
}
notifyDataSetChanged();
}
}

View file

@ -0,0 +1,81 @@
package com.cappielloantonio.tempo.ui.adapter;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.cappielloantonio.tempo.databinding.ItemHomeGridTrackBinding;
import com.cappielloantonio.tempo.glide.CustomGlideRequest;
import com.cappielloantonio.tempo.interfaces.ClickCallback;
import com.cappielloantonio.tempo.model.Chronology;
import com.cappielloantonio.tempo.util.Constants;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class GridTrackAdapter extends RecyclerView.Adapter<GridTrackAdapter.ViewHolder> {
private final ClickCallback click;
private List<Chronology> items;
public GridTrackAdapter(ClickCallback click) {
this.click = click;
this.items = Collections.emptyList();
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
ItemHomeGridTrackBinding view = ItemHomeGridTrackBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
Chronology item = items.get(position);
CustomGlideRequest.Builder
.from(holder.itemView.getContext(), item.getCoverArtId())
.build()
.into(holder.item.trackCoverImageView);
}
@Override
public int getItemCount() {
return items.size();
}
public Chronology getItem(int position) {
return items.get(position);
}
public void setItems(List<Chronology> items) {
this.items = items;
notifyDataSetChanged();
}
public class ViewHolder extends RecyclerView.ViewHolder {
ItemHomeGridTrackBinding item;
ViewHolder(ItemHomeGridTrackBinding item) {
super(item.getRoot());
this.item = item;
itemView.setOnClickListener(v -> onClick());
}
public void onClick() {
Bundle bundle = new Bundle();
bundle.putParcelableArrayList(Constants.TRACKS_OBJECT, new ArrayList<>(items));
bundle.putBoolean(Constants.MEDIA_CHRONOLOGY, true);
bundle.putInt(Constants.ITEM_POSITION, getBindingAdapterPosition());
click.onMediaClick(bundle);
}
}
}

View file

@ -0,0 +1,98 @@
package com.cappielloantonio.tempo.ui.adapter;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.media3.common.util.UnstableApi;
import androidx.recyclerview.widget.RecyclerView;
import com.cappielloantonio.tempo.databinding.ItemHomeInternetRadioStationBinding;
import com.cappielloantonio.tempo.glide.CustomGlideRequest;
import com.cappielloantonio.tempo.interfaces.ClickCallback;
import com.cappielloantonio.tempo.subsonic.models.InternetRadioStation;
import com.cappielloantonio.tempo.util.Constants;
import java.util.Collections;
import java.util.List;
@UnstableApi
public class InternetRadioStationAdapter extends RecyclerView.Adapter<InternetRadioStationAdapter.ViewHolder> {
private final ClickCallback click;
private List<InternetRadioStation> internetRadioStations;
public InternetRadioStationAdapter(ClickCallback click) {
this.click = click;
this.internetRadioStations = Collections.emptyList();
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
ItemHomeInternetRadioStationBinding view = ItemHomeInternetRadioStationBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
InternetRadioStation internetRadioStation = internetRadioStations.get(position);
holder.item.internetRadioStationTitleTextView.setText(internetRadioStation.getName());
holder.item.internetRadioStationSubtitleTextView.setText(internetRadioStation.getStreamUrl());
CustomGlideRequest.Builder
.from(holder.itemView.getContext(), internetRadioStation.getStreamUrl())
.build()
.into(holder.item.internetRadioStationCoverImageView);
}
@Override
public int getItemCount() {
return internetRadioStations.size();
}
public void setItems(List<InternetRadioStation> internetRadioStations) {
this.internetRadioStations = internetRadioStations;
notifyDataSetChanged();
}
public InternetRadioStation getItem(int position) {
return internetRadioStations.get(position);
}
public class ViewHolder extends RecyclerView.ViewHolder {
ItemHomeInternetRadioStationBinding item;
ViewHolder(ItemHomeInternetRadioStationBinding item) {
super(item.getRoot());
this.item = item;
item.internetRadioStationTitleTextView.setSelected(true);
item.internetRadioStationSubtitleTextView.setSelected(true);
itemView.setOnClickListener(v -> onClick());
itemView.setOnLongClickListener(v -> onLongClick());
item.internetRadioStationMoreButton.setOnClickListener(v -> onLongClick());
}
public void onClick() {
Bundle bundle = new Bundle();
bundle.putParcelable(Constants.INTERNET_RADIO_STATION_OBJECT, internetRadioStations.get(getBindingAdapterPosition()));
click.onInternetRadioStationClick(bundle);
}
private boolean onLongClick() {
Bundle bundle = new Bundle();
bundle.putParcelable(Constants.INTERNET_RADIO_STATION_OBJECT, internetRadioStations.get(getBindingAdapterPosition()));
click.onInternetRadioStationLongClick(bundle);
return true;
}
}
}

View file

@ -0,0 +1,88 @@
package com.cappielloantonio.tempo.ui.adapter;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.media3.common.util.UnstableApi;
import androidx.recyclerview.widget.RecyclerView;
import com.cappielloantonio.tempo.databinding.ItemLibraryMusicDirectoryBinding;
import com.cappielloantonio.tempo.glide.CustomGlideRequest;
import com.cappielloantonio.tempo.interfaces.ClickCallback;
import com.cappielloantonio.tempo.subsonic.models.Child;
import com.cappielloantonio.tempo.util.Constants;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
@UnstableApi
public class MusicDirectoryAdapter extends RecyclerView.Adapter<MusicDirectoryAdapter.ViewHolder> {
private final ClickCallback click;
private List<Child> children;
public MusicDirectoryAdapter(ClickCallback click) {
this.click = click;
this.children = Collections.emptyList();
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
ItemLibraryMusicDirectoryBinding view = ItemLibraryMusicDirectoryBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
Child child = children.get(position);
holder.item.musicDirectoryTitleTextView.setText(child.getTitle());
CustomGlideRequest.Builder
.from(holder.itemView.getContext(), child.getCoverArtId())
.build()
.into(holder.item.musicDirectoryCoverImageView);
}
@Override
public int getItemCount() {
return children.size();
}
public void setItems(List<Child> children) {
this.children = children != null ? children : Collections.emptyList();
notifyDataSetChanged();
}
public class ViewHolder extends RecyclerView.ViewHolder {
ItemLibraryMusicDirectoryBinding item;
ViewHolder(ItemLibraryMusicDirectoryBinding item) {
super(item.getRoot());
this.item = item;
item.musicDirectoryTitleTextView.setSelected(true);
itemView.setOnClickListener(v -> onClick());
item.musicDirectoryMoreButton.setOnClickListener(v -> onClick());
}
public void onClick() {
Bundle bundle = new Bundle();
if (children.get(getBindingAdapterPosition()).isDir()) {
bundle.putParcelable(Constants.MUSIC_DIRECTORY_OBJECT, children.get(getBindingAdapterPosition()));
click.onMusicDirectoryClick(bundle);
} else {
bundle.putParcelableArrayList(Constants.TRACKS_OBJECT, new ArrayList<>(children));
bundle.putInt(Constants.ITEM_POSITION, getBindingAdapterPosition());
click.onMediaClick(bundle);
}
}
}
}

View file

@ -0,0 +1,85 @@
package com.cappielloantonio.tempo.ui.adapter;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.media3.common.util.UnstableApi;
import androidx.recyclerview.widget.RecyclerView;
import com.cappielloantonio.tempo.databinding.ItemLibraryMusicFolderBinding;
import com.cappielloantonio.tempo.glide.CustomGlideRequest;
import com.cappielloantonio.tempo.interfaces.ClickCallback;
import com.cappielloantonio.tempo.subsonic.models.MusicFolder;
import com.cappielloantonio.tempo.util.Constants;
import java.util.Collections;
import java.util.List;
@UnstableApi
public class MusicFolderAdapter extends RecyclerView.Adapter<MusicFolderAdapter.ViewHolder> {
private final ClickCallback click;
private List<MusicFolder> musicFolders;
public MusicFolderAdapter(ClickCallback click) {
this.click = click;
this.musicFolders = Collections.emptyList();
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
ItemLibraryMusicFolderBinding view = ItemLibraryMusicFolderBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
MusicFolder musicFolder = musicFolders.get(position);
holder.item.musicFolderTitleTextView.setText(musicFolder.getName());
CustomGlideRequest.Builder
.from(holder.itemView.getContext(), musicFolder.getName())
.build()
.into(holder.item.musicFolderCoverImageView);
}
@Override
public int getItemCount() {
return musicFolders.size();
}
public void setItems(List<MusicFolder> musicFolders) {
this.musicFolders = musicFolders;
notifyDataSetChanged();
}
public MusicFolder getItem(int position) {
return musicFolders.get(position);
}
public class ViewHolder extends RecyclerView.ViewHolder {
ItemLibraryMusicFolderBinding item;
ViewHolder(ItemLibraryMusicFolderBinding item) {
super(item.getRoot());
this.item = item;
item.musicFolderTitleTextView.setSelected(true);
itemView.setOnClickListener(v -> onClick());
item.musicFolderMoreButton.setOnClickListener(v -> onClick());
}
public void onClick() {
Bundle bundle = new Bundle();
bundle.putParcelable(Constants.MUSIC_FOLDER_OBJECT, musicFolders.get(getBindingAdapterPosition()));
click.onMusicFolderClick(bundle);
}
}
}

View file

@ -0,0 +1,80 @@
package com.cappielloantonio.tempo.ui.adapter;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.media3.common.util.UnstableApi;
import androidx.recyclerview.widget.RecyclerView;
import com.cappielloantonio.tempo.databinding.ItemLibraryMusicIndexBinding;
import com.cappielloantonio.tempo.glide.CustomGlideRequest;
import com.cappielloantonio.tempo.interfaces.ClickCallback;
import com.cappielloantonio.tempo.subsonic.models.Artist;
import com.cappielloantonio.tempo.util.Constants;
import java.util.Collections;
import java.util.List;
@UnstableApi
public class MusicIndexAdapter extends RecyclerView.Adapter<MusicIndexAdapter.ViewHolder> {
private final ClickCallback click;
private List<Artist> artists;
public MusicIndexAdapter(ClickCallback click) {
this.click = click;
this.artists = Collections.emptyList();
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
ItemLibraryMusicIndexBinding view = ItemLibraryMusicIndexBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
Artist artist = artists.get(position);
holder.item.musicIndexTitleTextView.setText(artist.getName());
CustomGlideRequest.Builder
.from(holder.itemView.getContext(), artist.getName())
.build()
.into(holder.item.musicIndexCoverImageView);
}
@Override
public int getItemCount() {
return artists.size();
}
public void setItems(List<Artist> artists) {
this.artists = artists;
notifyDataSetChanged();
}
public class ViewHolder extends RecyclerView.ViewHolder {
ItemLibraryMusicIndexBinding item;
ViewHolder(ItemLibraryMusicIndexBinding item) {
super(item.getRoot());
this.item = item;
item.musicIndexTitleTextView.setSelected(true);
itemView.setOnClickListener(v -> onClick());
item.musicIndexMoreButton.setOnClickListener(v -> onClick());
}
public void onClick() {
Bundle bundle = new Bundle();
bundle.putParcelable(Constants.MUSIC_INDEX_OBJECT, artists.get(getBindingAdapterPosition()));
click.onMusicIndexClick(bundle);
}
}
}

View file

@ -0,0 +1,118 @@
package com.cappielloantonio.tempo.ui.adapter;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.media3.session.MediaBrowser;
import androidx.recyclerview.widget.RecyclerView;
import com.cappielloantonio.tempo.R;
import com.cappielloantonio.tempo.databinding.ItemPlayerQueueSongBinding;
import com.cappielloantonio.tempo.glide.CustomGlideRequest;
import com.cappielloantonio.tempo.interfaces.ClickCallback;
import com.cappielloantonio.tempo.service.MediaManager;
import com.cappielloantonio.tempo.subsonic.models.Child;
import com.cappielloantonio.tempo.util.Constants;
import com.cappielloantonio.tempo.util.MusicUtil;
import com.google.common.util.concurrent.ListenableFuture;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class PlayerSongQueueAdapter extends RecyclerView.Adapter<PlayerSongQueueAdapter.ViewHolder> {
private final ClickCallback click;
private ListenableFuture<MediaBrowser> mediaBrowserListenableFuture;
private List<Child> songs;
public PlayerSongQueueAdapter(ClickCallback click) {
this.click = click;
this.songs = Collections.emptyList();
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
ItemPlayerQueueSongBinding view = ItemPlayerQueueSongBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
Child song = songs.get(position);
holder.item.queueSongTitleTextView.setText(MusicUtil.getReadableString(song.getTitle()));
holder.item.queueSongSubtitleTextView.setText(holder.itemView.getContext().getString(R.string.song_subtitle_formatter, MusicUtil.getReadableString(song.getArtist()), MusicUtil.getReadableDurationString(song.getDuration(), false)));
CustomGlideRequest.Builder
.from(holder.itemView.getContext(), song.getCoverArtId())
.build()
.into(holder.item.queueSongCoverImageView);
MediaManager.getCurrentIndex(mediaBrowserListenableFuture, index -> {
if (position < index) {
holder.item.queueSongTitleTextView.setAlpha(0.2f);
holder.item.queueSongSubtitleTextView.setAlpha(0.2f);
} else {
holder.item.queueSongTitleTextView.setAlpha(1.0f);
holder.item.queueSongSubtitleTextView.setAlpha(1.0f);
}
});
}
public List<Child> getItems() {
return this.songs;
}
public void setItems(List<Child> songs) {
this.songs = songs;
notifyDataSetChanged();
}
@Override
public int getItemCount() {
if (songs == null) {
return 0;
}
return songs.size();
}
@Override
public long getItemId(int position) {
return position;
}
public void setMediaBrowserListenableFuture(ListenableFuture<MediaBrowser> mediaBrowserListenableFuture) {
this.mediaBrowserListenableFuture = mediaBrowserListenableFuture;
}
public Child getItem(int id) {
return songs.get(id);
}
public class ViewHolder extends RecyclerView.ViewHolder {
ItemPlayerQueueSongBinding item;
ViewHolder(ItemPlayerQueueSongBinding item) {
super(item.getRoot());
this.item = item;
item.queueSongTitleTextView.setSelected(true);
item.queueSongSubtitleTextView.setSelected(true);
itemView.setOnClickListener(v -> onClick());
}
public void onClick() {
Bundle bundle = new Bundle();
bundle.putParcelableArrayList(Constants.TRACKS_OBJECT, new ArrayList<>(songs));
bundle.putInt(Constants.ITEM_POSITION, getBindingAdapterPosition());
click.onMediaClick(bundle);
}
}
}

View file

@ -0,0 +1,79 @@
package com.cappielloantonio.tempo.ui.adapter;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.cappielloantonio.tempo.R;
import com.cappielloantonio.tempo.databinding.ItemHorizontalPlaylistDialogBinding;
import com.cappielloantonio.tempo.interfaces.ClickCallback;
import com.cappielloantonio.tempo.subsonic.models.Playlist;
import com.cappielloantonio.tempo.util.Constants;
import com.cappielloantonio.tempo.util.MusicUtil;
import java.util.Collections;
import java.util.List;
public class PlaylistDialogHorizontalAdapter extends RecyclerView.Adapter<PlaylistDialogHorizontalAdapter.ViewHolder> {
private final ClickCallback click;
private List<Playlist> playlists;
public PlaylistDialogHorizontalAdapter(ClickCallback click) {
this.click = click;
this.playlists = Collections.emptyList();
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
ItemHorizontalPlaylistDialogBinding view = ItemHorizontalPlaylistDialogBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
Playlist playlist = playlists.get(position);
holder.item.playlistDialogTitleTextView.setText(MusicUtil.getReadableString(playlist.getName()));
holder.item.playlistDialogCountTextView.setText(holder.itemView.getContext().getString(R.string.playlist_counted_tracks, playlist.getSongCount(), MusicUtil.getReadableDurationString(playlist.getDuration(), false)));
}
@Override
public int getItemCount() {
return playlists.size();
}
public void setItems(List<Playlist> playlists) {
this.playlists = playlists;
notifyDataSetChanged();
}
public Playlist getItem(int id) {
return playlists.get(id);
}
public class ViewHolder extends RecyclerView.ViewHolder {
ItemHorizontalPlaylistDialogBinding item;
ViewHolder(ItemHorizontalPlaylistDialogBinding item) {
super(item.getRoot());
this.item = item;
item.playlistDialogTitleTextView.setSelected(true);
itemView.setOnClickListener(v -> onClick());
}
public void onClick() {
Bundle bundle = new Bundle();
bundle.putParcelable(Constants.PLAYLIST_OBJECT, playlists.get(getBindingAdapterPosition()));
click.onPlaylistClick(bundle);
}
}
}

View file

@ -0,0 +1,74 @@
package com.cappielloantonio.tempo.ui.adapter;
import android.view.LayoutInflater;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.cappielloantonio.tempo.databinding.ItemHorizontalPlaylistDialogTrackBinding;
import com.cappielloantonio.tempo.glide.CustomGlideRequest;
import com.cappielloantonio.tempo.subsonic.models.Child;
import com.cappielloantonio.tempo.util.MusicUtil;
import java.util.Collections;
import java.util.List;
public class PlaylistDialogSongHorizontalAdapter extends RecyclerView.Adapter<PlaylistDialogSongHorizontalAdapter.ViewHolder> {
private List<Child> songs;
public PlaylistDialogSongHorizontalAdapter() {
this.songs = Collections.emptyList();
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
ItemHorizontalPlaylistDialogTrackBinding view = ItemHorizontalPlaylistDialogTrackBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
Child song = songs.get(position);
holder.item.playlistDialogSongTitleTextView.setText(MusicUtil.getReadableString(song.getTitle()));
holder.item.playlistDialogAlbumArtistTextView.setText(MusicUtil.getReadableString(song.getArtist()));
holder.item.playlistDialogSongDurationTextView.setText(MusicUtil.getReadableDurationString(song.getDuration(), false));
CustomGlideRequest.Builder
.from(holder.itemView.getContext(), song.getCoverArtId())
.build()
.into(holder.item.playlistDialogSongCoverImageView);
}
@Override
public int getItemCount() {
return songs.size();
}
public List<Child> getItems() {
return this.songs;
}
public void setItems(List<Child> songs) {
this.songs = songs;
notifyDataSetChanged();
}
public Child getItem(int id) {
return songs.get(id);
}
public static class ViewHolder extends RecyclerView.ViewHolder {
ItemHorizontalPlaylistDialogTrackBinding item;
ViewHolder(ItemHorizontalPlaylistDialogTrackBinding item) {
super(item.getRoot());
this.item = item;
item.playlistDialogSongTitleTextView.setSelected(true);
}
}
}

View file

@ -0,0 +1,151 @@
package com.cappielloantonio.tempo.ui.adapter;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.ViewGroup;
import android.widget.Filter;
import android.widget.Filterable;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.cappielloantonio.tempo.R;
import com.cappielloantonio.tempo.databinding.ItemHorizontalPlaylistBinding;
import com.cappielloantonio.tempo.glide.CustomGlideRequest;
import com.cappielloantonio.tempo.interfaces.ClickCallback;
import com.cappielloantonio.tempo.subsonic.models.Playlist;
import com.cappielloantonio.tempo.util.Constants;
import com.cappielloantonio.tempo.util.MusicUtil;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class PlaylistHorizontalAdapter extends RecyclerView.Adapter<PlaylistHorizontalAdapter.ViewHolder> implements Filterable {
private final ClickCallback click;
private List<Playlist> playlists;
private List<Playlist> playlistsFull;
private final Filter filtering = new Filter() {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
List<Playlist> filteredList = new ArrayList<>();
if (constraint == null || constraint.length() == 0) {
filteredList.addAll(playlistsFull);
} else {
String filterPattern = constraint.toString().toLowerCase().trim();
for (Playlist item : playlistsFull) {
if (item.getName().toLowerCase().contains(filterPattern)) {
filteredList.add(item);
}
}
}
FilterResults results = new FilterResults();
results.values = filteredList;
return results;
}
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
playlists.clear();
playlists.addAll((List) results.values);
notifyDataSetChanged();
}
};
public PlaylistHorizontalAdapter(ClickCallback click) {
this.click = click;
this.playlists = Collections.emptyList();
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
ItemHorizontalPlaylistBinding view = ItemHorizontalPlaylistBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
Playlist playlist = playlists.get(position);
holder.item.playlistTitleTextView.setText(MusicUtil.getReadableString(playlist.getName()));
holder.item.playlistSubtitleTextView.setText(holder.itemView.getContext().getString(R.string.playlist_counted_tracks, playlist.getSongCount(), MusicUtil.getReadableDurationString(playlist.getDuration(), false)));
CustomGlideRequest.Builder
.from(holder.itemView.getContext(), playlist.getCoverArtId())
.build()
.into(holder.item.playlistCoverImageView);
}
@Override
public int getItemCount() {
return playlists.size();
}
public Playlist getItem(int id) {
return playlists.get(id);
}
public void setItems(List<Playlist> playlists) {
this.playlists = playlists;
this.playlistsFull = new ArrayList<>(playlists);
notifyDataSetChanged();
}
@Override
public Filter getFilter() {
return filtering;
}
public class ViewHolder extends RecyclerView.ViewHolder {
ItemHorizontalPlaylistBinding item;
ViewHolder(ItemHorizontalPlaylistBinding item) {
super(item.getRoot());
this.item = item;
item.playlistTitleTextView.setSelected(true);
itemView.setOnClickListener(v -> onClick());
itemView.setOnLongClickListener(v -> onLongClick());
item.playlistMoreButton.setOnClickListener(v -> onLongClick());
}
public void onClick() {
Bundle bundle = new Bundle();
bundle.putParcelable(Constants.PLAYLIST_OBJECT, playlists.get(getBindingAdapterPosition()));
click.onPlaylistClick(bundle);
}
public boolean onLongClick() {
Bundle bundle = new Bundle();
bundle.putParcelable(Constants.PLAYLIST_OBJECT, playlists.get(getBindingAdapterPosition()));
click.onPlaylistLongClick(bundle);
return true;
}
}
public void sort(String order) {
switch (order) {
case Constants.PLAYLIST_ORDER_BY_NAME:
playlists.sort(Comparator.comparing(Playlist::getName));
break;
case Constants.PLAYLIST_ORDER_BY_RANDOM:
Collections.shuffle(playlists);
break;
}
notifyDataSetChanged();
}
}

View file

@ -0,0 +1,144 @@
package com.cappielloantonio.tempo.ui.adapter;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.ViewGroup;
import android.widget.Filter;
import android.widget.Filterable;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.cappielloantonio.tempo.databinding.ItemHomeCataloguePodcastChannelBinding;
import com.cappielloantonio.tempo.databinding.ItemLibraryCatalogueAlbumBinding;
import com.cappielloantonio.tempo.glide.CustomGlideRequest;
import com.cappielloantonio.tempo.interfaces.ClickCallback;
import com.cappielloantonio.tempo.subsonic.models.PodcastChannel;
import com.cappielloantonio.tempo.util.Constants;
import com.cappielloantonio.tempo.util.MusicUtil;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class PodcastChannelCatalogueAdapter extends RecyclerView.Adapter<PodcastChannelCatalogueAdapter.ViewHolder> implements Filterable {
private final ClickCallback click;
private final Filter filtering = new Filter() {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
List<PodcastChannel> filteredList = new ArrayList<>();
if (constraint == null || constraint.length() == 0) {
filteredList.addAll(podcastChannelsFull);
} else {
String filterPattern = constraint.toString().toLowerCase().trim();
for (PodcastChannel item : podcastChannelsFull) {
if (item.getTitle().toLowerCase().contains(filterPattern)) {
filteredList.add(item);
}
}
}
FilterResults results = new FilterResults();
results.values = filteredList;
return results;
}
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
podcastChannels.clear();
podcastChannels.addAll((List) results.values);
notifyDataSetChanged();
}
};
private List<PodcastChannel> podcastChannels;
private List<PodcastChannel> podcastChannelsFull;
public PodcastChannelCatalogueAdapter(ClickCallback click) {
this.click = click;
this.podcastChannels = Collections.emptyList();
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
ItemHomeCataloguePodcastChannelBinding view = ItemHomeCataloguePodcastChannelBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
PodcastChannel podcastChannel = podcastChannels.get(position);
holder.item.podcastChannelTitleLabel.setText(MusicUtil.getReadableString(podcastChannel.getTitle()));
CustomGlideRequest.Builder
.from(holder.itemView.getContext(), podcastChannel.getCoverArtId())
.build()
.into(holder.item.podcastChannelCatalogueCoverImageView);
}
@Override
public int getItemCount() {
return podcastChannels.size();
}
public PodcastChannel getItem(int position) {
return podcastChannels.get(position);
}
public void setItems(List<PodcastChannel> podcastChannels) {
this.podcastChannels = podcastChannels;
this.podcastChannelsFull = new ArrayList<>(podcastChannels);
notifyDataSetChanged();
}
@Override
public int getItemViewType(int position) {
return position;
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public Filter getFilter() {
return filtering;
}
public class ViewHolder extends RecyclerView.ViewHolder {
ItemHomeCataloguePodcastChannelBinding item;
ViewHolder(ItemHomeCataloguePodcastChannelBinding item) {
super(item.getRoot());
this.item = item;
item.podcastChannelTitleLabel.setSelected(true);
itemView.setOnClickListener(v -> onClick());
itemView.setOnLongClickListener(v -> onLongClick());
}
private void onClick() {
Bundle bundle = new Bundle();
bundle.putParcelable(Constants.PODCAST_CHANNEL_OBJECT, podcastChannels.get(getBindingAdapterPosition()));
click.onAlbumClick(bundle);
}
private boolean onLongClick() {
Bundle bundle = new Bundle();
bundle.putParcelable(Constants.PODCAST_CHANNEL_OBJECT, podcastChannels.get(getBindingAdapterPosition()));
click.onAlbumLongClick(bundle);
return true;
}
}
}

View file

@ -0,0 +1,97 @@
package com.cappielloantonio.tempo.ui.adapter;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.cappielloantonio.tempo.databinding.ItemHorizontalPodcastChannelBinding;
import com.cappielloantonio.tempo.glide.CustomGlideRequest;
import com.cappielloantonio.tempo.interfaces.ClickCallback;
import com.cappielloantonio.tempo.subsonic.models.PodcastChannel;
import com.cappielloantonio.tempo.util.Constants;
import com.cappielloantonio.tempo.util.MusicUtil;
import java.util.Collections;
import java.util.List;
public class PodcastChannelHorizontalAdapter extends RecyclerView.Adapter<PodcastChannelHorizontalAdapter.ViewHolder> {
private final ClickCallback click;
private List<PodcastChannel> podcastChannels;
public PodcastChannelHorizontalAdapter(ClickCallback click) {
this.click = click;
this.podcastChannels = Collections.emptyList();
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
ItemHorizontalPodcastChannelBinding view = ItemHorizontalPodcastChannelBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
PodcastChannel podcastChannel = podcastChannels.get(position);
holder.item.podcastChannelTitleTextView.setText(MusicUtil.getReadableString(podcastChannel.getTitle()));
holder.item.podcastChannelDescriptionTextView.setText(MusicUtil.getReadableString(podcastChannel.getDescription()));
CustomGlideRequest.Builder
.from(holder.itemView.getContext(), podcastChannel.getOriginalImageUrl())
.build()
.into(holder.item.podcastChannelCoverImageView);
}
@Override
public int getItemCount() {
return podcastChannels.size();
}
public void setItems(List<PodcastChannel> podcastChannels) {
this.podcastChannels = podcastChannels;
notifyDataSetChanged();
}
public PodcastChannel getItem(int id) {
return podcastChannels.get(id);
}
public class ViewHolder extends RecyclerView.ViewHolder {
ItemHorizontalPodcastChannelBinding item;
ViewHolder(ItemHorizontalPodcastChannelBinding item) {
super(item.getRoot());
this.item = item;
item.podcastChannelTitleTextView.setSelected(true);
item.podcastChannelDescriptionTextView.setSelected(true);
itemView.setOnClickListener(v -> onClick());
itemView.setOnLongClickListener(v -> onLongClick());
item.podcastChannelMoreButton.setOnClickListener(v -> onLongClick());
}
private void onClick() {
Bundle bundle = new Bundle();
bundle.putParcelable(Constants.PODCAST_CHANNEL_OBJECT, podcastChannels.get(getBindingAdapterPosition()));
click.onPodcastChannelClick(bundle);
}
private boolean onLongClick() {
Bundle bundle = new Bundle();
bundle.putParcelable(Constants.PODCAST_CHANNEL_OBJECT, podcastChannels.get(getBindingAdapterPosition()));
click.onPodcastChannelLongClick(bundle);
return true;
}
}
}

View file

@ -0,0 +1,106 @@
package com.cappielloantonio.tempo.ui.adapter;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.cappielloantonio.tempo.R;
import com.cappielloantonio.tempo.databinding.ItemHomePodcastEpisodeBinding;
import com.cappielloantonio.tempo.glide.CustomGlideRequest;
import com.cappielloantonio.tempo.interfaces.ClickCallback;
import com.cappielloantonio.tempo.subsonic.models.PodcastEpisode;
import com.cappielloantonio.tempo.util.Constants;
import com.cappielloantonio.tempo.util.MusicUtil;
import java.text.SimpleDateFormat;
import java.util.Collections;
import java.util.List;
public class PodcastEpisodeAdapter extends RecyclerView.Adapter<PodcastEpisodeAdapter.ViewHolder> {
private final ClickCallback click;
private List<PodcastEpisode> podcastEpisodes;
public PodcastEpisodeAdapter(ClickCallback click) {
this.click = click;
this.podcastEpisodes = Collections.emptyList();
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
ItemHomePodcastEpisodeBinding view = ItemHomePodcastEpisodeBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
PodcastEpisode podcastEpisode = podcastEpisodes.get(position);
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("MMM d");
holder.item.podcastTitleLabel.setText(MusicUtil.getReadableString(podcastEpisode.getTitle()));
holder.item.podcastSubtitleLabel.setText(MusicUtil.getReadableString(podcastEpisode.getArtist()));
holder.item.podcastReleasesAndDurationLabel.setText(holder.itemView.getContext().getString(R.string.podcast_release_date_duration_formatter, simpleDateFormat.format(podcastEpisode.getPublishDate()), MusicUtil.getReadablePodcastDurationString(podcastEpisode.getDuration())));
holder.item.podcastDescriptionText.setText(MusicUtil.getReadableString(podcastEpisode.getDescription()));
CustomGlideRequest.Builder
.from(holder.itemView.getContext(), podcastEpisode.getCoverArtId())
.build()
.into(holder.item.podcastCoverImageView);
}
@Override
public int getItemCount() {
return podcastEpisodes.size();
}
public void setItems(List<PodcastEpisode> podcastEpisodes) {
this.podcastEpisodes = podcastEpisodes;
notifyDataSetChanged();
}
@Override
public int getItemViewType(int position) {
return position;
}
@Override
public long getItemId(int position) {
return position;
}
public class ViewHolder extends RecyclerView.ViewHolder {
ItemHomePodcastEpisodeBinding item;
ViewHolder(ItemHomePodcastEpisodeBinding item) {
super(item.getRoot());
this.item = item;
itemView.setOnClickListener(v -> onClick());
itemView.setOnLongClickListener(v -> openMore());
item.podcastPlayButton.setOnClickListener(v -> onClick());
item.podcastMoreButton.setOnClickListener(v -> openMore());
}
public void onClick() {
Bundle bundle = new Bundle();
bundle.putParcelable(Constants.PODCAST_OBJECT, podcastEpisodes.get(getBindingAdapterPosition()));
click.onPodcastEpisodeClick(bundle);
}
private boolean openMore() {
Bundle bundle = new Bundle();
bundle.putParcelable(Constants.PODCAST_OBJECT, podcastEpisodes.get(getBindingAdapterPosition()));
click.onPodcastEpisodeLongClick(bundle);
return true;
}
}
}

View file

@ -0,0 +1,86 @@
package com.cappielloantonio.tempo.ui.adapter;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.cappielloantonio.tempo.databinding.ItemLoginServerBinding;
import com.cappielloantonio.tempo.interfaces.ClickCallback;
import com.cappielloantonio.tempo.model.Server;
import java.util.ArrayList;
import java.util.List;
public class ServerAdapter extends RecyclerView.Adapter<ServerAdapter.ViewHolder> {
private final ClickCallback click;
private List<Server> servers;
public ServerAdapter(ClickCallback click) {
this.click = click;
this.servers = new ArrayList<>();
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
ItemLoginServerBinding view = ItemLoginServerBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
Server server = servers.get(position);
holder.item.serverNameTextView.setText(server.getServerName());
holder.item.serverAddressTextView.setText(server.getAddress());
}
@Override
public int getItemCount() {
return servers.size();
}
public void setItems(List<Server> servers) {
this.servers = servers;
notifyDataSetChanged();
}
public Server getItem(int id) {
return servers.get(id);
}
public class ViewHolder extends RecyclerView.ViewHolder {
ItemLoginServerBinding item;
ViewHolder(ItemLoginServerBinding item) {
super(item.getRoot());
this.item = item;
item.serverNameTextView.setSelected(true);
itemView.setOnClickListener(v -> onClick());
itemView.setOnLongClickListener(v -> onLongClick());
}
public void onClick() {
Bundle bundle = new Bundle();
bundle.putParcelable("server_object", servers.get(getBindingAdapterPosition()));
click.onServerClick(bundle);
}
public boolean onLongClick() {
Bundle bundle = new Bundle();
bundle.putParcelable("server_object", servers.get(getBindingAdapterPosition()));
click.onServerLongClick(bundle);
return true;
}
}
}

View file

@ -0,0 +1,92 @@
package com.cappielloantonio.tempo.ui.adapter;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.cappielloantonio.tempo.databinding.ItemHomeSimilarTrackBinding;
import com.cappielloantonio.tempo.glide.CustomGlideRequest;
import com.cappielloantonio.tempo.interfaces.ClickCallback;
import com.cappielloantonio.tempo.subsonic.models.Child;
import com.cappielloantonio.tempo.util.Constants;
import com.cappielloantonio.tempo.util.MusicUtil;
import java.util.Collections;
import java.util.List;
public class SimilarTrackAdapter extends RecyclerView.Adapter<SimilarTrackAdapter.ViewHolder> {
private final ClickCallback click;
private List<Child> songs;
public SimilarTrackAdapter(ClickCallback click) {
this.click = click;
this.songs = Collections.emptyList();
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
ItemHomeSimilarTrackBinding view = ItemHomeSimilarTrackBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
Child song = songs.get(position);
holder.item.titleTrackLabel.setText(MusicUtil.getReadableString(song.getTitle()));
CustomGlideRequest.Builder
.from(holder.itemView.getContext(), song.getCoverArtId())
.build()
.into(holder.item.trackCoverImageView);
}
@Override
public int getItemCount() {
return songs.size();
}
public Child getItem(int position) {
return songs.get(position);
}
public void setItems(List<Child> songs) {
this.songs = songs;
notifyDataSetChanged();
}
public class ViewHolder extends RecyclerView.ViewHolder {
ItemHomeSimilarTrackBinding item;
ViewHolder(ItemHomeSimilarTrackBinding item) {
super(item.getRoot());
this.item = item;
itemView.setOnClickListener(v -> onClick());
itemView.setOnLongClickListener(v -> onLongClick());
}
public void onClick() {
Bundle bundle = new Bundle();
bundle.putParcelable(Constants.TRACK_OBJECT, songs.get(getBindingAdapterPosition()));
bundle.putBoolean(Constants.MEDIA_MIX, true);
click.onMediaClick(bundle);
}
public boolean onLongClick() {
Bundle bundle = new Bundle();
bundle.putParcelable(Constants.TRACK_OBJECT, songs.get(getBindingAdapterPosition()));
click.onMediaLongClick(bundle);
return true;
}
}
}

View file

@ -0,0 +1,121 @@
package com.cappielloantonio.tempo.ui.adapter;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.media3.common.util.UnstableApi;
import androidx.recyclerview.widget.RecyclerView;
import com.cappielloantonio.tempo.R;
import com.cappielloantonio.tempo.databinding.ItemHorizontalTrackBinding;
import com.cappielloantonio.tempo.glide.CustomGlideRequest;
import com.cappielloantonio.tempo.interfaces.ClickCallback;
import com.cappielloantonio.tempo.subsonic.models.Child;
import com.cappielloantonio.tempo.util.Constants;
import com.cappielloantonio.tempo.util.DownloadUtil;
import com.cappielloantonio.tempo.util.MusicUtil;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
@UnstableApi
public class SongHorizontalAdapter extends RecyclerView.Adapter<SongHorizontalAdapter.ViewHolder> {
private final ClickCallback click;
private final boolean isCoverVisible;
private List<Child> songs;
public SongHorizontalAdapter(ClickCallback click, boolean isCoverVisible) {
this.click = click;
this.isCoverVisible = isCoverVisible;
this.songs = Collections.emptyList();
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
ItemHorizontalTrackBinding view = ItemHorizontalTrackBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
Child song = songs.get(position);
holder.item.searchResultSongTitleTextView.setText(MusicUtil.getReadableString(song.getTitle()));
holder.item.searchResultSongSubtitleTextView.setText(holder.itemView.getContext().getString(R.string.song_subtitle_formatter, MusicUtil.getReadableString(song.getArtist()), MusicUtil.getReadableDurationString(song.getDuration() != null ? song.getDuration() : 0, false)));
holder.item.trackNumberTextView.setText(String.valueOf(song.getTrack()));
if (DownloadUtil.getDownloadTracker(holder.itemView.getContext()).isDownloaded(song.getId())) {
holder.item.searchResultDowanloadIndicatorImageView.setVisibility(View.VISIBLE);
} else {
holder.item.searchResultDowanloadIndicatorImageView.setVisibility(View.GONE);
}
if (isCoverVisible) CustomGlideRequest.Builder
.from(holder.itemView.getContext(), song.getCoverArtId())
.build()
.into(holder.item.songCoverImageView);
if (isCoverVisible) holder.item.trackNumberTextView.setVisibility(View.INVISIBLE);
if (!isCoverVisible) holder.item.songCoverImageView.setVisibility(View.INVISIBLE);
if (!isCoverVisible && (position > 0 && songs.get(position - 1) != null && songs.get(position - 1).getDiscNumber() != null && songs.get(position).getDiscNumber() != null && songs.get(position - 1).getDiscNumber() < songs.get(position).getDiscNumber())) {
holder.item.differentDiskDivider.setVisibility(View.VISIBLE);
}
}
@Override
public int getItemCount() {
return songs.size();
}
public void setItems(List<Child> songs) {
this.songs = songs;
notifyDataSetChanged();
}
public Child getItem(int id) {
return songs.get(id);
}
public class ViewHolder extends RecyclerView.ViewHolder {
ItemHorizontalTrackBinding item;
ViewHolder(ItemHorizontalTrackBinding item) {
super(item.getRoot());
this.item = item;
item.searchResultSongTitleTextView.setSelected(true);
item.searchResultSongSubtitleTextView.setSelected(true);
itemView.setOnClickListener(v -> onClick());
itemView.setOnLongClickListener(v -> onLongClick());
item.searchResultSongMoreButton.setOnClickListener(v -> onLongClick());
}
public void onClick() {
Bundle bundle = new Bundle();
bundle.putParcelableArrayList(Constants.TRACKS_OBJECT, new ArrayList<>(MusicUtil.limitPlayableMedia(songs, getBindingAdapterPosition())));
bundle.putInt(Constants.ITEM_POSITION, MusicUtil.getPlayableMediaPosition(getBindingAdapterPosition()));
click.onMediaClick(bundle);
}
private boolean onLongClick() {
Bundle bundle = new Bundle();
bundle.putParcelable(Constants.TRACK_OBJECT, songs.get(getBindingAdapterPosition()));
click.onMediaLongClick(bundle);
return true;
}
}
}

View file

@ -0,0 +1,74 @@
package com.cappielloantonio.tempo.ui.adapter;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.cappielloantonio.tempo.databinding.ItemHomeYearBinding;
import com.cappielloantonio.tempo.interfaces.ClickCallback;
import com.cappielloantonio.tempo.util.Constants;
import java.util.Collections;
import java.util.List;
public class YearAdapter extends RecyclerView.Adapter<YearAdapter.ViewHolder> {
private final ClickCallback click;
private List<Integer> years;
public YearAdapter(ClickCallback click) {
this.click = click;
this.years = Collections.emptyList();
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
ItemHomeYearBinding view = ItemHomeYearBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
int year = years.get(position);
holder.item.yearLabel.setText(Integer.toString(year));
}
@Override
public int getItemCount() {
return years.size();
}
public Integer getItem(int position) {
return years.get(position);
}
public void setItems(List<Integer> years) {
this.years = years;
notifyDataSetChanged();
}
public class ViewHolder extends RecyclerView.ViewHolder {
ItemHomeYearBinding item;
ViewHolder(ItemHomeYearBinding item) {
super(item.getRoot());
this.item = item;
itemView.setOnClickListener(v -> onClick());
}
public void onClick() {
Bundle bundle = new Bundle();
bundle.putString(Constants.MEDIA_BY_YEAR, Constants.MEDIA_BY_YEAR);
bundle.putInt("year_object", years.get(getBindingAdapterPosition()));
click.onYearClick(bundle);
}
}
}