Skip to content
Open
Original file line number Diff line number Diff line change
Expand Up @@ -10,4 +10,6 @@ import kotlinx.parcelize.Parcelize
class ArtistWithAlbumsID3(
@SerializedName("album")
var albums: List<AlbumID3>? = null,
@SerializedName("appearsOn")
var appearsOn: List<AlbumID3>? = null,
) : ArtistID3(), Parcelable
Original file line number Diff line number Diff line change
Expand Up @@ -3,20 +3,23 @@
import android.content.Context;
import android.content.Intent;
import android.content.res.Configuration;
import android.graphics.Rect;
import android.content.IntentFilter;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.text.TextUtils;
import android.util.Log;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;

import androidx.annotation.NonNull;
import androidx.core.splashscreen.SplashScreen;
import androidx.core.view.WindowCompat;
import androidx.core.view.WindowInsetsCompat;
import androidx.core.view.WindowInsetsControllerCompat;
import androidx.drawerlayout.widget.DrawerLayout;
import androidx.fragment.app.FragmentManager;
import androidx.lifecycle.ViewModelProvider;
import androidx.media3.common.MediaItem;
Expand Down Expand Up @@ -48,6 +51,7 @@
import com.google.android.material.bottomnavigation.BottomNavigationView;
import com.google.android.material.bottomsheet.BottomSheetBehavior;
import com.google.android.material.color.DynamicColors;
import com.google.android.material.navigation.NavigationView;
import com.google.common.util.concurrent.MoreExecutors;

