mirror of
https://github.com/antebudimir/tempus.git
synced 2026-01-01 18:03:33 +00:00
feat: added shared items list on the homepage
This commit is contained in:
parent
5e486d4794
commit
ebd1582d1c
7 changed files with 397 additions and 0 deletions
|
|
@ -0,0 +1,99 @@
|
||||||
|
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.ItemHorizontalShareBinding;
|
||||||
|
import com.cappielloantonio.tempo.glide.CustomGlideRequest;
|
||||||
|
import com.cappielloantonio.tempo.interfaces.ClickCallback;
|
||||||
|
import com.cappielloantonio.tempo.subsonic.models.Share;
|
||||||
|
import com.cappielloantonio.tempo.util.Constants;
|
||||||
|
import com.cappielloantonio.tempo.util.MusicUtil;
|
||||||
|
import com.cappielloantonio.tempo.util.UIUtil;
|
||||||
|
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class ShareHorizontalAdapter extends RecyclerView.Adapter<ShareHorizontalAdapter.ViewHolder> {
|
||||||
|
private final ClickCallback click;
|
||||||
|
|
||||||
|
private List<Share> shares;
|
||||||
|
|
||||||
|
public ShareHorizontalAdapter(ClickCallback click) {
|
||||||
|
this.click = click;
|
||||||
|
this.shares = Collections.emptyList();
|
||||||
|
}
|
||||||
|
|
||||||
|
@NonNull
|
||||||
|
@Override
|
||||||
|
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
|
||||||
|
ItemHorizontalShareBinding view = ItemHorizontalShareBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false);
|
||||||
|
return new ViewHolder(view);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onBindViewHolder(ViewHolder holder, int position) {
|
||||||
|
Share share = shares.get(position);
|
||||||
|
|
||||||
|
holder.item.shareTitleTextView.setText(MusicUtil.getReadableString(share.getDescription()));
|
||||||
|
holder.item.shareSubtitleTextView.setText(holder.itemView.getContext().getString(R.string.share_subtitle_item, UIUtil.getReadableDate(share.getExpires())));
|
||||||
|
|
||||||
|
if (share.getEntries() != null && !share.getEntries().isEmpty()) CustomGlideRequest.Builder
|
||||||
|
.from(holder.itemView.getContext(), share.getEntries().get(0).getCoverArtId(), CustomGlideRequest.ResourceType.Album)
|
||||||
|
.build()
|
||||||
|
.into(holder.item.shareCoverImageView);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getItemCount() {
|
||||||
|
return shares.size();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setItems(List<Share> shares) {
|
||||||
|
this.shares = shares;
|
||||||
|
notifyDataSetChanged();
|
||||||
|
}
|
||||||
|
|
||||||
|
public Share getItem(int id) {
|
||||||
|
return shares.get(id);
|
||||||
|
}
|
||||||
|
|
||||||
|
public class ViewHolder extends RecyclerView.ViewHolder {
|
||||||
|
ItemHorizontalShareBinding item;
|
||||||
|
|
||||||
|
ViewHolder(ItemHorizontalShareBinding item) {
|
||||||
|
super(item.getRoot());
|
||||||
|
|
||||||
|
this.item = item;
|
||||||
|
|
||||||
|
item.shareTitleTextView.setSelected(true);
|
||||||
|
item.shareSubtitleTextView.setSelected(true);
|
||||||
|
|
||||||
|
itemView.setOnClickListener(v -> onClick());
|
||||||
|
itemView.setOnLongClickListener(v -> onLongClick());
|
||||||
|
|
||||||
|
item.shareButton.setOnClickListener(v -> onLongClick());
|
||||||
|
}
|
||||||
|
|
||||||
|
private void onClick() {
|
||||||
|
Bundle bundle = new Bundle();
|
||||||
|
bundle.putParcelable(Constants.SHARE_OBJECT, shares.get(getBindingAdapterPosition()));
|
||||||
|
|
||||||
|
click.onShareClick(bundle);
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean onLongClick() {
|
||||||
|
Bundle bundle = new Bundle();
|
||||||
|
bundle.putParcelable(Constants.SHARE_OBJECT, shares.get(getBindingAdapterPosition()));
|
||||||
|
|
||||||
|
click.onShareLongClick(bundle);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -1,7 +1,10 @@
|
||||||
package com.cappielloantonio.tempo.ui.fragment;
|
package com.cappielloantonio.tempo.ui.fragment;
|
||||||
|
|
||||||
import android.content.ComponentName;
|
import android.content.ComponentName;
|
||||||
|
import android.content.Intent;
|
||||||
|
import android.net.Uri;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
|
import android.os.Handler;
|
||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
|
|
@ -33,6 +36,7 @@ import com.cappielloantonio.tempo.service.DownloaderManager;
|
||||||
import com.cappielloantonio.tempo.service.MediaManager;
|
import com.cappielloantonio.tempo.service.MediaManager;
|
||||||
import com.cappielloantonio.tempo.service.MediaService;
|
import com.cappielloantonio.tempo.service.MediaService;
|
||||||
import com.cappielloantonio.tempo.subsonic.models.Child;
|
import com.cappielloantonio.tempo.subsonic.models.Child;
|
||||||
|
import com.cappielloantonio.tempo.subsonic.models.Share;
|
||||||
import com.cappielloantonio.tempo.ui.activity.MainActivity;
|
import com.cappielloantonio.tempo.ui.activity.MainActivity;
|
||||||
import com.cappielloantonio.tempo.ui.adapter.AlbumAdapter;
|
import com.cappielloantonio.tempo.ui.adapter.AlbumAdapter;
|
||||||
import com.cappielloantonio.tempo.ui.adapter.AlbumHorizontalAdapter;
|
import com.cappielloantonio.tempo.ui.adapter.AlbumHorizontalAdapter;
|
||||||
|
|
@ -40,6 +44,7 @@ import com.cappielloantonio.tempo.ui.adapter.ArtistAdapter;
|
||||||
import com.cappielloantonio.tempo.ui.adapter.ArtistHorizontalAdapter;
|
import com.cappielloantonio.tempo.ui.adapter.ArtistHorizontalAdapter;
|
||||||
import com.cappielloantonio.tempo.ui.adapter.DiscoverSongAdapter;
|
import com.cappielloantonio.tempo.ui.adapter.DiscoverSongAdapter;
|
||||||
import com.cappielloantonio.tempo.ui.adapter.GridTrackAdapter;
|
import com.cappielloantonio.tempo.ui.adapter.GridTrackAdapter;
|
||||||
|
import com.cappielloantonio.tempo.ui.adapter.ShareHorizontalAdapter;
|
||||||
import com.cappielloantonio.tempo.ui.adapter.SimilarTrackAdapter;
|
import com.cappielloantonio.tempo.ui.adapter.SimilarTrackAdapter;
|
||||||
import com.cappielloantonio.tempo.ui.adapter.SongHorizontalAdapter;
|
import com.cappielloantonio.tempo.ui.adapter.SongHorizontalAdapter;
|
||||||
import com.cappielloantonio.tempo.ui.adapter.YearAdapter;
|
import com.cappielloantonio.tempo.ui.adapter.YearAdapter;
|
||||||
|
|
@ -76,6 +81,7 @@ public class HomeTabMusicFragment extends Fragment implements ClickCallback {
|
||||||
private AlbumHorizontalAdapter newReleasesAlbumAdapter;
|
private AlbumHorizontalAdapter newReleasesAlbumAdapter;
|
||||||
private YearAdapter yearAdapter;
|
private YearAdapter yearAdapter;
|
||||||
private GridTrackAdapter gridTrackAdapter;
|
private GridTrackAdapter gridTrackAdapter;
|
||||||
|
private ShareHorizontalAdapter shareHorizontalAdapter;
|
||||||
|
|
||||||
private ListenableFuture<MediaBrowser> mediaBrowserListenableFuture;
|
private ListenableFuture<MediaBrowser> mediaBrowserListenableFuture;
|
||||||
|
|
||||||
|
|
@ -111,6 +117,7 @@ public class HomeTabMusicFragment extends Fragment implements ClickCallback {
|
||||||
initYearSongView();
|
initYearSongView();
|
||||||
initRecentAddedAlbumView();
|
initRecentAddedAlbumView();
|
||||||
initGridView();
|
initGridView();
|
||||||
|
initSharesView();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
@ -120,6 +127,12 @@ public class HomeTabMusicFragment extends Fragment implements ClickCallback {
|
||||||
initializeMediaBrowser();
|
initializeMediaBrowser();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onResume() {
|
||||||
|
super.onResume();
|
||||||
|
refreshSharesView();
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onStop() {
|
public void onStop() {
|
||||||
releaseMediaBrowser();
|
releaseMediaBrowser();
|
||||||
|
|
@ -227,6 +240,11 @@ public class HomeTabMusicFragment extends Fragment implements ClickCallback {
|
||||||
homeViewModel.refreshMostRecentlyAddedAlbums(getViewLifecycleOwner());
|
homeViewModel.refreshMostRecentlyAddedAlbums(getViewLifecycleOwner());
|
||||||
return true;
|
return true;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
bind.sharesTextViewRefreshable.setOnLongClickListener(v -> {
|
||||||
|
homeViewModel.refreshShares(getViewLifecycleOwner());
|
||||||
|
return true;
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private void initSyncStarredView() {
|
private void initSyncStarredView() {
|
||||||
|
|
@ -649,6 +667,45 @@ public class HomeTabMusicFragment extends Fragment implements ClickCallback {
|
||||||
recentAddedAlbumSnapHelper.attachToRecyclerView(bind.recentlyAddedAlbumsRecyclerView);
|
recentAddedAlbumSnapHelper.attachToRecyclerView(bind.recentlyAddedAlbumsRecyclerView);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void initSharesView() {
|
||||||
|
bind.sharesRecyclerView.setHasFixedSize(true);
|
||||||
|
|
||||||
|
shareHorizontalAdapter = new ShareHorizontalAdapter(this);
|
||||||
|
bind.sharesRecyclerView.setAdapter(shareHorizontalAdapter);
|
||||||
|
homeViewModel.getShares(getViewLifecycleOwner()).observe(getViewLifecycleOwner(), shares -> {
|
||||||
|
if (shares == null) {
|
||||||
|
if (bind != null) bind.sharesPlaceholder.placeholder.setVisibility(View.VISIBLE);
|
||||||
|
if (bind != null) bind.sharesSector.setVisibility(View.GONE);
|
||||||
|
} else {
|
||||||
|
if (bind != null) bind.sharesPlaceholder.placeholder.setVisibility(View.GONE);
|
||||||
|
if (bind != null)
|
||||||
|
bind.sharesSector.setVisibility(!shares.isEmpty() ? View.VISIBLE : View.GONE);
|
||||||
|
if (bind != null)
|
||||||
|
bind.sharesRecyclerView.setLayoutManager(new GridLayoutManager(requireContext(), UIUtil.getSpanCount(shares.size(), 10), GridLayoutManager.HORIZONTAL, false));
|
||||||
|
|
||||||
|
shareHorizontalAdapter.setItems(shares);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
SnapHelper starredTrackSnapHelper = new PagerSnapHelper();
|
||||||
|
starredTrackSnapHelper.attachToRecyclerView(bind.sharesRecyclerView);
|
||||||
|
|
||||||
|
bind.sharesRecyclerView.addItemDecoration(
|
||||||
|
new DotsIndicatorDecoration(
|
||||||
|
getResources().getDimensionPixelSize(R.dimen.radius),
|
||||||
|
getResources().getDimensionPixelSize(R.dimen.radius) * 4,
|
||||||
|
getResources().getDimensionPixelSize(R.dimen.dots_height),
|
||||||
|
requireContext().getResources().getColor(R.color.titleTextColor, null),
|
||||||
|
requireContext().getResources().getColor(R.color.titleTextColor, null))
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void refreshSharesView() {
|
||||||
|
final Handler handler = new Handler();
|
||||||
|
final Runnable runnable = () -> homeViewModel.refreshShares(getViewLifecycleOwner());
|
||||||
|
handler.postDelayed(runnable, 100);
|
||||||
|
}
|
||||||
|
|
||||||
private void setSlideViewOffset(ViewPager2 viewPager, float pageOffset, float pageMargin) {
|
private void setSlideViewOffset(ViewPager2 viewPager, float pageOffset, float pageMargin) {
|
||||||
viewPager.setPageTransformer((page, position) -> {
|
viewPager.setPageTransformer((page, position) -> {
|
||||||
float myOffset = position * -(2 * pageOffset + pageMargin);
|
float myOffset = position * -(2 * pageOffset + pageMargin);
|
||||||
|
|
@ -748,4 +805,16 @@ public class HomeTabMusicFragment extends Fragment implements ClickCallback {
|
||||||
public void onYearClick(Bundle bundle) {
|
public void onYearClick(Bundle bundle) {
|
||||||
Navigation.findNavController(requireView()).navigate(R.id.songListPageFragment, bundle);
|
Navigation.findNavController(requireView()).navigate(R.id.songListPageFragment, bundle);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onShareClick(Bundle bundle) {
|
||||||
|
Share share = bundle.getParcelable(Constants.SHARE_OBJECT);
|
||||||
|
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(share.getUrl())).setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
||||||
|
startActivity(intent);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onShareLongClick(Bundle bundle) {
|
||||||
|
Navigation.findNavController(requireView()).navigate(R.id.shareBottomSheetDialog, bundle);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -14,7 +14,9 @@ import org.xmlpull.v1.XmlPullParser;
|
||||||
import org.xmlpull.v1.XmlPullParserException;
|
import org.xmlpull.v1.XmlPullParserException;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
import java.text.SimpleDateFormat;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Date;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
|
|
@ -84,4 +86,9 @@ public class UIUtil {
|
||||||
|
|
||||||
return map;
|
return map;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static String getReadableDate(Date date) {
|
||||||
|
SimpleDateFormat formatter = new SimpleDateFormat("dd MMM, yyyy", Locale.getDefault());
|
||||||
|
return formatter.format(date);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -15,10 +15,12 @@ import com.cappielloantonio.tempo.repository.AlbumRepository;
|
||||||
import com.cappielloantonio.tempo.repository.ArtistRepository;
|
import com.cappielloantonio.tempo.repository.ArtistRepository;
|
||||||
import com.cappielloantonio.tempo.repository.ChronologyRepository;
|
import com.cappielloantonio.tempo.repository.ChronologyRepository;
|
||||||
import com.cappielloantonio.tempo.repository.FavoriteRepository;
|
import com.cappielloantonio.tempo.repository.FavoriteRepository;
|
||||||
|
import com.cappielloantonio.tempo.repository.SharingRepository;
|
||||||
import com.cappielloantonio.tempo.repository.SongRepository;
|
import com.cappielloantonio.tempo.repository.SongRepository;
|
||||||
import com.cappielloantonio.tempo.subsonic.models.AlbumID3;
|
import com.cappielloantonio.tempo.subsonic.models.AlbumID3;
|
||||||
import com.cappielloantonio.tempo.subsonic.models.ArtistID3;
|
import com.cappielloantonio.tempo.subsonic.models.ArtistID3;
|
||||||
import com.cappielloantonio.tempo.subsonic.models.Child;
|
import com.cappielloantonio.tempo.subsonic.models.Child;
|
||||||
|
import com.cappielloantonio.tempo.subsonic.models.Share;
|
||||||
import com.cappielloantonio.tempo.util.Preferences;
|
import com.cappielloantonio.tempo.util.Preferences;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
|
@ -36,6 +38,7 @@ public class HomeViewModel extends AndroidViewModel {
|
||||||
private final ArtistRepository artistRepository;
|
private final ArtistRepository artistRepository;
|
||||||
private final ChronologyRepository chronologyRepository;
|
private final ChronologyRepository chronologyRepository;
|
||||||
private final FavoriteRepository favoriteRepository;
|
private final FavoriteRepository favoriteRepository;
|
||||||
|
private final SharingRepository sharingRepository;
|
||||||
|
|
||||||
private final MutableLiveData<List<Child>> dicoverSongSample = new MutableLiveData<>(null);
|
private final MutableLiveData<List<Child>> dicoverSongSample = new MutableLiveData<>(null);
|
||||||
private final MutableLiveData<List<AlbumID3>> newReleasedAlbum = new MutableLiveData<>(null);
|
private final MutableLiveData<List<AlbumID3>> newReleasedAlbum = new MutableLiveData<>(null);
|
||||||
|
|
@ -54,6 +57,8 @@ public class HomeViewModel extends AndroidViewModel {
|
||||||
private final MutableLiveData<List<Child>> mediaInstantMix = new MutableLiveData<>(null);
|
private final MutableLiveData<List<Child>> mediaInstantMix = new MutableLiveData<>(null);
|
||||||
private final MutableLiveData<List<Child>> artistInstantMix = new MutableLiveData<>(null);
|
private final MutableLiveData<List<Child>> artistInstantMix = new MutableLiveData<>(null);
|
||||||
private final MutableLiveData<List<Child>> artistBestOf = new MutableLiveData<>(null);
|
private final MutableLiveData<List<Child>> artistBestOf = new MutableLiveData<>(null);
|
||||||
|
private final MutableLiveData<List<Share>> shares = new MutableLiveData<>(null);
|
||||||
|
|
||||||
|
|
||||||
public HomeViewModel(@NonNull Application application) {
|
public HomeViewModel(@NonNull Application application) {
|
||||||
super(application);
|
super(application);
|
||||||
|
|
@ -63,6 +68,7 @@ public class HomeViewModel extends AndroidViewModel {
|
||||||
artistRepository = new ArtistRepository();
|
artistRepository = new ArtistRepository();
|
||||||
chronologyRepository = new ChronologyRepository();
|
chronologyRepository = new ChronologyRepository();
|
||||||
favoriteRepository = new FavoriteRepository();
|
favoriteRepository = new FavoriteRepository();
|
||||||
|
sharingRepository = new SharingRepository();
|
||||||
|
|
||||||
setOfflineFavorite();
|
setOfflineFavorite();
|
||||||
}
|
}
|
||||||
|
|
@ -204,6 +210,14 @@ public class HomeViewModel extends AndroidViewModel {
|
||||||
return artistBestOf;
|
return artistBestOf;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public LiveData<List<Share>> getShares(LifecycleOwner owner) {
|
||||||
|
if (shares.getValue() == null) {
|
||||||
|
sharingRepository.getShares().observe(owner, shares::postValue);
|
||||||
|
}
|
||||||
|
|
||||||
|
return shares;
|
||||||
|
}
|
||||||
|
|
||||||
public LiveData<List<Child>> getAllStarredTracks() {
|
public LiveData<List<Child>> getAllStarredTracks() {
|
||||||
return songRepository.getStarredSongs(false, -1);
|
return songRepository.getStarredSongs(false, -1);
|
||||||
}
|
}
|
||||||
|
|
@ -248,6 +262,10 @@ public class HomeViewModel extends AndroidViewModel {
|
||||||
albumRepository.getAlbums("recent", 20, null, null).observe(owner, recentlyPlayedAlbumSample::postValue);
|
albumRepository.getAlbums("recent", 20, null, null).observe(owner, recentlyPlayedAlbumSample::postValue);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void refreshShares(LifecycleOwner owner) {
|
||||||
|
sharingRepository.getShares().observe(owner, this.shares::postValue);
|
||||||
|
}
|
||||||
|
|
||||||
public void setOfflineFavorite() {
|
public void setOfflineFavorite() {
|
||||||
ArrayList<Favorite> favorites = getFavorites();
|
ArrayList<Favorite> favorites = getFavorites();
|
||||||
ArrayList<Favorite> favoritesToSave = getFavoritesToSave(favorites);
|
ArrayList<Favorite> favoritesToSave = getFavoritesToSave(favorites);
|
||||||
|
|
|
||||||
106
app/src/main/res/layout/bottom_sheet_share_dialog.xml
Normal file
106
app/src/main/res/layout/bottom_sheet_share_dialog.xml
Normal file
|
|
@ -0,0 +1,106 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:orientation="vertical">
|
||||||
|
|
||||||
|
<androidx.constraintlayout.widget.ConstraintLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginStart="20dp"
|
||||||
|
android:layout_marginTop="12dp"
|
||||||
|
android:layout_marginEnd="12dp"
|
||||||
|
android:clipChildren="false">
|
||||||
|
|
||||||
|
<!-- Header -->
|
||||||
|
<ImageView
|
||||||
|
android:id="@+id/share_cover_image_view"
|
||||||
|
android:layout_width="54dp"
|
||||||
|
android:layout_height="54dp"
|
||||||
|
android:layout_margin="2dp"
|
||||||
|
app:layout_constraintBottom_toBottomOf="parent"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toTopOf="parent" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/share_title_text_view"
|
||||||
|
style="@style/LabelMedium"
|
||||||
|
android:layout_width="0dp"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:ellipsize="marquee"
|
||||||
|
android:paddingStart="12dp"
|
||||||
|
android:paddingEnd="12dp"
|
||||||
|
android:singleLine="true"
|
||||||
|
android:text="@string/label_placeholder"
|
||||||
|
app:layout_constraintBottom_toTopOf="@+id/share_subtitle_text_view"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintStart_toEndOf="@+id/share_cover_image_view"
|
||||||
|
app:layout_constraintTop_toTopOf="@+id/share_cover_image_view"
|
||||||
|
app:layout_constraintVertical_chainStyle="packed" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/share_subtitle_text_view"
|
||||||
|
style="@style/LabelSmall"
|
||||||
|
android:layout_width="0dp"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:paddingStart="12dp"
|
||||||
|
android:paddingEnd="12dp"
|
||||||
|
android:text="@string/label_placeholder"
|
||||||
|
app:layout_constraintBottom_toBottomOf="@+id/share_cover_image_view"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintStart_toEndOf="@+id/share_cover_image_view"
|
||||||
|
app:layout_constraintTop_toBottomOf="@+id/share_title_text_view" />
|
||||||
|
|
||||||
|
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:id="@+id/option_linear_layout"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:orientation="vertical"
|
||||||
|
android:paddingTop="8dp"
|
||||||
|
android:paddingBottom="12dp"
|
||||||
|
app:layout_constraintLeft_toLeftOf="parent"
|
||||||
|
app:layout_constraintRight_toRightOf="parent">
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/copy_link_text_view"
|
||||||
|
style="@style/LabelMedium"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:background="?attr/selectableItemBackground"
|
||||||
|
android:clickable="true"
|
||||||
|
android:paddingStart="20dp"
|
||||||
|
android:paddingTop="12dp"
|
||||||
|
android:paddingEnd="20dp"
|
||||||
|
android:paddingBottom="12dp"
|
||||||
|
android:text="@string/share_bottom_sheet_copy_link" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/update_share_preferences_text_view"
|
||||||
|
style="@style/LabelMedium"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:background="?attr/selectableItemBackground"
|
||||||
|
android:clickable="true"
|
||||||
|
android:paddingStart="20dp"
|
||||||
|
android:paddingTop="12dp"
|
||||||
|
android:paddingEnd="20dp"
|
||||||
|
android:paddingBottom="12dp"
|
||||||
|
android:text="@string/share_bottom_sheet_update" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/delete_share_text_view"
|
||||||
|
style="@style/LabelMedium"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:background="?attr/selectableItemBackground"
|
||||||
|
android:clickable="true"
|
||||||
|
android:paddingStart="20dp"
|
||||||
|
android:paddingTop="12dp"
|
||||||
|
android:paddingEnd="20dp"
|
||||||
|
android:paddingBottom="12dp"
|
||||||
|
android:text="@string/share_bottom_sheet_delete" />
|
||||||
|
</LinearLayout>
|
||||||
|
</LinearLayout>
|
||||||
|
|
@ -753,6 +753,39 @@
|
||||||
android:id="@+id/home_recently_added_albums_placeholder"
|
android:id="@+id/home_recently_added_albums_placeholder"
|
||||||
layout="@layout/item_placeholder_album"
|
layout="@layout/item_placeholder_album"
|
||||||
android:visibility="gone" />
|
android:visibility="gone" />
|
||||||
|
|
||||||
|
<!-- Shares -->
|
||||||
|
<LinearLayout
|
||||||
|
android:id="@+id/shares_sector"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:orientation="vertical">
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/shares_text_view_refreshable"
|
||||||
|
style="@style/TitleLarge"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:paddingTop="12dp"
|
||||||
|
android:paddingStart="16dp"
|
||||||
|
android:paddingEnd="16dp"
|
||||||
|
android:text="@string/home_title_shares" />
|
||||||
|
|
||||||
|
<androidx.recyclerview.widget.RecyclerView
|
||||||
|
android:id="@+id/shares_recycler_view"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginTop="8dp"
|
||||||
|
android:layout_marginBottom="8dp"
|
||||||
|
android:clipToPadding="false"
|
||||||
|
android:paddingTop="8dp"
|
||||||
|
android:paddingBottom="8dp" />
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
<include
|
||||||
|
android:id="@+id/shares_placeholder"
|
||||||
|
layout="@layout/item_placeholder_horizontal"
|
||||||
|
android:visibility="gone" />
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
</androidx.core.widget.NestedScrollView>
|
</androidx.core.widget.NestedScrollView>
|
||||||
|
|
||||||
|
|
|
||||||
65
app/src/main/res/layout/item_horizontal_share.xml
Normal file
65
app/src/main/res/layout/item_horizontal_share.xml
Normal file
|
|
@ -0,0 +1,65 @@
|
||||||
|
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:background="?attr/selectableItemBackground"
|
||||||
|
android:clipChildren="false"
|
||||||
|
android:orientation="horizontal"
|
||||||
|
android:paddingTop="2dp"
|
||||||
|
android:paddingBottom="2dp">
|
||||||
|
|
||||||
|
<ImageView
|
||||||
|
android:id="@+id/share_cover_image_view"
|
||||||
|
android:layout_width="52dp"
|
||||||
|
android:layout_height="52dp"
|
||||||
|
android:layout_gravity="center"
|
||||||
|
android:layout_marginStart="16dp"
|
||||||
|
app:layout_constraintBottom_toBottomOf="parent"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toTopOf="parent" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/share_title_text_view"
|
||||||
|
style="@style/LabelMedium"
|
||||||
|
android:layout_width="0dp"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:ellipsize="marquee"
|
||||||
|
android:paddingHorizontal="12dp"
|
||||||
|
android:singleLine="true"
|
||||||
|
android:text="@string/label_placeholder"
|
||||||
|
app:layout_constraintBottom_toTopOf="@+id/share_subtitle_text_view"
|
||||||
|
app:layout_constraintEnd_toStartOf="@+id/share_button"
|
||||||
|
app:layout_constraintStart_toEndOf="@+id/share_cover_image_view"
|
||||||
|
app:layout_constraintTop_toTopOf="@+id/share_cover_image_view"
|
||||||
|
app:layout_constraintVertical_chainStyle="packed" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/share_subtitle_text_view"
|
||||||
|
style="@style/LabelSmall"
|
||||||
|
android:layout_width="0dp"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:ellipsize="marquee"
|
||||||
|
android:paddingHorizontal="12dp"
|
||||||
|
android:singleLine="true"
|
||||||
|
android:text="@string/label_placeholder"
|
||||||
|
app:layout_constraintBottom_toBottomOf="@+id/share_cover_image_view"
|
||||||
|
app:layout_constraintEnd_toStartOf="@+id/share_button"
|
||||||
|
app:layout_constraintStart_toEndOf="@+id/share_cover_image_view"
|
||||||
|
app:layout_constraintTop_toBottomOf="@+id/share_title_text_view" />
|
||||||
|
|
||||||
|
<FrameLayout
|
||||||
|
android:id="@+id/share_button"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:padding="12dp"
|
||||||
|
app:layout_constraintBottom_toBottomOf="@+id/share_cover_image_view"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintTop_toTopOf="@+id/share_cover_image_view">
|
||||||
|
|
||||||
|
<ImageView
|
||||||
|
android:layout_width="18dp"
|
||||||
|
android:layout_height="18dp"
|
||||||
|
android:background="@drawable/ic_more_vert"
|
||||||
|
android:foreground="?android:attr/selectableItemBackgroundBorderless" />
|
||||||
|
</FrameLayout>
|
||||||
|
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||||
Loading…
Add table
Add a link
Reference in a new issue