diff options
author | Neil Seligmann <git@neilseligmann.com> | 2022-01-05 02:04:12 +0300 |
---|---|---|
committer | Niedermann IT-Dienstleistungen <stefan-niedermann@users.noreply.github.com> | 2022-01-10 11:51:09 +0300 |
commit | dfa6f07c1ddab1ad360d898d9dcad94f56186541 (patch) | |
tree | 2d075fee6cb58e74d87066f2de424f43f24a133e /app | |
parent | a38c176c77245c1de108e300bceba331c95d2a0e (diff) |
feat: StackFragment automatic scroll to bottom on card creation
Diffstat (limited to 'app')
4 files changed, 62 insertions, 1 deletions
diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/ui/MainActivity.java b/app/src/main/java/it/niedermann/nextcloud/deck/ui/MainActivity.java index 8c1f30f70..1e0af361f 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/ui/MainActivity.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/ui/MainActivity.java @@ -58,6 +58,7 @@ import androidx.core.content.ContextCompat; import androidx.core.graphics.drawable.DrawableCompat; import androidx.core.view.GravityCompat; import androidx.core.view.ViewCompat; +import androidx.fragment.app.Fragment; import androidx.lifecycle.LiveData; import androidx.lifecycle.Observer; import androidx.lifecycle.ViewModelProvider; @@ -95,6 +96,7 @@ import it.niedermann.nextcloud.deck.exceptions.OfflineException; import it.niedermann.nextcloud.deck.model.Account; import it.niedermann.nextcloud.deck.model.Board; import it.niedermann.nextcloud.deck.model.Stack; +import it.niedermann.nextcloud.deck.model.Card; import it.niedermann.nextcloud.deck.model.full.FullBoard; import it.niedermann.nextcloud.deck.model.full.FullCard; import it.niedermann.nextcloud.deck.model.full.FullStack; @@ -112,6 +114,7 @@ import it.niedermann.nextcloud.deck.ui.board.EditBoardListener; import it.niedermann.nextcloud.deck.ui.branding.BrandedSnackbar; import it.niedermann.nextcloud.deck.ui.card.CardAdapter; import it.niedermann.nextcloud.deck.ui.card.NewCardDialog; +import it.niedermann.nextcloud.deck.ui.card.CreateCardListener; import it.niedermann.nextcloud.deck.ui.exception.ExceptionDialogFragment; import it.niedermann.nextcloud.deck.ui.exception.ExceptionHandler; import it.niedermann.nextcloud.deck.ui.filter.FilterDialogFragment; @@ -129,7 +132,7 @@ import it.niedermann.nextcloud.deck.ui.upcomingcards.UpcomingCardsActivity; import it.niedermann.nextcloud.deck.util.CustomAppGlideModule; import it.niedermann.nextcloud.deck.util.DrawerMenuUtil; -public class MainActivity extends AppCompatActivity implements DeleteStackListener, EditStackListener, DeleteBoardListener, EditBoardListener, ArchiveBoardListener, OnScrollListener, OnNavigationItemSelectedListener { +public class MainActivity extends AppCompatActivity implements DeleteStackListener, EditStackListener, DeleteBoardListener, EditBoardListener, ArchiveBoardListener, OnScrollListener, CreateCardListener, OnNavigationItemSelectedListener { protected ActivityMainBinding binding; protected NavHeaderMainBinding headerBinding; @@ -1008,6 +1011,32 @@ public class MainActivity extends AppCompatActivity implements DeleteStackListen } } + /** + * Find a StackFragment by it's ID, may return null. + * @param stackId ID of the stack to find + * @return Instance of StackFragment + */ + public StackFragment findStackFragmentById(long stackId) { + StackFragment fragment = (StackFragment) getSupportFragmentManager().findFragmentByTag("f" + stackId); + return fragment; + } + + /** + * This method is called when a new Card is created + * @param createdCard The new Card's data + */ + @Override + public void onCardCreated(FullCard createdCard) { + Card card = createdCard.getCard(); + DeckLog.log("Card Created! Title:" + card.getTitle() + " in stack ID: " + card.getStackId()); + + // Scroll the given StackFragment to the bottom, so the new Card is in view. + StackFragment fragment = findStackFragmentById(card.getStackId()); + if (fragment != null) { + fragment.scrollToBottom(); + } + } + @Override public void onStackDeleted(long stackLocalId) { int nextStackPosition; diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/CreateCardListener.java b/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/CreateCardListener.java new file mode 100644 index 000000000..522b7dc60 --- /dev/null +++ b/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/CreateCardListener.java @@ -0,0 +1,11 @@ +package it.niedermann.nextcloud.deck.ui.card; + +import it.niedermann.nextcloud.deck.model.full.FullCard; + +public interface CreateCardListener { + /** + * This method is called when a new Card is created + * @param createdCard The new Card's data + */ + void onCardCreated(FullCard createdCard); +}
\ No newline at end of file diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/NewCardDialog.java b/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/NewCardDialog.java index f8bfbe25b..466d4a2c6 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/NewCardDialog.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/NewCardDialog.java @@ -23,6 +23,7 @@ import androidx.fragment.app.DialogFragment; import androidx.lifecycle.MutableLiveData; import androidx.lifecycle.ViewModelProvider; +import it.niedermann.nextcloud.deck.DeckLog; import it.niedermann.nextcloud.deck.R; import it.niedermann.nextcloud.deck.api.IResponseCallback; import it.niedermann.nextcloud.deck.databinding.DialogNewCardBinding; @@ -36,6 +37,8 @@ public class NewCardDialog extends DialogFragment implements DialogInterface.OnC private PrepareCreateViewModel viewModel; + private CreateCardListener createCardListener; + private static final String ARG_ACCOUNT = "account"; private static final String ARG_BOARD_LOCAL_ID = "board_id"; private static final String ARG_STACK_LOCAL_ID = "stack_id"; @@ -53,6 +56,13 @@ public class NewCardDialog extends DialogFragment implements DialogInterface.OnC @Override public void onAttach(@NonNull Context context) { super.onAttach(context); + + if (context instanceof CreateCardListener) { + this.createCardListener = (CreateCardListener) context; + } else { + throw new ClassCastException("Caller must implement " + CreateCardListener.class.getCanonicalName()); + } + final var args = getArguments(); if (args == null) { throw new IllegalArgumentException("Provide " + ARG_ACCOUNT + ", " + ARG_BOARD_LOCAL_ID + " and " + ARG_STACK_LOCAL_ID); @@ -166,6 +176,8 @@ public class NewCardDialog extends DialogFragment implements DialogInterface.OnC @Override public void onResponse(FullCard createdCard) { requireActivity().runOnUiThread(() -> { + createCardListener.onCardCreated(createdCard); + if (openOnSuccess) { startActivity(EditActivity.createEditCardIntent(requireContext(), account, boardLocalId, createdCard.getLocalId())); } diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/ui/stack/StackFragment.java b/app/src/main/java/it/niedermann/nextcloud/deck/ui/stack/StackFragment.java index 61f58a9d4..bf33bf996 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/ui/stack/StackFragment.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/ui/stack/StackFragment.java @@ -2,6 +2,7 @@ package it.niedermann.nextcloud.deck.ui.stack; import android.content.Context; import android.os.Bundle; +import android.util.AttributeSet; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -175,4 +176,12 @@ public class StackFragment extends Fragment implements DragAndDropTab<CardAdapte }); } + /** + * Scroll to the bottom of the fragment + */ + public void scrollToBottom() { + activity.runOnUiThread(() -> { + binding.recyclerView.smoothScrollToPosition(adapter.getItemCount()); + }); + } }
\ No newline at end of file |