From 60da08cdbcc3821dc4ff84e783d04224eb9a7b20 Mon Sep 17 00:00:00 2001 From: antonio Date: Sat, 12 Aug 2023 23:25:00 +0200 Subject: [PATCH] feat: implemented folder download feature for on-screen visible files (not folder and files in subfolder) --- .../tempo/ui/fragment/DirectoryFragment.java | 41 +++++++++++++++++++ app/src/main/res/menu/directory_page_menu.xml | 9 ++++ 2 files changed, 50 insertions(+) create mode 100644 app/src/main/res/menu/directory_page_menu.xml 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 f4746d73..aad8f7ee 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 @@ -3,10 +3,14 @@ package com.cappielloantonio.tempo.ui.fragment; import android.content.ComponentName; import android.os.Bundle; import android.view.LayoutInflater; +import android.view.Menu; +import android.view.MenuInflater; +import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import androidx.core.view.ViewCompat; import androidx.fragment.app.Fragment; import androidx.lifecycle.ViewModelProvider; @@ -19,14 +23,21 @@ 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.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.util.Constants; +import com.cappielloantonio.tempo.util.DownloadUtil; +import com.cappielloantonio.tempo.util.MappingUtil; import com.cappielloantonio.tempo.viewmodel.DirectoryViewModel; import com.google.common.util.concurrent.ListenableFuture; +import java.util.List; +import java.util.stream.Collectors; + @UnstableApi public class DirectoryFragment extends Fragment implements ClickCallback { private static final String TAG = "DirectoryFragment"; @@ -39,6 +50,18 @@ public class DirectoryFragment extends Fragment implements ClickCallback { private ListenableFuture mediaBrowserListenableFuture; + @Override + public void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setHasOptionsMenu(true); + } + + @Override + public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) { + super.onCreateOptionsMenu(menu, inflater); + inflater.inflate(R.menu.directory_page_menu, menu); + } + @Override public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { activity = (MainActivity) getActivity(); @@ -71,6 +94,24 @@ public class DirectoryFragment extends Fragment implements ClickCallback { bind = null; } + @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()) + ); + } + }); + return true; + } + + return false; + } + private void initAppBar() { activity.setSupportActionBar(bind.toolbar); diff --git a/app/src/main/res/menu/directory_page_menu.xml b/app/src/main/res/menu/directory_page_menu.xml new file mode 100644 index 00000000..f91577b6 --- /dev/null +++ b/app/src/main/res/menu/directory_page_menu.xml @@ -0,0 +1,9 @@ + + + + \ No newline at end of file