Reimplemented a basic track download functionality

This commit is contained in:
CappielloAntonio 2022-01-01 21:55:15 +01:00
parent b7a77cf32b
commit dee845ebff
17 changed files with 154 additions and 214 deletions

View file

@ -3,34 +3,41 @@ package com.cappielloantonio.play.ui.activity.base;
import android.annotation.SuppressLint;
import android.content.ComponentName;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.os.PowerManager;
import android.provider.Settings;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import androidx.media3.common.MediaItem;
import androidx.media3.common.MediaMetadata;
import androidx.media3.exoplayer.offline.DownloadService;
import androidx.media3.session.MediaBrowser;
import androidx.media3.session.SessionToken;
import com.cappielloantonio.play.R;
import com.cappielloantonio.play.service.DownloaderService;
import com.cappielloantonio.play.service.DownloaderTracker;
import com.cappielloantonio.play.service.MediaService;
import com.cappielloantonio.play.util.DownloadUtil;
import com.google.common.util.concurrent.ListenableFuture;
import com.google.common.util.concurrent.MoreExecutors;
import java.util.concurrent.ExecutionException;
public class BaseActivity extends AppCompatActivity {
public class BaseActivity extends AppCompatActivity implements DownloaderTracker.Listener {
private static final String TAG = "BaseActivity";
private ListenableFuture<MediaBrowser> mediaBrowserListenableFuture;
private DownloaderTracker downloaderTracker;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
initializeDownloader();
}
@Override
protected void onStart() {
super.onStart();
initializeBrowser();
addDownloadListener();
}
@Override
@ -42,9 +49,16 @@ public class BaseActivity extends AppCompatActivity {
@Override
protected void onStop() {
releaseBrowser();
removeDownloadListener();
super.onStop();
}
@Override
public void onDownloadsChanged() {
// TODO Notificare all'item scaricato che lo stato di download è cambiato
// sampleAdapter.notifyDataSetChanged();
}
private void checkBatteryOptimization() {
if (detectBatteryOptimization()) {
showBatteryOptimizationDialog();
@ -85,4 +99,23 @@ public class BaseActivity extends AppCompatActivity {
public ListenableFuture<MediaBrowser> getMediaBrowserListenableFuture() {
return mediaBrowserListenableFuture;
}
@SuppressLint("UnsafeOptInUsageError")
private void initializeDownloader() {
downloaderTracker = DownloadUtil.getDownloadTracker(this);
try {
DownloadService.start(this, DownloaderService.class);
} catch (IllegalStateException e) {
DownloadService.startForeground(this, DownloaderService.class);
}
}
private void addDownloadListener() {
downloaderTracker.addListener(this);
}
private void removeDownloadListener() {
downloaderTracker.removeListener(this);
}
}

View file

@ -13,6 +13,7 @@ import androidx.lifecycle.ViewModelProvider;
import com.cappielloantonio.play.R;
import com.cappielloantonio.play.databinding.DialogConnectionAlertBinding;
import com.cappielloantonio.play.util.DownloadUtil;
import com.cappielloantonio.play.util.MappingUtil;
import com.cappielloantonio.play.util.PreferenceUtil;
import com.cappielloantonio.play.viewmodel.StarredSyncViewModel;
@ -34,8 +35,10 @@ public class StarredSyncDialog extends DialogFragment {
builder.setView(bind.getRoot())
.setTitle(R.string.starred_sync_dialog_title)
.setPositiveButton(R.string.starred_sync_dialog_positive_button, (dialog, id) -> { })
.setNegativeButton(R.string.starred_sync_dialog_negative_button, (dialog, id) -> { });
.setPositiveButton(R.string.starred_sync_dialog_positive_button, (dialog, id) -> {
})
.setNegativeButton(R.string.starred_sync_dialog_negative_button, (dialog, id) -> {
});
return builder.create();
}
@ -60,7 +63,7 @@ public class StarredSyncDialog extends DialogFragment {
((AlertDialog) Objects.requireNonNull(getDialog())).getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener(v -> {
starredSyncViewModel.getStarredTracks(requireActivity()).observe(requireActivity(), songs -> {
if (songs != null) {
// DownloadUtil.getDownloadTracker(context).download(songs, null, null);
DownloadUtil.getDownloadTracker(context).download(MappingUtil.mapMediaItems(context, songs, false));
}
});

View file

@ -27,6 +27,8 @@ import com.cappielloantonio.play.glide.CustomGlideRequest;
import com.cappielloantonio.play.service.MediaManager;
import com.cappielloantonio.play.service.MediaService;
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.viewmodel.AlbumPageViewModel;
import com.google.common.util.concurrent.ListenableFuture;
@ -106,7 +108,7 @@ public class AlbumPageFragment extends Fragment {
if (item.getItemId() == R.id.action_download_album) {
albumPageViewModel.getAlbumSongLiveList(requireActivity()).observe(requireActivity(), songs -> {
if (isVisible() && getActivity() != null) {
// DownloadUtil.getDownloadTracker(requireContext()).download(songs, null, null);
DownloadUtil.getDownloadTracker(requireContext()).download(MappingUtil.mapMediaItems(requireContext(), songs, false));
}
});
return true;

View file

@ -19,16 +19,13 @@ import androidx.media3.session.SessionToken;
import androidx.recyclerview.widget.LinearLayoutManager;
import com.bumptech.glide.load.resource.bitmap.GranularRoundedCorners;
import com.cappielloantonio.play.App;
import com.cappielloantonio.play.R;
import com.cappielloantonio.play.adapter.SongHorizontalAdapter;
import com.cappielloantonio.play.databinding.FragmentPlaylistPageBinding;
import com.cappielloantonio.play.glide.CustomGlideRequest;
import com.cappielloantonio.play.repository.QueueRepository;
import com.cappielloantonio.play.service.MediaManager;
import com.cappielloantonio.play.service.MediaService;
import com.cappielloantonio.play.ui.activity.MainActivity;
import com.cappielloantonio.play.util.DownloadUtil;
import com.cappielloantonio.play.util.MusicUtil;
import com.cappielloantonio.play.viewmodel.PlaylistPageViewModel;
import com.google.common.util.concurrent.ListenableFuture;

View file

@ -14,6 +14,7 @@ import android.widget.ToggleButton;
import androidx.annotation.Nullable;
import androidx.lifecycle.ViewModelProvider;
import androidx.media3.common.MediaItem;
import androidx.media3.session.MediaBrowser;
import androidx.media3.session.SessionToken;
import androidx.navigation.fragment.NavHostFragment;
@ -29,6 +30,8 @@ import com.cappielloantonio.play.repository.AlbumRepository;
import com.cappielloantonio.play.service.MediaManager;
import com.cappielloantonio.play.service.MediaService;
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.viewmodel.AlbumBottomSheetViewModel;
import com.google.android.material.bottomsheet.BottomSheetDialogFragment;
@ -153,19 +156,21 @@ public class AlbumBottomSheetDialog extends BottomSheetDialogFragment implements
TextView removeAll = view.findViewById(R.id.remove_all_text_view);
albumBottomSheetViewModel.getAlbumTracks().observe(requireActivity(), songs -> {
List<MediaItem> mediaItems = MappingUtil.mapMediaItems(requireContext(), songs, false);
downloadAll.setOnClickListener(v -> {
// DownloadUtil.getDownloadTracker(requireContext()).download(songs, null, null);
DownloadUtil.getDownloadTracker(requireContext()).download(mediaItems);
dismissBottomSheet();
});
/*if (DownloadUtil.getDownloadTracker(requireContext()).isDownloaded(songs)) {
if (DownloadUtil.getDownloadTracker(requireContext()).areDownloaded(mediaItems)) {
removeAll.setOnClickListener(v -> {
DownloadUtil.getDownloadTracker(requireContext()).remove(songs);
DownloadUtil.getDownloadTracker(requireContext()).remove(mediaItems);
dismissBottomSheet();
});
} else {
removeAll.setVisibility(View.GONE);
}*/
}
});
TextView goToArtist = view.findViewById(R.id.go_to_artist_text_view);

View file

@ -30,6 +30,8 @@ import com.cappielloantonio.play.service.MediaService;
import com.cappielloantonio.play.ui.activity.MainActivity;
import com.cappielloantonio.play.ui.dialog.PlaylistChooserDialog;
import com.cappielloantonio.play.ui.dialog.RatingDialog;
import com.cappielloantonio.play.util.DownloadUtil;
import com.cappielloantonio.play.util.MappingUtil;
import com.cappielloantonio.play.util.MusicUtil;
import com.cappielloantonio.play.viewmodel.SongBottomSheetViewModel;
import com.google.android.material.bottomsheet.BottomSheetDialogFragment;
@ -155,13 +157,13 @@ public class SongBottomSheetDialog extends BottomSheetDialogFragment implements
TextView download = view.findViewById(R.id.download_text_view);
download.setOnClickListener(v -> {
// DownloadUtil.getDownloadTracker(requireContext()).download(Collections.singletonList(song), null, null);
DownloadUtil.getDownloadTracker(requireContext()).download(MappingUtil.mapMediaItem(requireContext(), song, false));
dismissBottomSheet();
});
TextView remove = view.findViewById(R.id.remove_text_view);
remove.setOnClickListener(v -> {
// DownloadUtil.getDownloadTracker(requireContext()).remove(Collections.singletonList(song));
DownloadUtil.getDownloadTracker(requireContext()).remove(MappingUtil.mapMediaItem(requireContext(), song, false));
dismissBottomSheet();
});
@ -214,13 +216,13 @@ public class SongBottomSheetDialog extends BottomSheetDialogFragment implements
}
private void initDownloadUI(TextView download, TextView remove) {
/*if (DownloadUtil.getDownloadTracker(requireContext()).isDownloaded(song)) {
if (DownloadUtil.getDownloadTracker(requireContext()).isDownloaded(MappingUtil.mapMediaItem(requireContext(), song, false))) {
download.setVisibility(View.GONE);
remove.setVisibility(View.VISIBLE);
} else {
download.setVisibility(View.VISIBLE);
remove.setVisibility(View.GONE);
}*/
}
}
@SuppressLint("UnsafeOptInUsageError")