diff options
Diffstat (limited to 'app/src/main/java/it/niedermann/nextcloud/deck/ui/card/details/CardDetailsFragment.java')
-rw-r--r-- | app/src/main/java/it/niedermann/nextcloud/deck/ui/card/details/CardDetailsFragment.java | 165 |
1 files changed, 40 insertions, 125 deletions
diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/details/CardDetailsFragment.java b/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/details/CardDetailsFragment.java index 76c99abe9..d86f9361a 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/details/CardDetailsFragment.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/details/CardDetailsFragment.java @@ -27,23 +27,14 @@ import androidx.recyclerview.widget.GridLayoutManager; import com.google.android.material.chip.Chip; import com.google.android.material.snackbar.Snackbar; +import com.nextcloud.android.common.ui.theme.utils.ColorRole; import com.nextcloud.android.sso.exceptions.NextcloudFilesAppAccountNotFoundException; -import com.wdullaer.materialdatetimepicker.date.DatePickerDialog; -import com.wdullaer.materialdatetimepicker.date.DatePickerDialog.OnDateSetListener; -import com.wdullaer.materialdatetimepicker.time.TimePickerDialog; -import com.wdullaer.materialdatetimepicker.time.TimePickerDialog.OnTimeSetListener; - -import java.time.LocalDate; -import java.time.LocalTime; -import java.time.ZoneId; -import java.time.ZonedDateTime; -import java.time.format.DateTimeFormatter; -import java.time.format.FormatStyle; + +import java.time.Instant; import java.util.stream.Stream; import it.niedermann.android.markdown.MarkdownEditor; import it.niedermann.android.util.ColorUtil; -import it.niedermann.android.util.DimensionUtil; import it.niedermann.nextcloud.deck.DeckLog; import it.niedermann.nextcloud.deck.R; import it.niedermann.nextcloud.deck.databinding.FragmentCardEditTabDetailsBinding; @@ -59,17 +50,13 @@ import it.niedermann.nextcloud.deck.ui.card.assignee.CardAssigneeDialog; import it.niedermann.nextcloud.deck.ui.card.assignee.CardAssigneeListener; import it.niedermann.nextcloud.deck.ui.exception.ExceptionDialogFragment; import it.niedermann.nextcloud.deck.ui.theme.ThemeUtils; -import it.niedermann.nextcloud.deck.ui.theme.ThemedDatePickerDialog; import it.niedermann.nextcloud.deck.ui.theme.ThemedSnackbar; -import it.niedermann.nextcloud.deck.ui.theme.ThemedTimePickerDialog; -public class CardDetailsFragment extends Fragment implements OnDateSetListener, OnTimeSetListener, CardAssigneeListener { +public class CardDetailsFragment extends Fragment implements CardDueDateView.DueDateChangedListener, CardAssigneeListener { private FragmentCardEditTabDetailsBinding binding; private EditCardViewModel viewModel; private AssigneeAdapter adapter; - private final DateTimeFormatter dateFormatter = DateTimeFormatter.ofLocalizedDate(FormatStyle.MEDIUM); - private final DateTimeFormatter timeFormatter = DateTimeFormatter.ofLocalizedTime(FormatStyle.SHORT); private static final String KEY_ACCOUNT = "account"; public static Fragment newInstance(@NonNull Account account) { @@ -102,9 +89,9 @@ public class CardDetailsFragment extends Fragment implements OnDateSetListener, return binding.getRoot(); } - @Px final int avatarSize = DimensionUtil.INSTANCE.dpToPx(requireContext(), R.dimen.avatar_size); + @Px final int avatarSize = getResources().getDimensionPixelSize(R.dimen.avatar_size); final var avatarLayoutParams = new LinearLayout.LayoutParams(avatarSize, avatarSize); - avatarLayoutParams.setMargins(0, 0, DimensionUtil.INSTANCE.dpToPx(requireContext(), R.dimen.spacer_1x), 0); + avatarLayoutParams.setMargins(0, 0, getResources().getDimensionPixelSize(R.dimen.spacer_1x), 0); setupAssignees(); setupLabels((Account) args.getSerializable(KEY_ACCOUNT)); @@ -121,16 +108,16 @@ public class CardDetailsFragment extends Fragment implements OnDateSetListener, viewModel.getBoardColor().observe(getViewLifecycleOwner(), this::applyTheme); } - @Override - public void onResume() { - super.onResume(); - - // https://github.com/wdullaer/MaterialDateTimePicker#why-are-my-callbacks-lost-when-the-device-changes-orientation - final var dpd = (DatePickerDialog) getChildFragmentManager().findFragmentByTag(ThemedDatePickerDialog.class.getCanonicalName()); - final var tpd = (TimePickerDialog) getChildFragmentManager().findFragmentByTag(ThemedTimePickerDialog.class.getCanonicalName()); - if (tpd != null) tpd.setOnTimeSetListener(this); - if (dpd != null) dpd.setOnDateSetListener(this); - } +// @Override +// public void onResume() { +// super.onResume(); +// +// // https://github.com/wdullaer/MaterialDateTimePicker#why-are-my-callbacks-lost-when-the-device-changes-orientation +// final var dpd = (DatePickerDialog) getChildFragmentManager().findFragmentByTag(ThemedDatePickerDialog.class.getCanonicalName()); +// final var tpd = (TimePickerDialog) getChildFragmentManager().findFragmentByTag(ThemedTimePickerDialog.class.getCanonicalName()); +// if (tpd != null) tpd.setOnTimeSetListener(this); +// if (dpd != null) dpd.setOnDateSetListener(this); +// } @Override public void onDestroy() { @@ -143,12 +130,13 @@ public class CardDetailsFragment extends Fragment implements OnDateSetListener, Stream.of( binding.labelsWrapper, - binding.dueDateDateWrapper, - binding.dueDateTimeWrapper, binding.peopleWrapper, binding.descriptionEditorWrapper ).forEach(utils.material::colorTextInputLayout); + utils.platform.colorImageView(binding.descriptionToggle, ColorRole.SECONDARY); + + binding.cardDueDateView.applyTheme(color); binding.descriptionEditor.setSearchColor(color); binding.descriptionViewer.setSearchColor(color); @@ -194,53 +182,27 @@ public class CardDetailsFragment extends Fragment implements OnDateSetListener, } private void setupDueDate() { - if (this.viewModel.getFullCard().getCard().getDueDate() != null) { - final var dueDate = this.viewModel.getFullCard().getCard().getDueDate().atZone(ZoneId.systemDefault()); - binding.dueDateDate.setText(dueDate == null ? null : dueDate.format(dateFormatter)); - binding.dueDateTime.setText(dueDate == null ? null : dueDate.format(timeFormatter)); - binding.clearDueDate.setVisibility(VISIBLE); - } else { - binding.clearDueDate.setVisibility(GONE); - binding.dueDateDate.setText(null); - binding.dueDateTime.setText(null); - } - - if (viewModel.canEdit()) { - binding.dueDateDate.setOnClickListener(v -> { - final LocalDate date; - if (viewModel.getFullCard() != null && viewModel.getFullCard().getCard() != null && viewModel.getFullCard().getCard().getDueDate() != null) { - date = viewModel.getFullCard().getCard().getDueDate().atZone(ZoneId.systemDefault()).toLocalDate(); - } else { - date = LocalDate.now(); - } - viewModel.getCurrentBoardColor(viewModel.getAccount().getId(), viewModel.getBoardId()) - .thenAcceptAsync(color -> ThemedDatePickerDialog.newInstance(this, date.getYear(), date.getMonthValue(), date.getDayOfMonth(), color) - .show(getChildFragmentManager(), ThemedDatePickerDialog.class.getCanonicalName()), ContextCompat.getMainExecutor(requireContext())); - }); + final var version = this.viewModel.getAccount().getServerDeckVersionAsObject(); + final var card = this.viewModel.getFullCard().getCard(); + binding.cardDueDateView.setDueDateListener(this); + binding.cardDueDateView.setEnabled(this.viewModel.canEdit()); + binding.cardDueDateView.setDueDate(getChildFragmentManager(), version, card.getDueDate(), card.getDone()); + } - binding.dueDateTime.setOnClickListener(v -> { - final LocalTime time; - if (viewModel.getFullCard() != null && viewModel.getFullCard().getCard() != null && viewModel.getFullCard().getCard().getDueDate() != null) { - time = viewModel.getFullCard().getCard().getDueDate().atZone(ZoneId.systemDefault()).toLocalTime(); - } else { - time = LocalTime.now(); - } - viewModel.getCurrentBoardColor(viewModel.getAccount().getId(), viewModel.getBoardId()) - .thenAcceptAsync(color -> ThemedTimePickerDialog.newInstance(this, time.getHour(), time.getMinute(), true, color) - .show(getChildFragmentManager(), ThemedTimePickerDialog.class.getCanonicalName()), ContextCompat.getMainExecutor(requireContext())); - }); + @Override + public void onDueDateChanged(@Nullable Instant dueDate) { + final var version = this.viewModel.getAccount().getServerDeckVersionAsObject(); + final var card = this.viewModel.getFullCard().getCard(); + card.setDueDate(dueDate); + binding.cardDueDateView.setDueDate(getChildFragmentManager(), version, card.getDueDate(), card.getDone()); + } - binding.clearDueDate.setOnClickListener(v -> { - binding.dueDateDate.setText(null); - binding.dueDateTime.setText(null); - viewModel.getFullCard().getCard().setDueDate(null); - binding.clearDueDate.setVisibility(GONE); - }); - } else { - binding.dueDateDate.setEnabled(false); - binding.dueDateTime.setEnabled(false); - binding.clearDueDate.setVisibility(GONE); - } + @Override + public void onDoneChanged(@Nullable Instant done) { + final var version = this.viewModel.getAccount().getServerDeckVersionAsObject(); + final var card = this.viewModel.getFullCard().getCard(); + card.setDone(done); + binding.cardDueDateView.setDueDate(getChildFragmentManager(), version, card.getDueDate(), card.getDone()); } private void setupLabels(@NonNull Account account) { @@ -333,8 +295,8 @@ public class CardDetailsFragment extends Fragment implements OnDateSetListener, adapter = new AssigneeAdapter((user) -> CardAssigneeDialog.newInstance(user).show(getChildFragmentManager(), CardAssigneeDialog.class.getSimpleName()), viewModel.getAccount()); binding.assignees.setAdapter(adapter); binding.assignees.post(() -> { - @Px final int gutter = DimensionUtil.INSTANCE.dpToPx(requireContext(), R.dimen.spacer_1x); - final int spanCount = (int) (float) binding.labelsWrapper.getWidth() / (DimensionUtil.INSTANCE.dpToPx(requireContext(), R.dimen.avatar_size) + gutter); + @Px final int gutter = getResources().getDimensionPixelSize(R.dimen.spacer_1x); + final int spanCount = (int) (float) binding.labelsWrapper.getWidth() / (getResources().getDimensionPixelSize(R.dimen.avatar_size) + gutter); binding.assignees.setLayoutManager(new GridLayoutManager(getContext(), spanCount)); binding.assignees.addItemDecoration(new AssigneeDecoration(spanCount, gutter)); }); @@ -364,53 +326,6 @@ public class CardDetailsFragment extends Fragment implements OnDateSetListener, } } - @Override - public void onDateSet(DatePickerDialog view, int year, int monthOfYear, int dayOfMonth) { - int hourOfDay; - int minute; - - final var selectedTime = binding.dueDateTime.getText(); - if (TextUtils.isEmpty(selectedTime)) { - hourOfDay = 0; - minute = 0; - } else { - final LocalTime oldTime = LocalTime.from(this.viewModel.getFullCard().getCard().getDueDate().atZone(ZoneId.systemDefault())); - hourOfDay = oldTime.getHour(); - minute = oldTime.getMinute(); - } - - final var newDateTime = ZonedDateTime.of( - LocalDate.of(year, monthOfYear + 1, dayOfMonth), - LocalTime.of(hourOfDay, minute), - ZoneId.systemDefault() - ); - this.viewModel.getFullCard().getCard().setDueDate(newDateTime.toInstant()); - binding.dueDateDate.setText(newDateTime.format(dateFormatter)); - - if (this.viewModel.getFullCard().getCard().getDueDate() == null || this.viewModel.getFullCard().getCard().getDueDate().toEpochMilli() == 0) { - binding.clearDueDate.setVisibility(GONE); - } else { - binding.clearDueDate.setVisibility(VISIBLE); - } - } - - @Override - public void onTimeSet(TimePickerDialog view, int hourOfDay, int minute, int second) { - final var oldInstant = this.viewModel.getFullCard().getCard().getDueDate(); - final var oldDateTime = oldInstant == null ? ZonedDateTime.now() : oldInstant.atZone(ZoneId.systemDefault()); - final var newDateTime = oldDateTime.with( - LocalTime.of(hourOfDay, minute) - ); - - this.viewModel.getFullCard().getCard().setDueDate(newDateTime.toInstant()); - binding.dueDateTime.setText(newDateTime.format(timeFormatter)); - if (this.viewModel.getFullCard().getCard().getDueDate() == null || this.viewModel.getFullCard().getCard().getDueDate().toEpochMilli() == 0) { - binding.clearDueDate.setVisibility(GONE); - } else { - binding.clearDueDate.setVisibility(VISIBLE); - } - } - private void setupProjects() { if (viewModel.getFullCard().getProjects().size() > 0) { binding.projectsTitle.setVisibility(VISIBLE); |