Fixed a lot of possible issues raised by a code inspection

This commit is contained in:
CappielloAntonio 2021-09-04 16:14:10 +02:00
parent 39ff821aee
commit 042bf3077f
76 changed files with 148 additions and 225 deletions

View file

@ -2,9 +2,7 @@ package com.cappielloantonio.play.adapter;
import android.content.Context; import android.content.Context;
import android.os.Bundle; import android.os.Bundle;
import android.text.Html;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.RoundedCorner;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.ImageView; import android.widget.ImageView;

View file

@ -2,7 +2,6 @@ package com.cappielloantonio.play.adapter;
import android.content.Context; import android.content.Context;
import android.os.Bundle; import android.os.Bundle;
import android.text.Html;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;

View file

@ -2,7 +2,6 @@ package com.cappielloantonio.play.adapter;
import android.content.Context; import android.content.Context;
import android.os.Bundle; import android.os.Bundle;
import android.text.Html;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;

View file

@ -2,7 +2,6 @@ package com.cappielloantonio.play.adapter;
import android.content.Context; import android.content.Context;
import android.os.Bundle; import android.os.Bundle;
import android.text.Html;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;

View file

@ -2,7 +2,6 @@ package com.cappielloantonio.play.adapter;
import android.content.Context; import android.content.Context;
import android.os.Bundle; import android.os.Bundle;
import android.text.Html;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;

View file

@ -95,10 +95,7 @@ public class ArtistHorizontalAdapter extends RecyclerView.Adapter<ArtistHorizont
itemView.setOnClickListener(this); itemView.setOnClickListener(this);
itemView.setOnLongClickListener(this); itemView.setOnLongClickListener(this);
more.setOnClickListener(v -> { more.setOnClickListener(this::openMore);
openMore(v);
});
artistName.setSelected(true); artistName.setSelected(true);
} }

View file

@ -2,7 +2,6 @@ package com.cappielloantonio.play.adapter;
import android.content.Context; import android.content.Context;
import android.os.Bundle; import android.os.Bundle;
import android.text.Html;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;

View file

@ -1,7 +1,6 @@
package com.cappielloantonio.play.adapter; package com.cappielloantonio.play.adapter;
import android.content.Context; import android.content.Context;
import android.text.Html;
import android.util.Log; import android.util.Log;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
@ -13,7 +12,6 @@ import android.widget.TextView;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
import com.bumptech.glide.load.resource.bitmap.RoundedCorners;
import com.cappielloantonio.play.App; import com.cappielloantonio.play.App;
import com.cappielloantonio.play.R; import com.cappielloantonio.play.R;
import com.cappielloantonio.play.glide.CustomGlideRequest; import com.cappielloantonio.play.glide.CustomGlideRequest;

View file

@ -1,7 +1,6 @@
package com.cappielloantonio.play.adapter; package com.cappielloantonio.play.adapter;
import android.content.Context; import android.content.Context;
import android.text.Html;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;

View file

@ -1,7 +1,6 @@
package com.cappielloantonio.play.adapter; package com.cappielloantonio.play.adapter;
import android.content.Context; import android.content.Context;
import android.text.Html;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;

View file

@ -1,7 +1,6 @@
package com.cappielloantonio.play.adapter; package com.cappielloantonio.play.adapter;
import android.content.Context; import android.content.Context;
import android.text.Html;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;

View file

@ -2,7 +2,6 @@ package com.cappielloantonio.play.adapter;
import android.content.Context; import android.content.Context;
import android.os.Bundle; import android.os.Bundle;
import android.text.Html;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
@ -16,13 +15,10 @@ import androidx.annotation.NonNull;
import androidx.navigation.Navigation; import androidx.navigation.Navigation;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
import com.bumptech.glide.load.resource.bitmap.RoundedCorners;
import com.cappielloantonio.play.R; import com.cappielloantonio.play.R;
import com.cappielloantonio.play.glide.CustomGlideRequest; import com.cappielloantonio.play.glide.CustomGlideRequest;
import com.cappielloantonio.play.model.Playlist; import com.cappielloantonio.play.model.Playlist;
import com.cappielloantonio.play.model.Song;
import com.cappielloantonio.play.ui.activity.MainActivity; import com.cappielloantonio.play.ui.activity.MainActivity;
import com.cappielloantonio.play.ui.fragment.dialog.PlaylistChooserDialog;
import com.cappielloantonio.play.ui.fragment.dialog.PlaylistEditorDialog; import com.cappielloantonio.play.ui.fragment.dialog.PlaylistEditorDialog;
import com.cappielloantonio.play.util.MusicUtil; import com.cappielloantonio.play.util.MusicUtil;

View file

@ -1,7 +1,6 @@
package com.cappielloantonio.play.adapter; package com.cappielloantonio.play.adapter;
import android.content.Context; import android.content.Context;
import android.os.Bundle;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
@ -9,20 +8,12 @@ import android.widget.ImageView;
import android.widget.TextView; import android.widget.TextView;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.fragment.app.FragmentManager;
import androidx.navigation.Navigation;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
import com.bumptech.glide.load.resource.bitmap.RoundedCorners; import com.bumptech.glide.load.resource.bitmap.RoundedCorners;
import com.cappielloantonio.play.App;
import com.cappielloantonio.play.R; import com.cappielloantonio.play.R;
import com.cappielloantonio.play.glide.CustomGlideRequest; import com.cappielloantonio.play.glide.CustomGlideRequest;
import com.cappielloantonio.play.model.Playlist;
import com.cappielloantonio.play.model.Song; import com.cappielloantonio.play.model.Song;
import com.cappielloantonio.play.repository.QueueRepository;
import com.cappielloantonio.play.service.MusicPlayerRemote;
import com.cappielloantonio.play.ui.activity.MainActivity;
import com.cappielloantonio.play.util.DownloadUtil;
import com.cappielloantonio.play.util.MusicUtil; import com.cappielloantonio.play.util.MusicUtil;
import java.util.ArrayList; import java.util.ArrayList;
@ -32,8 +23,8 @@ public class PlaylistDialogSongHorizontalAdapter extends RecyclerView.Adapter<Pl
private static final String TAG = "PlaylistDialogSongHorizontalAdapter"; private static final String TAG = "PlaylistDialogSongHorizontalAdapter";
private List<Song> songs; private List<Song> songs;
private LayoutInflater mInflater; private final LayoutInflater mInflater;
private Context context; private final Context context;
public PlaylistDialogSongHorizontalAdapter(Context context) { public PlaylistDialogSongHorizontalAdapter(Context context) {
this.context = context; this.context = context;
@ -81,7 +72,7 @@ public class PlaylistDialogSongHorizontalAdapter extends RecyclerView.Adapter<Pl
return songs.get(id); return songs.get(id);
} }
public class ViewHolder extends RecyclerView.ViewHolder { public static class ViewHolder extends RecyclerView.ViewHolder {
TextView songTitle; TextView songTitle;
TextView songArtist; TextView songArtist;
TextView songDuration; TextView songDuration;

View file

@ -9,15 +9,12 @@ import android.widget.TextView;
import android.widget.Toast; import android.widget.Toast;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.fragment.app.FragmentManager;
import androidx.navigation.Navigation;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
import com.cappielloantonio.play.App; import com.cappielloantonio.play.App;
import com.cappielloantonio.play.R; import com.cappielloantonio.play.R;
import com.cappielloantonio.play.interfaces.SystemCallback; import com.cappielloantonio.play.interfaces.SystemCallback;
import com.cappielloantonio.play.model.Server; import com.cappielloantonio.play.model.Server;
import com.cappielloantonio.play.model.Song;
import com.cappielloantonio.play.repository.SystemRepository; import com.cappielloantonio.play.repository.SystemRepository;
import com.cappielloantonio.play.ui.activity.MainActivity; import com.cappielloantonio.play.ui.activity.MainActivity;
import com.cappielloantonio.play.ui.fragment.dialog.ServerSignupDialog; import com.cappielloantonio.play.ui.fragment.dialog.ServerSignupDialog;
@ -25,7 +22,6 @@ import com.cappielloantonio.play.util.PreferenceUtil;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.UUID;
public class ServerAdapter extends RecyclerView.Adapter<ServerAdapter.ViewHolder> { public class ServerAdapter extends RecyclerView.Adapter<ServerAdapter.ViewHolder> {
private static final String TAG = "ServerAdapter"; private static final String TAG = "ServerAdapter";

View file

@ -2,7 +2,6 @@ package com.cappielloantonio.play.adapter;
import android.content.Context; import android.content.Context;
import android.os.Bundle; import android.os.Bundle;
import android.text.Html;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
@ -10,7 +9,6 @@ import android.widget.ImageView;
import android.widget.TextView; import android.widget.TextView;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.fragment.app.FragmentManager;
import androidx.navigation.Navigation; import androidx.navigation.Navigation;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
@ -68,15 +66,15 @@ public class SongHorizontalAdapter extends RecyclerView.Adapter<SongHorizontalAd
holder.downloadIndicator.setVisibility(View.GONE); holder.downloadIndicator.setVisibility(View.GONE);
} }
if(isCoverVisible) CustomGlideRequest.Builder if (isCoverVisible) CustomGlideRequest.Builder
.from(context, song.getPrimary(), CustomGlideRequest.SONG_PIC, null) .from(context, song.getPrimary(), CustomGlideRequest.SONG_PIC, null)
.build() .build()
.transform(new RoundedCorners(CustomGlideRequest.CORNER_RADIUS)) .transform(new RoundedCorners(CustomGlideRequest.CORNER_RADIUS))
.into(holder.cover); .into(holder.cover);
if(isCoverVisible) holder.trackNumber.setVisibility(View.INVISIBLE); if (isCoverVisible) holder.trackNumber.setVisibility(View.INVISIBLE);
if(!isCoverVisible) holder.cover.setVisibility(View.INVISIBLE); if (!isCoverVisible) holder.cover.setVisibility(View.INVISIBLE);
} }
@Override @Override