import java.util.Objects;
Expand All @@ -63,9 +67,12 @@ public class MainActivity extends BaseActivity {
private FragmentManager fragmentManager;
private NavHostFragment navHostFragment;
private BottomNavigationView bottomNavigationView;
private FrameLayout bottomNavigationViewFrame;
public NavController navController;
private DrawerLayout drawerLayout;
private NavigationView navigationView;
private BottomSheetBehavior bottomSheetBehavior;
private boolean isLandscape = false;
public boolean isLandscape = false;
private AssetLinkNavigator assetLinkNavigator;
private AssetLinkUtil.AssetLink pendingAssetLink;

Expand Down Expand Up @@ -111,6 +118,7 @@ protected void onStart() {
protected void onResume() {
super.onResume();
pingServer();
toggleNavigationDrawerLockOnOrientationChange();
}

@Override
Expand Down Expand Up @@ -148,14 +156,8 @@ public void init() {
goToLogin();
}

// Set bottom navigation height
if (isLandscape) {
ViewGroup.LayoutParams layoutParams = bottomNavigationView.getLayoutParams();
Rect windowRect = new Rect();
bottomNavigationView.getWindowVisibleDisplayFrame(windowRect);
layoutParams.width = windowRect.height();
bottomNavigationView.setLayoutParams(layoutParams);
}
toggleNavigationDrawerLockOnOrientationChange();

}

// BOTTOM SHEET/NAVIGATION
Expand Down Expand Up @@ -259,8 +261,12 @@ private void animateBottomNavigation(float slideOffset, int navigationHeight) {

private void initNavigation() {
bottomNavigationView = findViewById(R.id.bottom_navigation);
bottomNavigationViewFrame = findViewById(R.id.bottom_navigation_frame);
navHostFragment = (NavHostFragment) fragmentManager.findFragmentById(R.id.nav_host_fragment);
navController = Objects.requireNonNull(navHostFragment).getNavController();
// This is the lateral slide-in drawer
drawerLayout = findViewById(R.id.drawer_layout);
navigationView = findViewById(R.id.nav_view);

/*
* In questo modo intercetto il cambio schermata tramite navbar e se il bottom sheet è aperto,
Expand All @@ -277,16 +283,90 @@ private void initNavigation() {
});

NavigationUI.setupWithNavController(bottomNavigationView, navController);
NavigationUI.setupWithNavController(navigationView, navController);
}

public void setBottomNavigationBarVisibility(boolean visibility) {
if (visibility) {
bottomNavigationView.setVisibility(View.VISIBLE);
bottomNavigationViewFrame.setVisibility(View.VISIBLE);
} else {
bottomNavigationView.setVisibility(View.GONE);
bottomNavigationViewFrame.setVisibility(View.GONE);
}
}

public void toggleBottomNavigationBarVisibilityOnOrientationChange() {
// Ignore orientation change, bottom navbar always hidden
if (Preferences.getHideBottomNavbarOnPortrait()) {
setBottomNavigationBarVisibility(false);
setPortraitPlayerBottomSheetPeekHeight(56);
setSystemBarsVisibility(!isLandscape);
return;
}

if (!isLandscape) {
// Show app navbar + show system bars
setPortraitPlayerBottomSheetPeekHeight(136);
setBottomNavigationBarVisibility(true);
setSystemBarsVisibility(true);
} else {
// Hide app navbar + hide system bars
setPortraitPlayerBottomSheetPeekHeight(56);
setBottomNavigationBarVisibility(false);
setSystemBarsVisibility(false);
}
}

public void setNavigationDrawerLock(boolean locked) {
int mode = locked
? DrawerLayout.LOCK_MODE_LOCKED_CLOSED
: DrawerLayout.LOCK_MODE_UNLOCKED;
drawerLayout.setDrawerLockMode(mode);
}

public void toggleNavigationDrawerLockOnOrientationChange() {
// Ignore orientation check, drawer always unlocked
if (Preferences.getEnableDrawerOnPortrait()) {
setNavigationDrawerLock(false);
return;
}
if (!isLandscape) {
setNavigationDrawerLock(true);
} else {
setNavigationDrawerLock(false);
}
}

public void setSystemBarsVisibility(boolean visibility) {
WindowInsetsControllerCompat insetsController;
View decorView = getWindow().getDecorView();
insetsController = new WindowInsetsControllerCompat(getWindow(), decorView);

if (visibility) {
WindowCompat.setDecorFitsSystemWindows(getWindow(), true);
insetsController.show(WindowInsetsCompat.Type.navigationBars());
insetsController.show(WindowInsetsCompat.Type.statusBars());
insetsController.setSystemBarsBehavior(
WindowInsetsControllerCompat.BEHAVIOR_DEFAULT);
} else {
WindowCompat.setDecorFitsSystemWindows(getWindow(), false);
insetsController.hide(WindowInsetsCompat.Type.navigationBars());
insetsController.hide(WindowInsetsCompat.Type.statusBars());
insetsController.setSystemBarsBehavior(
WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE);
}
}

private void setPortraitPlayerBottomSheetPeekHeight(int peekHeight) {
FrameLayout bottomSheet = findViewById(R.id.player_bottom_sheet);
BottomSheetBehavior<FrameLayout> behavior =
BottomSheetBehavior.from(bottomSheet);

int newPeekPx = (int) (peekHeight * getResources().getDisplayMetrics().density);
behavior.setPeekHeight(newPeekPx);
}

private void initService() {
MediaManager.check(getMediaBrowserListenableFuture());

Expand Down Expand Up @@ -570,4 +650,4 @@ private void playDownloadedMedia(Intent intent) {

MediaManager.playDownloadedMediaItem(getMediaBrowserListenableFuture(), mediaItem);
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
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.ItemAlbumCarouselBinding;
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 java.util.Collections;
import java.util.List;

public class AlbumCarouselAdapter extends RecyclerView.Adapter<AlbumCarouselAdapter.ViewHolder> {
private final ClickCallback click;
private List<AlbumID3> albums;
private boolean showArtist;

public AlbumCarouselAdapter(ClickCallback click, boolean showArtist) {
this.click = click;
this.albums = Collections.emptyList();
this.showArtist = showArtist;
}

@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
ItemAlbumCarouselBinding view = ItemAlbumCarouselBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false);
return new ViewHolder(view);
}

@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
AlbumID3 album = albums.get(position);

holder.item.albumNameLabel.setText(album.getName());
holder.item.artistNameLabel.setText(album.getArtist());
holder.item.artistNameLabel.setVisibility(showArtist ? View.VISIBLE : View.GONE);

CustomGlideRequest.Builder
.from(holder.itemView.getContext(), album.getCoverArtId(), CustomGlideRequest.ResourceType.Album)
.build()
.into(holder.item.albumCoverImageView);
}

@Override
public int getItemCount() {
return albums.size();
}

public void setItems(List<AlbumID3> albums) {
this.albums = albums;
notifyDataSetChanged();
}

public class ViewHolder extends RecyclerView.ViewHolder {
ItemAlbumCarouselBinding item;

ViewHolder(ItemAlbumCarouselBinding item) {
super(item.getRoot());
this.item = item;

itemView.setOnClickListener(v -> {
Bundle bundle = new Bundle();
bundle.putParcelable(Constants.ALBUM_OBJECT, albums.get(getBindingAdapterPosition()));
click.onAlbumClick(bundle);
});

itemView.setOnLongClickListener(v -> {
Bundle bundle = new Bundle();
bundle.putParcelable(Constants.ALBUM_OBJECT, albums.get(getBindingAdapterPosition()));
click.onAlbumLongClick(bundle);
return true;
});

item.albumNameLabel.setSelected(true);
item.artistNameLabel.setSelected(true);
}
}
}
Original file line number Diff line number Diff line change
@@ -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.recyclerview.widget.RecyclerView;

import com.cappielloantonio.tempo.databinding.ItemArtistCarouselBinding;
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 java.util.Collections;
import java.util.List;

public class ArtistCarouselAdapter extends RecyclerView.Adapter<ArtistCarouselAdapter.ViewHolder> {
private final ClickCallback click;
private List<ArtistID3> artists;

public ArtistCarouselAdapter(ClickCallback click) {
this.click = click;
this.artists = Collections.emptyList();
}

@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
ItemArtistCarouselBinding view = ItemArtistCarouselBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false);
return new ViewHolder(view);
}

@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
ArtistID3 artist = artists.get(position);

holder.item.artistNameLabel.setText(artist.getName());

CustomGlideRequest.Builder
.from(holder.itemView.getContext(), artist.getCoverArtId(), CustomGlideRequest.ResourceType.Artist)
.build()
.into(holder.item.artistCoverImageView);
}

@Override
public int getItemCount() {
return artists.size();
}

public void setItems(List<ArtistID3> artists) {
this.artists = artists;
notifyDataSetChanged();
}

public class ViewHolder extends RecyclerView.ViewHolder {
ItemArtistCarouselBinding item;

ViewHolder(ItemArtistCarouselBinding item) {
super(item.getRoot());
this.item = item;

itemView.setOnClickListener(v -> {
Bundle bundle = new Bundle();
bundle.putParcelable(Constants.ARTIST_OBJECT, artists.get(getBindingAdapterPosition()));
click.onArtistClick(bundle);
});

itemView.setOnLongClickListener(v -> {
Bundle bundle = new Bundle();
bundle.putParcelable(Constants.ARTIST_OBJECT, artists.get(getBindingAdapterPosition()));
click.onArtistLongClick(bundle);
return true;
});

item.artistNameLabel.setSelected(true);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,10 @@ private void init() {
albumListPageViewModel.artist = requireArguments().getParcelable(Constants.ARTIST_OBJECT);
albumListPageViewModel.title = Constants.ALBUM_FROM_ARTIST;
bind.pageTitleLabel.setText(albumListPageViewModel.artist.getName());
} else if (requireArguments().getParcelableArrayList(Constants.ALBUMS_OBJECT) != null) {
albumListPageViewModel.albums = requireArguments().getParcelableArrayList(Constants.ALBUMS_OBJECT);
albumListPageViewModel.title = requireArguments().getString(Constants.ALBUM_LIST_TITLE, "");
bind.pageTitleLabel.setText(albumListPageViewModel.title);
}
}

Expand Down
Loading