Implemented offline mode functionality

This commit is contained in:
CappielloAntonio 2021-04-26 19:17:42 +02:00
parent 658e69dcb9
commit e0569c3901
21 changed files with 635 additions and 23 deletions

View file

@ -12,6 +12,7 @@ import android.os.IBinder;
import android.os.PowerManager;
import android.provider.Settings;
import android.util.Log;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AlertDialog;
@ -20,7 +21,11 @@ import androidx.appcompat.app.AppCompatActivity;
import com.cappielloantonio.play.R;
import com.cappielloantonio.play.helper.MusicPlayerRemote;
import com.cappielloantonio.play.interfaces.MusicServiceEventListener;
import com.cappielloantonio.play.service.DownloadTracker;
import com.cappielloantonio.play.service.MusicService;
import com.cappielloantonio.play.service.PlayDownloadService;
import com.cappielloantonio.play.util.DownloadUtil;
import com.google.android.exoplayer2.offline.DownloadService;
import java.lang.ref.WeakReference;
import java.util.ArrayList;
@ -29,7 +34,7 @@ import java.util.List;
import pub.devrel.easypermissions.AppSettingsDialog;
import pub.devrel.easypermissions.EasyPermissions;
public class BaseActivity extends AppCompatActivity implements EasyPermissions.PermissionCallbacks, MusicServiceEventListener {
public class BaseActivity extends AppCompatActivity implements EasyPermissions.PermissionCallbacks, MusicServiceEventListener, DownloadTracker.Listener {
private static final String TAG = "BaseActivity";
public static final int REQUEST_PERM_ACCESS = 1;
@ -38,6 +43,8 @@ public class BaseActivity extends AppCompatActivity implements EasyPermissions.P
private MusicPlayerRemote.ServiceToken serviceToken;
private MusicStateReceiver musicStateReceiver;
private DownloadTracker downloadTracker;
private boolean receiverRegistered;
@Override
@ -58,6 +65,23 @@ public class BaseActivity extends AppCompatActivity implements EasyPermissions.P
BaseActivity.this.onServiceDisconnected();
}
});
downloadTracker = DownloadUtil.getDownloadTracker(this);
// Start the download service if it should be running but it's not currently.
// Starting the service in the foreground causes notification flicker if there is no scheduled
// action. Starting it in the background throws an exception if the app is in the background too
// (e.g. if device screen is locked).
try {
DownloadService.start(this, PlayDownloadService.class);
} catch (IllegalStateException e) {
DownloadService.startForeground(this, PlayDownloadService.class);
}
}
@Override
public void onStart() {
super.onStart();
downloadTracker.addListener(this);
}
@Override
@ -67,6 +91,12 @@ public class BaseActivity extends AppCompatActivity implements EasyPermissions.P
checkBatteryOptimization();
}
@Override
public void onStop() {
downloadTracker.removeListener(this);
super.onStop();
}
@Override
protected void onDestroy() {
super.onDestroy();
@ -216,6 +246,13 @@ public class BaseActivity extends AppCompatActivity implements EasyPermissions.P
}
}
@Override
public void onDownloadsChanged() {
// TODO Notificare all'item scaricato che lo stato di download è cambiato
// sampleAdapter.notifyDataSetChanged();
Toast.makeText(this, "Download changed", Toast.LENGTH_SHORT).show();
}
private static final class MusicStateReceiver extends BroadcastReceiver {
private final WeakReference<BaseActivity> reference;

View file

@ -24,6 +24,8 @@ import com.cappielloantonio.play.model.Song;
import com.cappielloantonio.play.repository.QueueRepository;
import com.cappielloantonio.play.repository.SongRepository;
import com.cappielloantonio.play.ui.activities.MainActivity;
import com.cappielloantonio.play.util.DownloadUtil;
import com.cappielloantonio.play.util.MusicUtil;
import com.cappielloantonio.play.util.PreferenceUtil;
import com.cappielloantonio.play.util.SyncUtil;
import com.cappielloantonio.play.viewmodel.AlbumBottomSheetViewModel;
@ -135,7 +137,8 @@ public class AlbumBottomSheetDialog extends BottomSheetDialogFragment implements
Download = view.findViewById(R.id.download_text_view);
Download.setOnClickListener(v -> {
Toast.makeText(requireContext(), "Download", Toast.LENGTH_SHORT).show();
List<Song> songs = songRepository.getAlbumListSong(album.getId(), false);
DownloadUtil.getDownloadTracker(requireContext()).toggleDownload(songs);
dismissBottomSheet();
});

View file

@ -21,19 +21,18 @@ import com.cappielloantonio.play.helper.MusicPlayerRemote;
import com.cappielloantonio.play.interfaces.MediaCallback;
import com.cappielloantonio.play.model.Album;
import com.cappielloantonio.play.model.Artist;
import com.cappielloantonio.play.model.PlaylistSongCross;
import com.cappielloantonio.play.model.Song;
import com.cappielloantonio.play.repository.QueueRepository;
import com.cappielloantonio.play.ui.activities.MainActivity;
import com.cappielloantonio.play.util.DownloadUtil;
import com.cappielloantonio.play.util.PreferenceUtil;
import com.cappielloantonio.play.util.SyncUtil;
import com.cappielloantonio.play.viewmodel.PlayerBottomSheetViewModel;
import com.cappielloantonio.play.viewmodel.SongBottomSheetViewModel;
import com.google.android.material.bottomsheet.BottomSheetDialogFragment;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
public class SongBottomSheetDialog extends BottomSheetDialogFragment implements View.OnClickListener {
private static final String TAG = "SongBottomSheetDialog";
@ -44,12 +43,13 @@ public class SongBottomSheetDialog extends BottomSheetDialogFragment implements
private ImageView coverSong;
private TextView titleSong;
private TextView artistSong;
private ToggleButton thumbToggle;
private ToggleButton favoriteToggle;
private ImageView downloadIndicator;
private TextView playRadio;
private TextView playNext;
private TextView addToQueue;
private TextView Download;
private TextView download;
private TextView addToPlaylist;
private TextView goToAlbum;
private TextView goToArtist;
@ -65,6 +65,7 @@ public class SongBottomSheetDialog extends BottomSheetDialogFragment implements
songBottomSheetViewModel.setSong(song);
init(view);
initDownloadedUI();
return view;
}
@ -83,13 +84,15 @@ public class SongBottomSheetDialog extends BottomSheetDialogFragment implements
artistSong = view.findViewById(R.id.song_artist_text_view);
artistSong.setText(songBottomSheetViewModel.getSong().getArtistName());
thumbToggle = view.findViewById(R.id.button_favorite);
thumbToggle.setChecked(songBottomSheetViewModel.getSong().isFavorite());
thumbToggle.setOnClickListener(v -> {
favoriteToggle = view.findViewById(R.id.button_favorite);
favoriteToggle.setChecked(songBottomSheetViewModel.getSong().isFavorite());
favoriteToggle.setOnClickListener(v -> {
songBottomSheetViewModel.setFavorite();
dismissBottomSheet();
});
downloadIndicator = view.findViewById(R.id.bottom_sheet_song_dowanload_indicator_image_view);
playRadio = view.findViewById(R.id.play_radio_text_view);
playRadio.setOnClickListener(v -> {
SyncUtil.getInstantMix(requireContext(), new MediaCallback() {
@ -129,9 +132,9 @@ public class SongBottomSheetDialog extends BottomSheetDialogFragment implements
dismissBottomSheet();
});
Download = view.findViewById(R.id.download_text_view);
Download.setOnClickListener(v -> {
Toast.makeText(requireContext(), "Download", Toast.LENGTH_SHORT).show();
download = view.findViewById(R.id.download_text_view);
download.setOnClickListener(v -> {
DownloadUtil.getDownloadTracker(requireContext()).toggleDownload(Arrays.asList(song));
dismissBottomSheet();
});
@ -177,4 +180,14 @@ public class SongBottomSheetDialog extends BottomSheetDialogFragment implements
private void dismissBottomSheet() {
dismiss();
}
private void initDownloadedUI() {
if (song.isOffline()) {
downloadIndicator.setVisibility(View.VISIBLE);
download.setText("Remove");
} else {
downloadIndicator.setVisibility(View.GONE);
download.setText("Download");
}
}
}