From f172a00fb71c493964a94a46bef9c9023498d1db Mon Sep 17 00:00:00 2001 From: antonio Date: Sun, 17 Sep 2023 16:43:09 +0200 Subject: [PATCH] feat: implemented updating shared items through dialog --- .../tempo/interfaces/ClickCallback.java | 2 + .../tempo/ui/dialog/ShareUpdateDialog.java | 137 ++++++++++++++++++ .../cappielloantonio/tempo/util/Constants.kt | 2 + .../main/res/layout/dialog_share_update.xml | 50 +++++++ app/src/main/res/navigation/nav_graph.xml | 5 + app/src/main/res/values-de/strings.xml | 1 + app/src/main/res/values/strings.xml | 12 ++ 7 files changed, 209 insertions(+) create mode 100644 app/src/main/java/com/cappielloantonio/tempo/ui/dialog/ShareUpdateDialog.java create mode 100644 app/src/main/res/layout/dialog_share_update.xml diff --git a/app/src/main/java/com/cappielloantonio/tempo/interfaces/ClickCallback.java b/app/src/main/java/com/cappielloantonio/tempo/interfaces/ClickCallback.java index c4d26133..d65695cb 100644 --- a/app/src/main/java/com/cappielloantonio/tempo/interfaces/ClickCallback.java +++ b/app/src/main/java/com/cappielloantonio/tempo/interfaces/ClickCallback.java @@ -30,4 +30,6 @@ public interface ClickCallback { default void onMusicDirectoryClick(Bundle bundle) {} default void onMusicIndexClick(Bundle bundle) {} default void onDownloadGroupLongClick(Bundle bundle) {} + default void onShareClick(Bundle bundle) {} + default void onShareLongClick(Bundle bundle) {} } diff --git a/app/src/main/java/com/cappielloantonio/tempo/ui/dialog/ShareUpdateDialog.java b/app/src/main/java/com/cappielloantonio/tempo/ui/dialog/ShareUpdateDialog.java new file mode 100644 index 00000000..c8aa2e5a --- /dev/null +++ b/app/src/main/java/com/cappielloantonio/tempo/ui/dialog/ShareUpdateDialog.java @@ -0,0 +1,137 @@ +package com.cappielloantonio.tempo.ui.dialog; + +import android.app.AlertDialog; +import android.app.Dialog; +import android.os.Bundle; +import android.text.TextUtils; + +import androidx.annotation.NonNull; +import androidx.fragment.app.DialogFragment; +import androidx.lifecycle.ViewModelProvider; + +import com.cappielloantonio.tempo.R; +import com.cappielloantonio.tempo.databinding.DialogShareUpdateBinding; +import com.cappielloantonio.tempo.util.UIUtil; +import com.cappielloantonio.tempo.viewmodel.HomeViewModel; +import com.cappielloantonio.tempo.viewmodel.ShareBottomSheetViewModel; +import com.google.android.material.datepicker.CalendarConstraints; +import com.google.android.material.datepicker.DateValidatorPointForward; +import com.google.android.material.datepicker.MaterialDatePicker; +import com.google.android.material.datepicker.MaterialPickerOnPositiveButtonClickListener; + +import java.util.Calendar; +import java.util.Date; +import java.util.Objects; + +public class ShareUpdateDialog extends DialogFragment { + private static final String TAG = "ShareUpdateDialog"; + + private DialogShareUpdateBinding bind; + private HomeViewModel homeViewModel; + private ShareBottomSheetViewModel shareBottomSheetViewModel; + + private MaterialDatePicker datePicker; + + private String descriptionTextView; + private String expirationTextView; + private long expiration; + + @NonNull + @Override + public Dialog onCreateDialog(Bundle savedInstanceState) { + homeViewModel = new ViewModelProvider(requireActivity()).get(HomeViewModel.class); + shareBottomSheetViewModel = new ViewModelProvider(requireActivity()).get(ShareBottomSheetViewModel.class); + + bind = DialogShareUpdateBinding.inflate(getLayoutInflater()); + + AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); + + builder.setView(bind.getRoot()) + .setTitle(R.string.share_update_dialog_title) + .setPositiveButton(R.string.share_update_dialog_positive_button, (dialog, id) -> { + }) + .setNegativeButton(R.string.share_update_dialog_negative_button, (dialog, id) -> dialog.cancel()); + + return builder.create(); + } + + @Override + public void onStart() { + super.onStart(); + + setShareInfo(); + setShareCalendar(); + setButtonAction(); + } + + @Override + public void onDestroyView() { + super.onDestroyView(); + bind = null; + } + + private void setShareInfo() { + if (shareBottomSheetViewModel.getShare() != null) { + bind.shareDescriptionTextView.setText(shareBottomSheetViewModel.getShare().getDescription()); + // bind.shareExpirationTextView.setText(shareBottomSheetViewModel.getShare().getExpires()); + } + } + + private void setShareCalendar() { + expiration = shareBottomSheetViewModel.getShare().getExpires().getTime(); + + bind.shareExpirationTextView.setText(UIUtil.getReadableDate(new Date(expiration))); + + bind.shareExpirationTextView.setFocusable(false); + bind.shareExpirationTextView.setOnLongClickListener(null); + + bind.shareExpirationTextView.setOnClickListener(view -> { + CalendarConstraints constraints = new CalendarConstraints.Builder() + .setValidator(DateValidatorPointForward.now()) + .build(); + + datePicker = MaterialDatePicker.Builder.datePicker() + .setCalendarConstraints(constraints) + .setSelection(expiration) + .build(); + + datePicker.addOnPositiveButtonClickListener(selection -> { + expiration = selection; + bind.shareExpirationTextView.setText(UIUtil.getReadableDate(new Date(selection))); + }); + + datePicker.show(requireActivity().getSupportFragmentManager(), null); + }); + } + + private void setButtonAction() { + ((AlertDialog) Objects.requireNonNull(getDialog())).getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener(v -> { + if (validateInput()) { + updateShare(); + Objects.requireNonNull(getDialog()).dismiss(); + } + }); + } + + private boolean validateInput() { + descriptionTextView = Objects.requireNonNull(bind.shareDescriptionTextView.getText()).toString().trim(); + expirationTextView = Objects.requireNonNull(bind.shareExpirationTextView.getText()).toString().trim(); + + if (TextUtils.isEmpty(descriptionTextView)) { + bind.shareDescriptionTextView.setError(getString(R.string.error_required)); + return false; + } + + if (TextUtils.isEmpty(expirationTextView)) { + bind.shareExpirationTextView.setError(getString(R.string.error_required)); + return false; + } + + return true; + } + + private void updateShare() { + shareBottomSheetViewModel.updateShare(descriptionTextView, expiration); + homeViewModel.refreshShares(requireActivity()); + } +} diff --git a/app/src/main/java/com/cappielloantonio/tempo/util/Constants.kt b/app/src/main/java/com/cappielloantonio/tempo/util/Constants.kt index 37a2039f..d4818482 100644 --- a/app/src/main/java/com/cappielloantonio/tempo/util/Constants.kt +++ b/app/src/main/java/com/cappielloantonio/tempo/util/Constants.kt @@ -86,6 +86,8 @@ object Constants { const val DOWNLOAD_GROUP_TITLE = "download_group_title" const val DOWNLOAD_GROUP_SUBTITLE = "download_group_subtitle" + const val SHARE_OBJECT = "share_object" + const val PLAYABLE_MEDIA_LIMIT = 100 const val PRE_PLAYABLE_MEDIA = 15 } \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_share_update.xml b/app/src/main/res/layout/dialog_share_update.xml new file mode 100644 index 00000000..e8ba4dcf --- /dev/null +++ b/app/src/main/res/layout/dialog_share_update.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/navigation/nav_graph.xml b/app/src/main/res/navigation/nav_graph.xml index d637b345..f1567f95 100644 --- a/app/src/main/res/navigation/nav_graph.xml +++ b/app/src/main/res/navigation/nav_graph.xml @@ -330,4 +330,9 @@ android:name="com.cappielloantonio.tempo.ui.fragment.bottomsheetdialog.PodcastChannelBottomSheetDialog" android:label="PodcastChannelBottomSheetDialog" tools:layout="@layout/bottom_sheet_podcast_channel_dialog" /> + \ No newline at end of file diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index b175a573..615a2ba1 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -89,6 +89,7 @@ Kürzlich hinzugefügt Alle zeigen Alle mischen + Shares ★ Lieblingsalben Alle zeigen ★ Lieblingskünstler diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 70629b0d..8bba4233 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -13,6 +13,7 @@ Play next Remove all Shuffle + Share Albums Browse Albums Error retrieving artist @@ -89,6 +90,7 @@ Recently added See all Shuffle all + Shares ★ Starred albums See all ★ Starred artists @@ -246,6 +248,15 @@ Version Stream via Wi-Fi only alert Ask for user confirmation before streaming over mobile network. + Copy link + Delete share + Update share + Expiration date: %1$s + Cancel + Save + Description + Expiration date + Share Add to playlist Add to queue Download @@ -253,6 +264,7 @@ Error retrieving artist Go to album Go to artist + Share Instant mix Play next Rate