Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/stefan-niedermann/nextcloud-deck.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
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.java165
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);