diff --git a/app/src/main/java/com/cappielloantonio/tempo/ui/dialog/DownloadDirectoryDialog.java b/app/src/main/java/com/cappielloantonio/tempo/ui/dialog/DownloadDirectoryDialog.java new file mode 100644 index 00000000..24059300 --- /dev/null +++ b/app/src/main/java/com/cappielloantonio/tempo/ui/dialog/DownloadDirectoryDialog.java @@ -0,0 +1,71 @@ +package com.cappielloantonio.tempo.ui.dialog; + +import android.app.AlertDialog; +import android.app.Dialog; +import android.os.Bundle; +import android.widget.Button; + +import androidx.annotation.NonNull; +import androidx.annotation.OptIn; +import androidx.fragment.app.DialogFragment; +import androidx.media3.common.util.UnstableApi; + +import com.cappielloantonio.tempo.R; +import com.cappielloantonio.tempo.databinding.DialogDownloadDirectoryBinding; +import com.cappielloantonio.tempo.interfaces.DialogClickCallback; + +@OptIn(markerClass = UnstableApi.class) +public class DownloadDirectoryDialog extends DialogFragment { + private DialogDownloadDirectoryBinding bind; + + private final DialogClickCallback dialogClickCallback; + + public DownloadDirectoryDialog(DialogClickCallback dialogClickCallback) { + this.dialogClickCallback = dialogClickCallback; + } + + @NonNull + @Override + public Dialog onCreateDialog(Bundle savedInstanceState) { + bind = DialogDownloadDirectoryBinding.inflate(getLayoutInflater()); + + AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); + + builder.setView(bind.getRoot()) + .setTitle(R.string.download_directory_dialog_title) + .setPositiveButton(R.string.download_directory_dialog_positive_button, null) + .setNegativeButton(R.string.download_directory_dialog_negative_button, null); + + return builder.create(); + } + + @Override + public void onResume() { + super.onResume(); + setButtonAction(); + } + + @Override + public void onDestroyView() { + super.onDestroyView(); + bind = null; + } + + private void setButtonAction() { + AlertDialog dialog = ((AlertDialog) getDialog()); + + if (dialog != null) { + Button positiveButton = dialog.getButton(Dialog.BUTTON_POSITIVE); + positiveButton.setOnClickListener(v -> { + dialogClickCallback.onPositiveClick(); + dialog.dismiss(); + }); + + Button negativeButton = dialog.getButton(Dialog.BUTTON_NEGATIVE); + negativeButton.setOnClickListener(v -> { + dialogClickCallback.onNegativeClick(); + dialog.dismiss(); + }); + } + } +} diff --git a/app/src/main/java/com/cappielloantonio/tempo/ui/fragment/DirectoryFragment.java b/app/src/main/java/com/cappielloantonio/tempo/ui/fragment/DirectoryFragment.java index aad8f7ee..545ea627 100644 --- a/app/src/main/java/com/cappielloantonio/tempo/ui/fragment/DirectoryFragment.java +++ b/app/src/main/java/com/cappielloantonio/tempo/ui/fragment/DirectoryFragment.java @@ -23,12 +23,14 @@ import androidx.recyclerview.widget.LinearLayoutManager; import com.cappielloantonio.tempo.R; import com.cappielloantonio.tempo.databinding.FragmentDirectoryBinding; import com.cappielloantonio.tempo.interfaces.ClickCallback; +import com.cappielloantonio.tempo.interfaces.DialogClickCallback; import com.cappielloantonio.tempo.model.Download; import com.cappielloantonio.tempo.service.MediaManager; import com.cappielloantonio.tempo.service.MediaService; import com.cappielloantonio.tempo.subsonic.models.Child; import com.cappielloantonio.tempo.ui.activity.MainActivity; import com.cappielloantonio.tempo.ui.adapter.MusicDirectoryAdapter; +import com.cappielloantonio.tempo.ui.dialog.DownloadDirectoryDialog; import com.cappielloantonio.tempo.util.Constants; import com.cappielloantonio.tempo.util.DownloadUtil; import com.cappielloantonio.tempo.util.MappingUtil; @@ -50,6 +52,8 @@ public class DirectoryFragment extends Fragment implements ClickCallback { private ListenableFuture mediaBrowserListenableFuture; + private MenuItem menuItem; + @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -60,6 +64,8 @@ public class DirectoryFragment extends Fragment implements ClickCallback { public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) { super.onCreateOptionsMenu(menu, inflater); inflater.inflate(R.menu.directory_page_menu, menu); + + menuItem = menu.getItem(0); } @Override @@ -97,15 +103,23 @@ public class DirectoryFragment extends Fragment implements ClickCallback { @Override public boolean onOptionsItemSelected(@NonNull MenuItem item) { if (item.getItemId() == R.id.action_download_directory) { - directoryViewModel.loadMusicDirectory(getArguments().getString(Constants.MUSIC_DIRECTORY_ID)).observe(getViewLifecycleOwner(), directory -> { - if (isVisible() && getActivity() != null) { - List songs = directory.getChildren().stream().filter(child -> !child.isDir()).collect(Collectors.toList()); - DownloadUtil.getDownloadTracker(requireContext()).download( - MappingUtil.mapDownloads(songs), - songs.stream().map(Download::new).collect(Collectors.toList()) - ); + DownloadDirectoryDialog dialog = new DownloadDirectoryDialog(new DialogClickCallback() { + @Override + public void onPositiveClick() { + directoryViewModel.loadMusicDirectory(getArguments().getString(Constants.MUSIC_DIRECTORY_ID)).observe(getViewLifecycleOwner(), directory -> { + if (isVisible() && getActivity() != null) { + List songs = directory.getChildren().stream().filter(child -> !child.isDir()).collect(Collectors.toList()); + DownloadUtil.getDownloadTracker(requireContext()).download( + MappingUtil.mapDownloads(songs), + songs.stream().map(Download::new).collect(Collectors.toList()) + ); + } + }); } }); + + dialog.show(activity.getSupportFragmentManager(), null); + return true; } @@ -144,6 +158,14 @@ public class DirectoryFragment extends Fragment implements ClickCallback { bind.directoryTitleLabel.setText(directory.getName()); musicDirectoryAdapter.setItems(directory.getChildren()); + + menuItem.setVisible( + directory.getChildren() != null && directory.getChildren() + .stream() + .filter(child -> !child.isDir()) + .findFirst() + .orElse(null) != null + ); }); } diff --git a/app/src/main/res/layout/dialog_download_directory.xml b/app/src/main/res/layout/dialog_download_directory.xml new file mode 100644 index 00000000..4afbda8b --- /dev/null +++ b/app/src/main/res/layout/dialog_download_directory.xml @@ -0,0 +1,15 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/menu/directory_page_menu.xml b/app/src/main/res/menu/directory_page_menu.xml index f91577b6..342d24ad 100644 --- a/app/src/main/res/menu/directory_page_menu.xml +++ b/app/src/main/res/menu/directory_page_menu.xml @@ -5,5 +5,6 @@ android:id="@+id/action_download_directory" android:icon="@drawable/ic_file_download" android:title="@string/menu_download_all_button" + android:visible="false" app:showAsAction="never" /> \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 2c7f37c1..02048d69 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -55,6 +55,12 @@ Continue Please be aware that continuing with this action will result in the permanent deletion of all saved items downloaded from all servers. Delete saved items + + Cancel + Download + All tracks in this folder will be downloaded. Tracks present in subfolders will not be downloaded. + Download the tracks + Once you download a song, you\'ll find it here No downloads yet! %1$s • %2$s items