View file

@ -48,7 +48,6 @@ public class MediaButtonIntentReceiver extends BroadcastReceiver {
@SuppressLint("HandlerLeak") @SuppressLint("HandlerLeak")
private static final Handler mHandler = new Handler() { private static final Handler mHandler = new Handler() {
@Override @Override
public void handleMessage(final Message msg) { public void handleMessage(final Message msg) {
switch (msg.what) { switch (msg.what) {

View file

@ -3,7 +3,6 @@ package com.cappielloantonio.play.database;
import android.annotation.SuppressLint; import android.annotation.SuppressLint;
import android.content.Context; import android.content.Context;
import androidx.room.AutoMigration;
import androidx.room.Database; import androidx.room.Database;
import androidx.room.Room; import androidx.room.Room;
import androidx.room.RoomDatabase; import androidx.room.RoomDatabase;

View file

@ -7,7 +7,6 @@ import androidx.room.Insert;
import androidx.room.OnConflictStrategy; import androidx.room.OnConflictStrategy;
import androidx.room.Query; import androidx.room.Query;
import com.cappielloantonio.play.model.Queue;
import com.cappielloantonio.play.model.Server; import com.cappielloantonio.play.model.Server;
import java.util.List; import java.util.List;

View file

@ -3,6 +3,7 @@ package com.cappielloantonio.play.helper.recyclerview;
import android.graphics.Rect; import android.graphics.Rect;
import android.view.View; import android.view.View;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
public class GridItemDecoration extends RecyclerView.ItemDecoration { public class GridItemDecoration extends RecyclerView.ItemDecoration {
@ -17,7 +18,7 @@ public class GridItemDecoration extends RecyclerView.ItemDecoration {
} }
@Override @Override
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) { public void getItemOffsets(@NonNull Rect outRect, @NonNull View view, RecyclerView parent, @NonNull RecyclerView.State state) {
int position = parent.getChildAdapterPosition(view); // item position int position = parent.getChildAdapterPosition(view); // item position
int column = position % spanCount; // item column int column = position % spanCount; // item column

View file

@ -20,9 +20,7 @@ public class Artist implements Parcelable {
public static final String DOWNLOADED = "DOWNLOADED"; public static final String DOWNLOADED = "DOWNLOADED";
public static final String STARRED = "STARRED"; public static final String STARRED = "STARRED";
private List<Genre> genres;
private List<Album> albums; private List<Album> albums;
private List<Song> songs;
private List<Artist> similarArtists; private List<Artist> similarArtists;
private String id; private String id;
@ -222,9 +220,7 @@ public class Artist implements Parcelable {
} }
protected Artist(Parcel in) { protected Artist(Parcel in) {
this.genres = new ArrayList<>();
this.albums = new ArrayList<>(); this.albums = new ArrayList<>();
this.songs = new ArrayList<>();
this.id = in.readString(); this.id = in.readString();
this.name = in.readString(); this.name = in.readString();
this.primary = in.readString(); this.primary = in.readString();

View file

@ -22,14 +22,34 @@ public class Genre implements Parcelable {
return id; return id;
} }
public void setId(String id) {
this.id = id;
}
public String getName() { public String getName() {
return name; return name;
} }
public void setName(String name) {
this.name = name;
}
public int getSongCount() { public int getSongCount() {
return songCount; return songCount;
} }
public void setSongCount(int songCount) {
this.songCount = songCount;
}
public int getAlbumCount() {
return albumCount;
}
public void setAlbumCount(int albumCount) {
this.albumCount = albumCount;
}
@Override @Override
public boolean equals(Object o) { public boolean equals(Object o) {
if (this == o) return true; if (this == o) return true;

View file

@ -1,13 +1,11 @@
package com.cappielloantonio.play.model; package com.cappielloantonio.play.model;
import androidx.annotation.NonNull;
import androidx.room.ColumnInfo; import androidx.room.ColumnInfo;
import androidx.room.Entity; import androidx.room.Entity;
import androidx.room.PrimaryKey; import androidx.room.PrimaryKey;
@Entity(tableName = "queue") @Entity(tableName = "queue")
public class Queue { public class Queue {
@NonNull
@PrimaryKey @PrimaryKey
@ColumnInfo(name = "track_order") @ColumnInfo(name = "track_order")
private int trackOrder; private int trackOrder;

View file

@ -114,6 +114,7 @@ public class Server implements Parcelable {
return serverId.hashCode(); return serverId.hashCode();
} }
@NonNull
@Override @Override
public String toString() { public String toString() {
return serverId; return serverId;

View file

@ -3,6 +3,8 @@ package com.cappielloantonio.play.model;
import android.os.Parcel; import android.os.Parcel;
import android.os.Parcelable; import android.os.Parcelable;
import androidx.annotation.NonNull;
import com.cappielloantonio.play.subsonic.models.Child; import com.cappielloantonio.play.subsonic.models.Child;
import java.time.Instant; import java.time.Instant;
@ -296,6 +298,7 @@ public class Song implements Parcelable {
return id.hashCode(); return id.hashCode();
} }
@NonNull
@Override @Override
public String toString() { public String toString() {
return id; return id;

View file

@ -1,5 +1,7 @@
package com.cappielloantonio.play.service; package com.cappielloantonio.play.service;
import static com.google.android.exoplayer2.util.Assertions.checkNotNull;
import android.content.Context; import android.content.Context;
import android.net.Uri; import android.net.Uri;
@ -7,7 +9,6 @@ import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import com.cappielloantonio.play.App; import com.cappielloantonio.play.App;
import com.cappielloantonio.play.model.Album;
import com.cappielloantonio.play.model.Song; import com.cappielloantonio.play.model.Song;
import com.cappielloantonio.play.repository.DownloadRepository; import com.cappielloantonio.play.repository.DownloadRepository;
import com.cappielloantonio.play.util.MappingUtil; import com.cappielloantonio.play.util.MappingUtil;
@ -29,8 +30,6 @@ import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.concurrent.CopyOnWriteArraySet; import java.util.concurrent.CopyOnWriteArraySet;
import static com.google.android.exoplayer2.util.Assertions.checkNotNull;
public class DownloadTracker { public class DownloadTracker {
private static final String TAG = "DownloadTracker"; private static final String TAG = "DownloadTracker";
@ -74,7 +73,7 @@ public class DownloadTracker {
MediaItem mediaItem = MusicUtil.getMediaItemFromSong(song); MediaItem mediaItem = MusicUtil.getMediaItemFromSong(song);
@Nullable Download download = downloads.get(checkNotNull(mediaItem.playbackProperties).uri); @Nullable Download download = downloads.get(checkNotNull(mediaItem.playbackProperties).uri);
if(download != null && download.state != Download.STATE_FAILED) { if (download != null && download.state != Download.STATE_FAILED) {
return true; return true;
} }
} }
@ -91,7 +90,7 @@ public class DownloadTracker {
DownloadRepository downloadRepository = new DownloadRepository(App.getInstance()); DownloadRepository downloadRepository = new DownloadRepository(App.getInstance());
for (Song song : songs) { for (Song song : songs) {
if(isDownloaded(song)) { if (isDownloaded(song)) {
downloadRepository.insert(MappingUtil.mapToDownload(song, playlistId, playlistName)); downloadRepository.insert(MappingUtil.mapToDownload(song, playlistId, playlistName));
continue; continue;
} }

View file

@ -6,12 +6,8 @@ import static com.google.android.exoplayer2.Player.MEDIA_ITEM_TRANSITION_REASON_
import android.annotation.SuppressLint; import android.annotation.SuppressLint;
import android.app.PendingIntent; import android.app.PendingIntent;
import android.app.Service; import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.ComponentName; import android.content.ComponentName;
import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.content.IntentFilter;
import android.media.AudioManager;
import android.os.Binder; import android.os.Binder;
import android.os.Handler; import android.os.Handler;
import android.os.HandlerThread; import android.os.HandlerThread;
@ -32,7 +28,6 @@ import com.cappielloantonio.play.R;
import com.cappielloantonio.play.broadcast.receiver.MediaButtonIntentReceiver; import com.cappielloantonio.play.broadcast.receiver.MediaButtonIntentReceiver;
import com.cappielloantonio.play.interfaces.Playback; import com.cappielloantonio.play.interfaces.Playback;
import com.cappielloantonio.play.model.Playlist; import com.cappielloantonio.play.model.Playlist;
import com.cappielloantonio.play.model.Queue;
import com.cappielloantonio.play.model.Song; import com.cappielloantonio.play.model.Song;
import com.cappielloantonio.play.repository.QueueRepository; import com.cappielloantonio.play.repository.QueueRepository;
import com.cappielloantonio.play.repository.SongRepository; import com.cappielloantonio.play.repository.SongRepository;

View file

@ -20,8 +20,8 @@ public class Subsonic {
private final Context context; private final Context context;
private Version apiVersion = API_MAX_VERSION; private final Version apiVersion = API_MAX_VERSION;
private SubsonicPreferences preferences; private final SubsonicPreferences preferences;
private SystemClient systemClient; private SystemClient systemClient;
private BrowsingClient browsingClient; private BrowsingClient browsingClient;

View file

@ -1,5 +1,7 @@
package com.cappielloantonio.play.subsonic.base; package com.cappielloantonio.play.subsonic.base;
import androidx.annotation.NonNull;
public class Version implements Comparable<Version> { public class Version implements Comparable<Version> {
private static final String VERSION_PATTERN = "[0-9]+(\\.[0-9]+)*"; private static final String VERSION_PATTERN = "[0-9]+(\\.[0-9]+)*";
@ -49,6 +51,7 @@ public class Version implements Comparable<Version> {
return 0; return 0;
} }
@NonNull
@Override @Override
public String toString() { public String toString() {
return versionString; return versionString;

View file

@ -28,7 +28,7 @@ public class AlbumList {
*/ */
public List<Child> getAlbums() { public List<Child> getAlbums() {
if (albums == null) { if (albums == null) {
albums = new ArrayList<Child>(); albums = new ArrayList<>();
} }
return this.albums; return this.albums;
} }

View file

@ -28,7 +28,7 @@ public class ArtistInfo extends ArtistInfoBase {
*/ */
public List<Artist> getSimilarArtists() { public List<Artist> getSimilarArtists() {
if (similarArtists == null) { if (similarArtists == null) {
similarArtists = new ArrayList<Artist>(); similarArtists = new ArrayList<>();
} }
return this.similarArtists; return this.similarArtists;
} }

View file

@ -1,7 +1,6 @@
package com.cappielloantonio.play.subsonic.models; package com.cappielloantonio.play.subsonic.models;
import com.tickaroo.tikxml.annotation.Element; import com.tickaroo.tikxml.annotation.Element;
import com.tickaroo.tikxml.annotation.ElementNameMatcher;
import com.tickaroo.tikxml.annotation.Xml; import com.tickaroo.tikxml.annotation.Xml;
import java.util.ArrayList; import java.util.ArrayList;

View file

@ -28,7 +28,7 @@ public class Bookmarks {
*/ */
public List<Bookmark> getBookmarks() { public List<Bookmark> getBookmarks() {
if (bookmarks == null) { if (bookmarks == null) {
bookmarks = new ArrayList<Bookmark>(); bookmarks = new ArrayList<>();
} }
return this.bookmarks; return this.bookmarks;
} }

View file

@ -28,7 +28,7 @@ public class ChatMessages {
*/ */
public List<ChatMessage> getChatMessages() { public List<ChatMessage> getChatMessages() {
if (chatMessages == null) { if (chatMessages == null) {
chatMessages = new ArrayList<ChatMessage>(); chatMessages = new ArrayList<>();
} }
return this.chatMessages; return this.chatMessages;
} }

View file

@ -36,7 +36,7 @@ public class Directory {
*/ */
public List<Child> getchildren() { public List<Child> getchildren() {
if (children == null) { if (children == null) {
children = new ArrayList<Child>(); children = new ArrayList<>();
} }
return this.children; return this.children;
} }

View file

@ -11,7 +11,7 @@ public class ErrorCode {
public static int TRIAL_PERIOD_OVER = 60; public static int TRIAL_PERIOD_OVER = 60;
public static int DATA_NOT_FOUND = 70; public static int DATA_NOT_FOUND = 70;
private int value; private final int value;
public ErrorCode(int value) { public ErrorCode(int value) {
this.value = value; this.value = value;

View file

@ -29,7 +29,7 @@ public class Index {
*/ */
public List<Artist> getArtists() { public List<Artist> getArtists() {
if (artists == null) { if (artists == null) {
artists = new ArrayList<Artist>(); artists = new ArrayList<>();
} }
return this.artists; return this.artists;
} }

View file

@ -32,7 +32,7 @@ public class Indexes {
*/ */
public List<Artist> getShortcuts() { public List<Artist> getShortcuts() {
if (shortcuts == null) { if (shortcuts == null) {
shortcuts = new ArrayList<Artist>(); shortcuts = new ArrayList<>();
} }
return this.shortcuts; return this.shortcuts;
} }
@ -59,7 +59,7 @@ public class Indexes {
*/ */
public List<Index> getIndices() { public List<Index> getIndices() {
if (indices == null) { if (indices == null) {
indices = new ArrayList<Index>(); indices = new ArrayList<>();
} }
return this.indices; return this.indices;
} }
@ -86,7 +86,7 @@ public class Indexes {
*/ */
public List<Child> getchildren() { public List<Child> getchildren() {
if (children == null) { if (children == null) {
children = new ArrayList<Child>(); children = new ArrayList<>();
} }
return this.children; return this.children;
} }

View file

@ -28,7 +28,7 @@ public class InternetRadioStations {
*/ */
public List<InternetRadioStation> getInternetRadioStations() { public List<InternetRadioStation> getInternetRadioStations() {
if (internetRadioStations == null) { if (internetRadioStations == null) {
internetRadioStations = new ArrayList<InternetRadioStation>(); internetRadioStations = new ArrayList<>();
} }
return this.internetRadioStations; return this.internetRadioStations;
} }

View file

@ -28,7 +28,7 @@ public class JukeboxPlaylist extends JukeboxStatus {
*/ */
public List<Child> getEntries() { public List<Child> getEntries() {
if (entries == null) { if (entries == null) {
entries = new ArrayList<Child>(); entries = new ArrayList<>();
} }
return this.entries; return this.entries;
} }

View file

@ -28,7 +28,7 @@ public class NewestPodcasts {
*/ */
public List<PodcastEpisode> getEpisodes() { public List<PodcastEpisode> getEpisodes() {
if (episodes == null) { if (episodes == null) {
episodes = new ArrayList<PodcastEpisode>(); episodes = new ArrayList<>();
} }
return this.episodes; return this.episodes;
} }

View file

@ -28,7 +28,7 @@ public class NowPlaying {
*/ */
public List<NowPlayingEntry> getEntries() { public List<NowPlayingEntry> getEntries() {
if (entries == null) { if (entries == null) {
entries = new ArrayList<NowPlayingEntry>(); entries = new ArrayList<>();
} }
return this.entries; return this.entries;
} }

View file

@ -34,7 +34,7 @@ public class PlayQueue {
*/ */
public List<Child> getEntries() { public List<Child> getEntries() {
if (entries == null) { if (entries == null) {
entries = new ArrayList<Child>(); entries = new ArrayList<>();
} }
return this.entries; return this.entries;
} }

View file

@ -36,7 +36,7 @@ public class PodcastChannel {
*/ */
public List<PodcastEpisode> getEpisodes() { public List<PodcastEpisode> getEpisodes() {
if (episodes == null) { if (episodes == null) {
episodes = new ArrayList<PodcastEpisode>(); episodes = new ArrayList<>();
} }
return this.episodes; return this.episodes;
} }

View file

@ -28,7 +28,7 @@ public class Podcasts {
*/ */
public List<PodcastChannel> getChannels() { public List<PodcastChannel> getChannels() {
if (channels == null) { if (channels == null) {
channels = new ArrayList<PodcastChannel>(); channels = new ArrayList<>();
} }
return this.channels; return this.channels;
} }

View file

@ -8,7 +8,7 @@ public class ResponseStatus {
public static String OK = "ok"; public static String OK = "ok";
public static String FAILED = "failed"; public static String FAILED = "failed";
private String value; private final String value;
public ResponseStatus(@Attribute String value) { public ResponseStatus(@Attribute String value) {
this.value = value; this.value = value;

View file

@ -30,7 +30,7 @@ public class SearchResult {
*/ */
public List<Child> getMatches() { public List<Child> getMatches() {
if (matches == null) { if (matches == null) {
matches = new ArrayList<Child>(); matches = new ArrayList<>();
} }
return this.matches; return this.matches;
} }

View file

@ -37,7 +37,7 @@ public class Share {
*/ */
public List<Child> getEntries() { public List<Child> getEntries() {
if (entries == null) { if (entries == null) {
entries = new ArrayList<Child>(); entries = new ArrayList<>();
} }
return this.entries; return this.entries;
} }

View file

@ -28,7 +28,7 @@ public class Shares {
*/ */
public List<Share> getShares() { public List<Share> getShares() {
if (shares == null) { if (shares == null) {
shares = new ArrayList<Share>(); shares = new ArrayList<>();
} }
return this.shares; return this.shares;
} }

View file

@ -2,9 +2,6 @@ package com.cappielloantonio.play.subsonic.models;
import com.tickaroo.tikxml.annotation.Attribute; import com.tickaroo.tikxml.annotation.Attribute;
import com.tickaroo.tikxml.annotation.Xml; import com.tickaroo.tikxml.annotation.Xml;
import com.tickaroo.tikxml.converters.date.rfc3339.DateRfc3339TypeConverter;
import java.util.Date;
@Xml(name = "similarArtist") @Xml(name = "similarArtist")
public class SimilarArtistID3 { public class SimilarArtistID3 {

View file

@ -28,7 +28,7 @@ public class SimilarSongs {
*/ */
public List<Child> getSongs() { public List<Child> getSongs() {
if (songs == null) { if (songs == null) {
songs = new ArrayList<Child>(); songs = new ArrayList<>();
} }
return this.songs; return this.songs;
} }

View file

@ -30,7 +30,7 @@ public class Starred {
*/ */
public List<Artist> getArtists() { public List<Artist> getArtists() {
if (artists == null) { if (artists == null) {
artists = new ArrayList<Artist>(); artists = new ArrayList<>();
} }
return this.artists; return this.artists;
} }
@ -57,7 +57,7 @@ public class Starred {
*/ */
public List<Child> getAlbums() { public List<Child> getAlbums() {
if (albums == null) { if (albums == null) {
albums = new ArrayList<Child>(); albums = new ArrayList<>();
} }
return this.albums; return this.albums;
} }
@ -84,7 +84,7 @@ public class Starred {
*/ */
public List<Child> getSongs() { public List<Child> getSongs() {
if (songs == null) { if (songs == null) {
songs = new ArrayList<Child>(); songs = new ArrayList<>();
} }
return this.songs; return this.songs;
} }

View file

@ -46,7 +46,7 @@ public class User {
*/ */
public List<Integer> getFolders() { public List<Integer> getFolders() {
if (folders == null) { if (folders == null) {
folders = new ArrayList<Integer>(); folders = new ArrayList<>();
} }
return this.folders; return this.folders;
} }

View file

@ -28,7 +28,7 @@ public class Users {
*/ */
public List<User> getUsers() { public List<User> getUsers() {
if (users == null) { if (users == null) {
users = new ArrayList<User>(); users = new ArrayList<>();
} }
return this.users; return this.users;
} }

View file

@ -31,7 +31,7 @@ public class VideoInfo {
*/ */
public List<Captions> getCaptions() { public List<Captions> getCaptions() {
if (captions == null) { if (captions == null) {
captions = new ArrayList<Captions>(); captions = new ArrayList<>();
} }
return this.captions; return this.captions;
} }
@ -58,7 +58,7 @@ public class VideoInfo {
*/ */
public List<AudioTrack> getAudioTracks() { public List<AudioTrack> getAudioTracks() {
if (audioTracks == null) { if (audioTracks == null) {
audioTracks = new ArrayList<AudioTrack>(); audioTracks = new ArrayList<>();
} }
return this.audioTracks; return this.audioTracks;
} }
@ -85,7 +85,7 @@ public class VideoInfo {
*/ */
public List<VideoConversion> getConversions() { public List<VideoConversion> getConversions() {
if (conversions == null) { if (conversions == null) {
conversions = new ArrayList<VideoConversion>(); conversions = new ArrayList<>();
} }
return this.conversions; return this.conversions;
} }

View file

@ -28,7 +28,7 @@ public class Videos {
*/ */
public List<Child> getVideos() { public List<Child> getVideos() {
if (videos == null) { if (videos == null) {
videos = new ArrayList<Child>(); videos = new ArrayList<>();
} }
return this.videos; return this.videos;
} }

View file

@ -9,13 +9,13 @@ public class StringUtil {
try { try {
MessageDigest digest = java.security.MessageDigest.getInstance(MD5); MessageDigest digest = java.security.MessageDigest.getInstance(MD5);
digest.update(s.getBytes()); digest.update(s.getBytes());
byte messageDigest[] = digest.digest(); byte[] messageDigest = digest.digest();
StringBuilder hexString = new StringBuilder(); StringBuilder hexString = new StringBuilder();
for (byte aMessageDigest : messageDigest) { for (byte aMessageDigest : messageDigest) {
String h = Integer.toHexString(0xFF & aMessageDigest); StringBuilder h = new StringBuilder(Integer.toHexString(0xFF & aMessageDigest));
while (h.length() < 2) { while (h.length() < 2) {
h = "0" + h; h.insert(0, "0");
} }
hexString.append(h); hexString.append(h);
} }

View file

@ -6,7 +6,7 @@ import com.tickaroo.tikxml.TypeConverter;
public class ErrorCodeConverter implements TypeConverter<ErrorCode> { public class ErrorCodeConverter implements TypeConverter<ErrorCode> {
@Override @Override
public ErrorCode read(String value) throws Exception { public ErrorCode read(String value) throws Exception {
return new ErrorCode(Integer.valueOf(value)); return new ErrorCode(Integer.parseInt(value));
} }
@Override @Override

View file

@ -107,9 +107,7 @@ public class AlbumCatalogueFragment extends Fragment {
albumAdapter = new AlbumCatalogueAdapter(activity, requireContext()); albumAdapter = new AlbumCatalogueAdapter(activity, requireContext());
albumAdapter.setStateRestorationPolicy(RecyclerView.Adapter.StateRestorationPolicy.PREVENT_WHEN_EMPTY); albumAdapter.setStateRestorationPolicy(RecyclerView.Adapter.StateRestorationPolicy.PREVENT_WHEN_EMPTY);
bind.albumCatalogueRecyclerView.setAdapter(albumAdapter); bind.albumCatalogueRecyclerView.setAdapter(albumAdapter);
albumCatalogueViewModel.getAlbumList().observe(requireActivity(), albums -> { albumCatalogueViewModel.getAlbumList().observe(requireActivity(), albums -> albumAdapter.setItems(albums));
albumAdapter.setItems(albums);
});
bind.albumCatalogueRecyclerView.setOnTouchListener((v, event) -> { bind.albumCatalogueRecyclerView.setOnTouchListener((v, event) -> {
hideKeyboard(v); hideKeyboard(v);

View file

@ -84,9 +84,7 @@ public class AlbumListPageFragment extends Fragment {
activity.getSupportActionBar().setDisplayShowHomeEnabled(true); activity.getSupportActionBar().setDisplayShowHomeEnabled(true);
} }
bind.toolbar.setNavigationOnClickListener(v -> { bind.toolbar.setNavigationOnClickListener(v -> activity.navController.navigateUp());
activity.navController.navigateUp();
});
bind.appBarLayout.addOnOffsetChangedListener((appBarLayout, verticalOffset) -> { bind.appBarLayout.addOnOffsetChangedListener((appBarLayout, verticalOffset) -> {
if ((bind.albumInfoSector.getHeight() + verticalOffset) < (2 * ViewCompat.getMinimumHeight(bind.toolbar))) { if ((bind.albumInfoSector.getHeight() + verticalOffset) < (2 * ViewCompat.getMinimumHeight(bind.toolbar))) {

View file

@ -121,16 +121,14 @@ public class AlbumPageFragment extends Fragment {
} }
private void initAlbumInfoTextButton() { private void initAlbumInfoTextButton() {
bind.albumArtistLabel.setOnClickListener(v -> { bind.albumArtistLabel.setOnClickListener(v -> albumPageViewModel.getArtist().observe(requireActivity(), artist -> {
albumPageViewModel.getArtist().observe(requireActivity(), artist -> { if (artist != null) {
if (artist != null) { Bundle bundle = new Bundle();
Bundle bundle = new Bundle(); bundle.putParcelable("artist_object", artist);
bundle.putParcelable("artist_object", artist); activity.navController.navigate(R.id.action_albumPageFragment_to_artistPageFragment, bundle);
activity.navController.navigate(R.id.action_albumPageFragment_to_artistPageFragment, bundle); } else
} else Toast.makeText(requireContext(), "Error retrieving artist", Toast.LENGTH_SHORT).show();
Toast.makeText(requireContext(), "Error retrieving artist", Toast.LENGTH_SHORT).show(); }));
});
});
} }
private void initMusicButton() { private void initMusicButton() {
@ -181,8 +179,6 @@ public class AlbumPageFragment extends Fragment {
songHorizontalAdapter = new SongHorizontalAdapter(activity, requireContext(), false); songHorizontalAdapter = new SongHorizontalAdapter(activity, requireContext(), false);
bind.songRecyclerView.setAdapter(songHorizontalAdapter); bind.songRecyclerView.setAdapter(songHorizontalAdapter);
albumPageViewModel.getAlbumSongLiveList(requireActivity()).observe(requireActivity(), songs -> { albumPageViewModel.getAlbumSongLiveList(requireActivity()).observe(requireActivity(), songs -> songHorizontalAdapter.setItems(songs));
songHorizontalAdapter.setItems(songs);
});
} }
} }

View file

@ -107,9 +107,7 @@ public class ArtistCatalogueFragment extends Fragment {
artistAdapter = new ArtistCatalogueAdapter(activity, requireContext()); artistAdapter = new ArtistCatalogueAdapter(activity, requireContext());
artistAdapter.setStateRestorationPolicy(RecyclerView.Adapter.StateRestorationPolicy.PREVENT_WHEN_EMPTY); artistAdapter.setStateRestorationPolicy(RecyclerView.Adapter.StateRestorationPolicy.PREVENT_WHEN_EMPTY);
bind.artistCatalogueRecyclerView.setAdapter(artistAdapter); bind.artistCatalogueRecyclerView.setAdapter(artistAdapter);
artistCatalogueViewModel.getArtistList().observe(requireActivity(), artistList -> { artistCatalogueViewModel.getArtistList().observe(requireActivity(), artistList -> artistAdapter.setItems(artistList));
artistAdapter.setItems(artistList);
});
bind.artistCatalogueRecyclerView.setOnTouchListener((v, event) -> { bind.artistCatalogueRecyclerView.setOnTouchListener((v, event) -> {
hideKeyboard(v); hideKeyboard(v);

View file

@ -70,9 +70,7 @@ public class ArtistListPageFragment extends Fragment {
activity.getSupportActionBar().setDisplayShowHomeEnabled(true); activity.getSupportActionBar().setDisplayShowHomeEnabled(true);
} }
bind.toolbar.setNavigationOnClickListener(v -> { bind.toolbar.setNavigationOnClickListener(v -> activity.navController.navigateUp());
activity.navController.navigateUp();
});
bind.appBarLayout.addOnOffsetChangedListener((appBarLayout, verticalOffset) -> { bind.appBarLayout.addOnOffsetChangedListener((appBarLayout, verticalOffset) -> {
if ((bind.artistInfoSector.getHeight() + verticalOffset) < (2 * ViewCompat.getMinimumHeight(bind.toolbar))) { if ((bind.artistInfoSector.getHeight() + verticalOffset) < (2 * ViewCompat.getMinimumHeight(bind.toolbar))) {

View file

@ -1,7 +1,6 @@
package com.cappielloantonio.play.ui.fragment; package com.cappielloantonio.play.ui.fragment;
import android.os.Bundle; import android.os.Bundle;
import android.text.Html;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
@ -77,9 +76,7 @@ public class FilterFragment extends Fragment {
activity.getSupportActionBar().setDisplayShowHomeEnabled(true); activity.getSupportActionBar().setDisplayShowHomeEnabled(true);
} }
bind.toolbar.setNavigationOnClickListener(v -> { bind.toolbar.setNavigationOnClickListener(v -> activity.navController.navigateUp());
activity.navController.navigateUp();
});
bind.appBarLayout.addOnOffsetChangedListener((appBarLayout, verticalOffset) -> { bind.appBarLayout.addOnOffsetChangedListener((appBarLayout, verticalOffset) -> {

View file

@ -114,9 +114,7 @@ public class GenreCatalogueFragment extends Fragment {
activity.navController.navigate(R.id.action_genreCatalogueFragment_to_songListPageFragment, bundle); activity.navController.navigate(R.id.action_genreCatalogueFragment_to_songListPageFragment, bundle);
}); });
genreCatalogueViewModel.getGenreList().observe(requireActivity(), genres -> { genreCatalogueViewModel.getGenreList().observe(requireActivity(), genres -> genreCatalogueAdapter.setItems(genres));
genreCatalogueAdapter.setItems(genres);
});
bind.genreCatalogueRecyclerView.setOnTouchListener((v, event) -> { bind.genreCatalogueRecyclerView.setOnTouchListener((v, event) -> {
hideKeyboard(v); hideKeyboard(v);

View file

@ -1,6 +1,5 @@
package com.cappielloantonio.play.ui.fragment; package com.cappielloantonio.play.ui.fragment;
import android.graphics.Color;
import android.os.Bundle; import android.os.Bundle;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.Menu; import android.view.Menu;
@ -11,7 +10,6 @@ import android.view.ViewGroup;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.core.content.ContextCompat;
import androidx.core.view.ViewCompat; import androidx.core.view.ViewCompat;
import androidx.fragment.app.Fragment; import androidx.fragment.app.Fragment;
import androidx.lifecycle.ViewModelProvider; import androidx.lifecycle.ViewModelProvider;
@ -27,8 +25,8 @@ import com.cappielloantonio.play.adapter.AlbumHorizontalAdapter;
import com.cappielloantonio.play.adapter.ArtistHorizontalAdapter; import com.cappielloantonio.play.adapter.ArtistHorizontalAdapter;
import com.cappielloantonio.play.adapter.DiscoverSongAdapter; import com.cappielloantonio.play.adapter.DiscoverSongAdapter;
import com.cappielloantonio.play.adapter.SimilarTrackAdapter; import com.cappielloantonio.play.adapter.SimilarTrackAdapter;
import com.cappielloantonio.play.adapter.TrackAdapter;
import com.cappielloantonio.play.adapter.SongHorizontalAdapter; import com.cappielloantonio.play.adapter.SongHorizontalAdapter;
import com.cappielloantonio.play.adapter.TrackAdapter;
import com.cappielloantonio.play.adapter.YearAdapter; import com.cappielloantonio.play.adapter.YearAdapter;
import com.cappielloantonio.play.databinding.FragmentHomeBinding; import com.cappielloantonio.play.databinding.FragmentHomeBinding;
import com.cappielloantonio.play.helper.recyclerview.CustomLinearSnapHelper; import com.cappielloantonio.play.helper.recyclerview.CustomLinearSnapHelper;
@ -37,9 +35,6 @@ import com.cappielloantonio.play.model.Album;
import com.cappielloantonio.play.model.Artist; import com.cappielloantonio.play.model.Artist;
import com.cappielloantonio.play.model.Song; import com.cappielloantonio.play.model.Song;
import com.cappielloantonio.play.ui.activity.MainActivity; import com.cappielloantonio.play.ui.activity.MainActivity;
import com.cappielloantonio.play.util.DownloadUtil;
import com.cappielloantonio.play.util.MappingUtil;
import com.cappielloantonio.play.util.MusicUtil;
import com.cappielloantonio.play.util.UIUtil; import com.cappielloantonio.play.util.UIUtil;
import com.cappielloantonio.play.viewmodel.HomeViewModel; import com.cappielloantonio.play.viewmodel.HomeViewModel;
@ -345,7 +340,8 @@ public class HomeFragment extends Fragment {
} else { } else {
if (bind != null) bind.homeStarredTracksPlaceholder.placeholder.setVisibility(View.GONE); if (bind != null) bind.homeStarredTracksPlaceholder.placeholder.setVisibility(View.GONE);
if (bind != null) bind.homeStarredTracksSector.setVisibility(!songs.isEmpty() ? View.VISIBLE : View.GONE); if (bind != null) bind.homeStarredTracksSector.setVisibility(!songs.isEmpty() ? View.VISIBLE : View.GONE);
if (bind != null) bind.starredTracksRecyclerView.setLayoutManager(new GridLayoutManager(requireContext(), UIUtil.getSpanCount(songs.size(), 5), GridLayoutManager.HORIZONTAL, false)); if (bind != null)
bind.starredTracksRecyclerView.setLayoutManager(new GridLayoutManager(requireContext(), UIUtil.getSpanCount(songs.size(), 5), GridLayoutManager.HORIZONTAL, false));
starredSongAdapter.setItems(songs); starredSongAdapter.setItems(songs);
} }
@ -376,7 +372,8 @@ public class HomeFragment extends Fragment {
} else { } else {
if (bind != null) bind.homeStarredAlbumsPlaceholder.placeholder.setVisibility(View.GONE); if (bind != null) bind.homeStarredAlbumsPlaceholder.placeholder.setVisibility(View.GONE);
if (bind != null) bind.homeStarredAlbumsSector.setVisibility(!albums.isEmpty() ? View.VISIBLE : View.GONE); if (bind != null) bind.homeStarredAlbumsSector.setVisibility(!albums.isEmpty() ? View.VISIBLE : View.GONE);
if (bind != null) bind.starredAlbumsRecyclerView.setLayoutManager(new GridLayoutManager(requireContext(), UIUtil.getSpanCount(albums.size(), 5), GridLayoutManager.HORIZONTAL, false)); if (bind != null)
bind.starredAlbumsRecyclerView.setLayoutManager(new GridLayoutManager(requireContext(), UIUtil.getSpanCount(albums.size(), 5), GridLayoutManager.HORIZONTAL, false));
starredAlbumAdapter.setItems(albums); starredAlbumAdapter.setItems(albums);
} }
@ -407,7 +404,8 @@ public class HomeFragment extends Fragment {
} else { } else {
if (bind != null) bind.homeStarredArtistsPlaceholder.placeholder.setVisibility(View.GONE); if (bind != null) bind.homeStarredArtistsPlaceholder.placeholder.setVisibility(View.GONE);
if (bind != null) bind.homeStarredArtistsSector.setVisibility(!artists.isEmpty() ? View.VISIBLE : View.GONE); if (bind != null) bind.homeStarredArtistsSector.setVisibility(!artists.isEmpty() ? View.VISIBLE : View.GONE);
if (bind != null) bind.starredArtistsRecyclerView.setLayoutManager(new GridLayoutManager(requireContext(), UIUtil.getSpanCount(artists.size(), 5), GridLayoutManager.HORIZONTAL, false)); if (bind != null)
bind.starredArtistsRecyclerView.setLayoutManager(new GridLayoutManager(requireContext(), UIUtil.getSpanCount(artists.size(), 5), GridLayoutManager.HORIZONTAL, false));
starredArtistAdapter.setItems(artists); starredArtistAdapter.setItems(artists);
} }

View file

@ -1,6 +1,5 @@
package com.cappielloantonio.play.ui.fragment; package com.cappielloantonio.play.ui.fragment;
import android.graphics.Color;
import android.os.Bundle; import android.os.Bundle;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.Menu; import android.view.Menu;
@ -14,9 +13,7 @@ import androidx.annotation.Nullable;
import androidx.core.view.ViewCompat; import androidx.core.view.ViewCompat;
import androidx.fragment.app.Fragment; import androidx.fragment.app.Fragment;
import androidx.lifecycle.ViewModelProvider; import androidx.lifecycle.ViewModelProvider;
import androidx.recyclerview.widget.ItemTouchHelper;
import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.cappielloantonio.play.R; import com.cappielloantonio.play.R;
import com.cappielloantonio.play.adapter.ServerAdapter; import com.cappielloantonio.play.adapter.ServerAdapter;
@ -25,8 +22,6 @@ import com.cappielloantonio.play.ui.activity.MainActivity;
import com.cappielloantonio.play.ui.fragment.dialog.ServerSignupDialog; import com.cappielloantonio.play.ui.fragment.dialog.ServerSignupDialog;
import com.cappielloantonio.play.viewmodel.LoginViewModel; import com.cappielloantonio.play.viewmodel.LoginViewModel;
import java.util.Collections;
public class LoginFragment extends Fragment { public class LoginFragment extends Fragment {
private static final String TAG = "LoginFragment"; private static final String TAG = "LoginFragment";
@ -88,12 +83,11 @@ public class LoginFragment extends Fragment {
serverAdapter = new ServerAdapter(activity, requireContext()); serverAdapter = new ServerAdapter(activity, requireContext());
bind.serverListRecyclerView.setAdapter(serverAdapter); bind.serverListRecyclerView.setAdapter(serverAdapter);
loginViewModel.getServerList().observe(requireActivity(), servers -> { loginViewModel.getServerList().observe(requireActivity(), servers -> {
if(servers.size() > 0) { if (servers.size() > 0) {
if (bind != null) bind.noServerAddedTextView.setVisibility(View.GONE); if (bind != null) bind.noServerAddedTextView.setVisibility(View.GONE);
if (bind != null) bind.serverListRecyclerView.setVisibility(View.VISIBLE); if (bind != null) bind.serverListRecyclerView.setVisibility(View.VISIBLE);
serverAdapter.setItems(servers); serverAdapter.setItems(servers);
} } else {
else {
if (bind != null) bind.noServerAddedTextView.setVisibility(View.VISIBLE); if (bind != null) bind.noServerAddedTextView.setVisibility(View.VISIBLE);
if (bind != null) bind.serverListRecyclerView.setVisibility(View.GONE); if (bind != null) bind.serverListRecyclerView.setVisibility(View.GONE);
} }
@ -102,13 +96,10 @@ public class LoginFragment extends Fragment {
@Override @Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) { public boolean onOptionsItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()) { if (item.getItemId() == R.id.action_add) {
case R.id.action_add: ServerSignupDialog dialog = new ServerSignupDialog();
ServerSignupDialog dialog = new ServerSignupDialog(); dialog.show(activity.getSupportFragmentManager(), null);
dialog.show(activity.getSupportFragmentManager(), null); return true;
return true;
default:
break;
} }
return false; return false;

View file

@ -37,6 +37,7 @@ import com.cappielloantonio.play.util.PreferenceUtil;
import com.cappielloantonio.play.viewmodel.PlayerBottomSheetViewModel; import com.cappielloantonio.play.viewmodel.PlayerBottomSheetViewModel;
import java.util.Collections; import java.util.Collections;
import java.util.Objects;
public class PlayerBottomSheetFragment extends Fragment implements MusicServiceEventListener, MusicProgressViewUpdateHelper.Callback { public class PlayerBottomSheetFragment extends Fragment implements MusicServiceEventListener, MusicProgressViewUpdateHelper.Callback {
private static final String TAG = "PlayerBottomSheetFragment"; private static final String TAG = "PlayerBottomSheetFragment";
@ -166,7 +167,7 @@ public class PlayerBottomSheetFragment extends Fragment implements MusicServiceE
int toPosition = -1; int toPosition = -1;
@Override @Override
public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) { public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder target) {
if (originalPosition == -1) if (originalPosition == -1)
originalPosition = viewHolder.getBindingAdapterPosition(); originalPosition = viewHolder.getBindingAdapterPosition();
@ -185,7 +186,7 @@ public class PlayerBottomSheetFragment extends Fragment implements MusicServiceE
*/ */
Collections.swap(playerSongQueueAdapter.getItems(), fromPosition, toPosition); Collections.swap(playerSongQueueAdapter.getItems(), fromPosition, toPosition);
recyclerView.getAdapter().notifyItemMoved(fromPosition, toPosition); Objects.requireNonNull(recyclerView.getAdapter()).notifyItemMoved(fromPosition, toPosition);
return false; return false;
} }
@ -212,7 +213,7 @@ public class PlayerBottomSheetFragment extends Fragment implements MusicServiceE
if (!(viewHolder.getBindingAdapterPosition() == MusicPlayerRemote.getPosition()) && !(MusicPlayerRemote.getPlayingQueue().size() <= 1)) { if (!(viewHolder.getBindingAdapterPosition() == MusicPlayerRemote.getPosition()) && !(MusicPlayerRemote.getPlayingQueue().size() <= 1)) {
MusicPlayerRemote.removeFromQueue(viewHolder.getBindingAdapterPosition()); MusicPlayerRemote.removeFromQueue(viewHolder.getBindingAdapterPosition());
playerBottomSheetViewModel.removeSong(viewHolder.getBindingAdapterPosition()); playerBottomSheetViewModel.removeSong(viewHolder.getBindingAdapterPosition());
bodyBind.playerQueueRecyclerView.getAdapter().notifyItemRemoved(viewHolder.getBindingAdapterPosition()); Objects.requireNonNull(bodyBind.playerQueueRecyclerView.getAdapter()).notifyItemRemoved(viewHolder.getBindingAdapterPosition());
bodyBind.playerSongCoverViewPager.setCurrentItem(MusicPlayerRemote.getPosition(), false); bodyBind.playerSongCoverViewPager.setCurrentItem(MusicPlayerRemote.getPosition(), false);
} else { } else {
bodyBind.playerQueueRecyclerView.getAdapter().notifyDataSetChanged(); bodyBind.playerQueueRecyclerView.getAdapter().notifyDataSetChanged();
@ -271,11 +272,6 @@ public class PlayerBottomSheetFragment extends Fragment implements MusicServiceE
} }
private void setViewPageDelayed(int position) { private void setViewPageDelayed(int position) {
/*bodyBind.playerSongCoverViewPager.post(() -> {
int restoredPosition = PreferenceManager.getDefaultSharedPreferences(requireContext()).getInt(PreferenceUtil.POSITION, -1);
bodyBind.playerSongCoverViewPager.setCurrentItem(restoredPosition, true);
});*/
final Handler handler = new Handler(); final Handler handler = new Handler();
final Runnable r = () -> { final Runnable r = () -> {
if (bind != null) bodyBind.playerSongCoverViewPager.setCurrentItem(position, false); if (bind != null) bodyBind.playerSongCoverViewPager.setCurrentItem(position, false);
@ -308,7 +304,7 @@ public class PlayerBottomSheetFragment extends Fragment implements MusicServiceE
} }
public View getPlayerHeader() { public View getPlayerHeader() {
return getView().findViewById(R.id.player_header_layout); return requireView().findViewById(R.id.player_header_layout);
} }
public void scrollOnTop() { public void scrollOnTop() {
@ -322,7 +318,7 @@ public class PlayerBottomSheetFragment extends Fragment implements MusicServiceE
@Override @Override
public void onServiceConnected() { public void onServiceConnected() {
setSongInfo(MusicPlayerRemote.getCurrentSong()); setSongInfo(Objects.requireNonNull(MusicPlayerRemote.getCurrentSong()));
updatePlayPauseState(); updatePlayPauseState();
} }
@ -339,7 +335,7 @@ public class PlayerBottomSheetFragment extends Fragment implements MusicServiceE
@Override @Override
public void onPlayMetadataChanged() { public void onPlayMetadataChanged() {
setViewPageDelayed(MusicPlayerRemote.getPosition()); setViewPageDelayed(MusicPlayerRemote.getPosition());
setSongInfo(MusicPlayerRemote.getCurrentSong()); setSongInfo(Objects.requireNonNull(MusicPlayerRemote.getCurrentSong()));
} }
@Override @Override

View file

@ -107,9 +107,7 @@ public class PlaylistCatalogueFragment extends Fragment {
playlistCatalogueAdapter = new PlaylistCatalogueAdapter(activity, requireContext(), playlistCatalogueViewModel.getType().equals(Playlist.DOWNLOADED)); playlistCatalogueAdapter = new PlaylistCatalogueAdapter(activity, requireContext(), playlistCatalogueViewModel.getType().equals(Playlist.DOWNLOADED));
bind.playlistCatalogueRecyclerView.setAdapter(playlistCatalogueAdapter); bind.playlistCatalogueRecyclerView.setAdapter(playlistCatalogueAdapter);
playlistCatalogueViewModel.getPlaylistList(requireActivity()).observe(requireActivity(), playlist -> { playlistCatalogueViewModel.getPlaylistList(requireActivity()).observe(requireActivity(), playlist -> playlistCatalogueAdapter.setItems(playlist));
playlistCatalogueAdapter.setItems(playlist);
});
bind.playlistCatalogueRecyclerView.setOnTouchListener((v, event) -> { bind.playlistCatalogueRecyclerView.setOnTouchListener((v, event) -> {
hideKeyboard(v); hideKeyboard(v);

View file

@ -33,6 +33,7 @@ import com.google.android.material.bottomsheet.BottomSheetDialogFragment;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collections;
import java.util.List; import java.util.List;
public class SongBottomSheetDialog extends BottomSheetDialogFragment implements View.OnClickListener { public class SongBottomSheetDialog extends BottomSheetDialogFragment implements View.OnClickListener {
@ -146,13 +147,13 @@ public class SongBottomSheetDialog extends BottomSheetDialogFragment implements
TextView download = view.findViewById(R.id.download_text_view); TextView download = view.findViewById(R.id.download_text_view);
download.setOnClickListener(v -> { download.setOnClickListener(v -> {
DownloadUtil.getDownloadTracker(requireContext()).download(Arrays.asList(song), null, null); DownloadUtil.getDownloadTracker(requireContext()).download(Collections.singletonList(song), null, null);
dismissBottomSheet(); dismissBottomSheet();
}); });
TextView remove = view.findViewById(R.id.remove_text_view); TextView remove = view.findViewById(R.id.remove_text_view);
remove.setOnClickListener(v -> { remove.setOnClickListener(v -> {
DownloadUtil.getDownloadTracker(requireContext()).remove(Arrays.asList(song)); DownloadUtil.getDownloadTracker(requireContext()).remove(Collections.singletonList(song));
dismissBottomSheet(); dismissBottomSheet();
}); });
@ -171,32 +172,28 @@ public class SongBottomSheetDialog extends BottomSheetDialogFragment implements
}); });
TextView goToAlbum = view.findViewById(R.id.go_to_album_text_view); TextView goToAlbum = view.findViewById(R.id.go_to_album_text_view);
goToAlbum.setOnClickListener(v -> { goToAlbum.setOnClickListener(v -> songBottomSheetViewModel.getAlbum().observe(requireActivity(), album -> {
songBottomSheetViewModel.getAlbum().observe(requireActivity(), album -> { if (album != null) {
if (album != null) { Bundle bundle = new Bundle();
Bundle bundle = new Bundle(); bundle.putParcelable("album_object", album);
bundle.putParcelable("album_object", album); NavHostFragment.findNavController(this).navigate(R.id.albumPageFragment, bundle);
NavHostFragment.findNavController(this).navigate(R.id.albumPageFragment, bundle); } else
} else Toast.makeText(requireContext(), "Error retrieving album", Toast.LENGTH_SHORT).show();
Toast.makeText(requireContext(), "Error retrieving album", Toast.LENGTH_SHORT).show();
dismissBottomSheet(); dismissBottomSheet();
}); }));
});
TextView goToArtist = view.findViewById(R.id.go_to_artist_text_view); TextView goToArtist = view.findViewById(R.id.go_to_artist_text_view);
goToArtist.setOnClickListener(v -> { goToArtist.setOnClickListener(v -> songBottomSheetViewModel.getArtist().observe(requireActivity(), artist -> {
songBottomSheetViewModel.getArtist().observe(requireActivity(), artist -> { if (artist != null) {
if (artist != null) { Bundle bundle = new Bundle();
Bundle bundle = new Bundle(); bundle.putParcelable("artist_object", artist);
bundle.putParcelable("artist_object", artist); NavHostFragment.findNavController(this).navigate(R.id.artistPageFragment, bundle);
NavHostFragment.findNavController(this).navigate(R.id.artistPageFragment, bundle); } else
} else Toast.makeText(requireContext(), "Error retrieving artist", Toast.LENGTH_SHORT).show();
Toast.makeText(requireContext(), "Error retrieving artist", Toast.LENGTH_SHORT).show();
dismissBottomSheet(); dismissBottomSheet();
}); }));
});
} }
@Override @Override

View file

@ -108,9 +108,7 @@ public class PlaylistEditorDialog extends DialogFragment {
playlistDialogSongHorizontalAdapter = new PlaylistDialogSongHorizontalAdapter(requireContext()); playlistDialogSongHorizontalAdapter = new PlaylistDialogSongHorizontalAdapter(requireContext());
bind.playlistSongRecyclerView.setAdapter(playlistDialogSongHorizontalAdapter); bind.playlistSongRecyclerView.setAdapter(playlistDialogSongHorizontalAdapter);
playlistEditorViewModel.getPlaylistSongLiveList().observe(requireActivity(), songs -> { playlistEditorViewModel.getPlaylistSongLiveList().observe(requireActivity(), songs -> playlistDialogSongHorizontalAdapter.setItems(songs));
playlistDialogSongHorizontalAdapter.setItems(songs);
});
new ItemTouchHelper(new ItemTouchHelper.SimpleCallback(ItemTouchHelper.UP | ItemTouchHelper.DOWN, ItemTouchHelper.LEFT) { new ItemTouchHelper(new ItemTouchHelper.SimpleCallback(ItemTouchHelper.UP | ItemTouchHelper.DOWN, ItemTouchHelper.LEFT) {
int originalPosition = -1; int originalPosition = -1;
@ -118,7 +116,7 @@ public class PlaylistEditorDialog extends DialogFragment {
int toPosition = -1; int toPosition = -1;
@Override @Override
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) { public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder target) {
if (originalPosition == -1) if (originalPosition == -1)
originalPosition = viewHolder.getBindingAdapterPosition(); originalPosition = viewHolder.getBindingAdapterPosition();
@ -147,16 +145,16 @@ public class PlaylistEditorDialog extends DialogFragment {
} }
@Override @Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) { public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) {
playlistEditorViewModel.removeFromPlaylistSongLiveList(viewHolder.getBindingAdapterPosition()); playlistEditorViewModel.removeFromPlaylistSongLiveList(viewHolder.getBindingAdapterPosition());
bind.playlistSongRecyclerView.getAdapter().notifyItemRemoved(viewHolder.getBindingAdapterPosition()); Objects.requireNonNull(bind.playlistSongRecyclerView.getAdapter()).notifyItemRemoved(viewHolder.getBindingAdapterPosition());
} }
} }
).attachToRecyclerView(bind.playlistSongRecyclerView); ).attachToRecyclerView(bind.playlistSongRecyclerView);
} }
private boolean validateInput() { private boolean validateInput() {
playlistName = bind.playlistNameTextView.getText().toString().trim(); playlistName = Objects.requireNonNull(bind.playlistNameTextView.getText()).toString().trim();
if (TextUtils.isEmpty(playlistName)) { if (TextUtils.isEmpty(playlistName)) {
bind.playlistNameTextView.setError("Required"); bind.playlistNameTextView.setError("Required");

View file

@ -32,9 +32,7 @@ public class RatingDialog extends DialogFragment {
builder.setView(bind.getRoot()) builder.setView(bind.getRoot())
.setTitle("Rate") .setTitle("Rate")
.setNegativeButton("Cancel", (dialog, id) -> dialog.cancel()) .setNegativeButton("Cancel", (dialog, id) -> dialog.cancel())
.setPositiveButton("Save", (dialog, id) -> { .setPositiveButton("Save", (dialog, id) -> ratingViewModel.rate((int) bind.ratingBar.getRating()));
ratingViewModel.rate((int) bind.ratingBar.getRating());
});
return builder.create(); return builder.create();
} }

View file

@ -17,9 +17,7 @@ import com.cappielloantonio.play.subsonic.models.Genre;
import com.cappielloantonio.play.subsonic.models.SimilarArtistID3; import com.cappielloantonio.play.subsonic.models.SimilarArtistID3;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.stream.Collectors;
public class MappingUtil { public class MappingUtil {
public static ArrayList<Song> mapSong(List<Child> children) { public static ArrayList<Song> mapSong(List<Child> children) {
@ -111,7 +109,7 @@ public class MappingUtil {
for (Download download : downloads) { for (Download download : downloads) {
Song song = new Song(download); Song song = new Song(download);
if(!songs.contains(song)) { if (!songs.contains(song)) {
songs.add(song); songs.add(song);
} }
} }
@ -124,7 +122,7 @@ public class MappingUtil {
for (Download download : downloads) { for (Download download : downloads) {
Album album = new Album(download); Album album = new Album(download);
if(!albums.contains(album)) { if (!albums.contains(album)) {
albums.add(album); albums.add(album);
} }
} }
@ -137,7 +135,7 @@ public class MappingUtil {
for (Download download : downloads) { for (Download download : downloads) {
Artist artist = new Artist(download); Artist artist = new Artist(download);
if(!artists.contains(artist)) { if (!artists.contains(artist)) {
artists.add(artist); artists.add(artist);
} }
} }

View file

@ -9,11 +9,9 @@ import com.cappielloantonio.play.model.Song;
import com.google.android.exoplayer2.MediaItem; import com.google.android.exoplayer2.MediaItem;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays;
import java.util.List; import java.util.List;
import java.util.Locale; import java.util.Locale;
import java.util.Map; import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern; import java.util.regex.Pattern;
public class MusicUtil { public class MusicUtil {
@ -76,8 +74,8 @@ public class MusicUtil {
public static String normalizedArtistName(String string) { public static String normalizedArtistName(String string) {
if (string != null) { if (string != null) {
if(string.toLowerCase().contains(" feat.")) return Pattern.compile(" feat.", Pattern.CASE_INSENSITIVE).split(string)[0].trim(); if (string.toLowerCase().contains(" feat.")) return Pattern.compile(" feat.", Pattern.CASE_INSENSITIVE).split(string)[0].trim();
else if(string.toLowerCase().contains(" featuring")) return Pattern.compile(" featuring", Pattern.CASE_INSENSITIVE).split(string)[0].trim(); else if (string.toLowerCase().contains(" featuring")) return Pattern.compile(" featuring", Pattern.CASE_INSENSITIVE).split(string)[0].trim();
else return string; else return string;
} }

View file

@ -8,7 +8,6 @@ import androidx.lifecycle.AndroidViewModel;
import androidx.lifecycle.LiveData; import androidx.lifecycle.LiveData;
import androidx.lifecycle.MutableLiveData; import androidx.lifecycle.MutableLiveData;
import com.cappielloantonio.play.model.Album;
import com.cappielloantonio.play.model.Playlist; import com.cappielloantonio.play.model.Playlist;
import com.cappielloantonio.play.repository.DownloadRepository; import com.cappielloantonio.play.repository.DownloadRepository;
import com.cappielloantonio.play.repository.PlaylistRepository; import com.cappielloantonio.play.repository.PlaylistRepository;

View file

@ -8,7 +8,6 @@ import androidx.lifecycle.AndroidViewModel;
import androidx.lifecycle.LiveData; import androidx.lifecycle.LiveData;
import androidx.lifecycle.MutableLiveData; import androidx.lifecycle.MutableLiveData;
import com.cappielloantonio.play.model.Album;
import com.cappielloantonio.play.model.Playlist; import com.cappielloantonio.play.model.Playlist;
import com.cappielloantonio.play.model.Song; import com.cappielloantonio.play.model.Song;
import com.cappielloantonio.play.repository.DownloadRepository; import com.cappielloantonio.play.repository.DownloadRepository;
@ -36,8 +35,7 @@ public class PlaylistPageViewModel extends AndroidViewModel {
public LiveData<List<Song>> getPlaylistSongLiveList(FragmentActivity activity) { public LiveData<List<Song>> getPlaylistSongLiveList(FragmentActivity activity) {
if (isOffline) { if (isOffline) {
downloadRepository.getLiveDownloadFromPlaylist(playlist.getId()).observe(activity, downloads -> playlistSongLiveList.postValue(MappingUtil.mapDownloadToSong(downloads))); downloadRepository.getLiveDownloadFromPlaylist(playlist.getId()).observe(activity, downloads -> playlistSongLiveList.postValue(MappingUtil.mapDownloadToSong(downloads)));
} } else {
else {
playlistSongLiveList = playlistRepository.getPlaylistSongs(playlist.getId()); playlistSongLiveList = playlistRepository.getPlaylistSongs(playlist.getId());
} }

View file

@ -75,14 +75,10 @@ public class SongListPageViewModel extends AndroidViewModel {
songList = songRepository.getStarredSongs(false, -1); songList = songRepository.getStarredSongs(false, -1);
break; break;
case Song.DOWNLOADED: case Song.DOWNLOADED:
downloadRepository.getLiveDownload().observe(activity, downloads -> { downloadRepository.getLiveDownload().observe(activity, downloads -> songList.setValue(MappingUtil.mapDownloadToSong(downloads)));
songList.setValue(MappingUtil.mapDownloadToSong(downloads));
});
break; break;
case Song.FROM_ALBUM: case Song.FROM_ALBUM:
downloadRepository.getLiveDownloadFromAlbum(album.getId()).observe(activity, downloads -> { downloadRepository.getLiveDownloadFromAlbum(album.getId()).observe(activity, downloads -> songList.setValue(MappingUtil.mapDownloadToSong(downloads)));
songList.setValue(MappingUtil.mapDownloadToSong(downloads));
});
break; break;
} }