From 64598961494f1168e39a18ae7086067fcd844b07 Mon Sep 17 00:00:00 2001 From: Stefan Niedermann Date: Thu, 9 Apr 2020 09:27:30 +0200 Subject: #358 Create PickStackActivity Rename PickStackActivity to PrepareCreateActivity Signed-off-by: Stefan Niedermann --- .../deck/ui/pickstack/AccountAdapter.java | 71 ------- .../nextcloud/deck/ui/pickstack/BoardAdapter.java | 68 ------- .../deck/ui/pickstack/PickStackActivity.java | 220 --------------------- .../nextcloud/deck/ui/pickstack/StackAdapter.java | 66 ------- .../deck/ui/preparecreate/AccountAdapter.java | 71 +++++++ .../deck/ui/preparecreate/BoardAdapter.java | 68 +++++++ .../ui/preparecreate/PrepareCreateActivity.java | 220 +++++++++++++++++++++ .../deck/ui/preparecreate/StackAdapter.java | 66 +++++++ .../deck/ui/tiles/EditCardTileService.java | 4 +- 9 files changed, 427 insertions(+), 427 deletions(-) delete mode 100644 app/src/main/java/it/niedermann/nextcloud/deck/ui/pickstack/AccountAdapter.java delete mode 100644 app/src/main/java/it/niedermann/nextcloud/deck/ui/pickstack/BoardAdapter.java delete mode 100644 app/src/main/java/it/niedermann/nextcloud/deck/ui/pickstack/PickStackActivity.java delete mode 100644 app/src/main/java/it/niedermann/nextcloud/deck/ui/pickstack/StackAdapter.java create mode 100644 app/src/main/java/it/niedermann/nextcloud/deck/ui/preparecreate/AccountAdapter.java create mode 100644 app/src/main/java/it/niedermann/nextcloud/deck/ui/preparecreate/BoardAdapter.java create mode 100644 app/src/main/java/it/niedermann/nextcloud/deck/ui/preparecreate/PrepareCreateActivity.java create mode 100644 app/src/main/java/it/niedermann/nextcloud/deck/ui/preparecreate/StackAdapter.java (limited to 'app/src/main/java/it/niedermann/nextcloud/deck/ui') diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/ui/pickstack/AccountAdapter.java b/app/src/main/java/it/niedermann/nextcloud/deck/ui/pickstack/AccountAdapter.java deleted file mode 100644 index 742ade26d..000000000 --- a/app/src/main/java/it/niedermann/nextcloud/deck/ui/pickstack/AccountAdapter.java +++ /dev/null @@ -1,71 +0,0 @@ -package it.niedermann.nextcloud.deck.ui.pickstack; - -import android.content.Context; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.ArrayAdapter; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; - -import org.jetbrains.annotations.NotNull; - -import java.util.Objects; - -import it.niedermann.nextcloud.deck.DeckLog; -import it.niedermann.nextcloud.deck.R; -import it.niedermann.nextcloud.deck.databinding.ItemPickStackAccountBinding; -import it.niedermann.nextcloud.deck.model.Account; -import it.niedermann.nextcloud.deck.util.ViewUtil; - -import static it.niedermann.nextcloud.deck.util.DimensionUtil.getAvatarDimension; - -public class AccountAdapter extends ArrayAdapter { - - @NonNull - private final LayoutInflater inflater; - - @SuppressWarnings("WeakerAccess") - public AccountAdapter(@NonNull Context context) { - super(context, R.layout.item_pick_stack_account); - setDropDownViewResource(R.layout.item_pick_stack_account); - inflater = LayoutInflater.from(context); - } - - @Override - public boolean hasStableIds() { - return true; - } - - @Override - public long getItemId(int position) { - return Objects.requireNonNull(getItem(position)).getId(); - } - - @NotNull - @Override - public View getView(int position, View convertView, @NotNull ViewGroup parent) { - final ItemPickStackAccountBinding binding; - if (convertView == null) { - binding = ItemPickStackAccountBinding.inflate(inflater, parent, false); - } else { - binding = ItemPickStackAccountBinding.bind(convertView); - } - - final Account item = getItem(position); - if (item != null) { - binding.username.setText(item.getUserName()); - binding.instance.setText(item.getUrl()); - ViewUtil.addAvatar(binding.avatar.getContext(), binding.avatar, item.getUrl(), item.getUserName(), getAvatarDimension(binding.avatar.getContext(), R.dimen.icon_size_details), R.drawable.ic_person_grey600_24dp); - } else { - DeckLog.logError(new IllegalArgumentException("No item for position " + position)); - } - return binding.getRoot(); - } - - @Override - public View getDropDownView(int position, @Nullable View convertView, @NonNull ViewGroup parent) { - return getView(position, convertView, parent); - } -} diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/ui/pickstack/BoardAdapter.java b/app/src/main/java/it/niedermann/nextcloud/deck/ui/pickstack/BoardAdapter.java deleted file mode 100644 index 990b7c7d5..000000000 --- a/app/src/main/java/it/niedermann/nextcloud/deck/ui/pickstack/BoardAdapter.java +++ /dev/null @@ -1,68 +0,0 @@ -package it.niedermann.nextcloud.deck.ui.pickstack; - -import android.content.Context; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.ArrayAdapter; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; - -import org.jetbrains.annotations.NotNull; - -import java.util.Objects; - -import it.niedermann.nextcloud.deck.DeckLog; -import it.niedermann.nextcloud.deck.R; -import it.niedermann.nextcloud.deck.databinding.ItemPickStackBoardBinding; -import it.niedermann.nextcloud.deck.model.Board; -import it.niedermann.nextcloud.deck.util.ViewUtil; - -public class BoardAdapter extends ArrayAdapter { - - @NonNull - private final LayoutInflater inflater; - - @SuppressWarnings("WeakerAccess") - public BoardAdapter(@NonNull Context context) { - super(context, R.layout.item_pick_stack_account); - setDropDownViewResource(R.layout.item_pick_stack_account); - inflater = LayoutInflater.from(context); - } - - @Override - public boolean hasStableIds() { - return true; - } - - @Override - public long getItemId(int position) { - return Objects.requireNonNull(getItem(position)).getLocalId(); - } - - @NotNull - @Override - public View getView(int position, View convertView, @NotNull ViewGroup parent) { - final ItemPickStackBoardBinding binding; - if (convertView == null) { - binding = ItemPickStackBoardBinding.inflate(inflater, parent, false); - } else { - binding = ItemPickStackBoardBinding.bind(convertView); - } - - final Board item = getItem(position); - if (item != null) { - binding.boardTitle.setText(item.getTitle()); - binding.avatar.setImageDrawable(ViewUtil.getTintedImageView(binding.avatar.getContext(), R.drawable.circle_grey600_36dp, "#" + item.getColor())); - } else { - DeckLog.logError(new IllegalArgumentException("No item for position " + position)); - } - return binding.getRoot(); - } - - @Override - public View getDropDownView(int position, @Nullable View convertView, @NonNull ViewGroup parent) { - return getView(position, convertView, parent); - } -} diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/ui/pickstack/PickStackActivity.java b/app/src/main/java/it/niedermann/nextcloud/deck/ui/pickstack/PickStackActivity.java deleted file mode 100644 index 555f47bc7..000000000 --- a/app/src/main/java/it/niedermann/nextcloud/deck/ui/pickstack/PickStackActivity.java +++ /dev/null @@ -1,220 +0,0 @@ -package it.niedermann.nextcloud.deck.ui.pickstack; - -import android.content.Intent; -import android.os.Bundle; -import android.view.View; -import android.widget.AdapterView; -import android.widget.ArrayAdapter; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.appcompat.app.AppCompatActivity; -import androidx.lifecycle.LiveData; -import androidx.lifecycle.Observer; - -import java.util.List; - -import it.niedermann.nextcloud.deck.Application; -import it.niedermann.nextcloud.deck.DeckLog; -import it.niedermann.nextcloud.deck.R; -import it.niedermann.nextcloud.deck.databinding.ActivityPickStackBinding; -import it.niedermann.nextcloud.deck.model.Account; -import it.niedermann.nextcloud.deck.model.Board; -import it.niedermann.nextcloud.deck.model.full.FullStack; -import it.niedermann.nextcloud.deck.persistence.sync.SyncManager; -import it.niedermann.nextcloud.deck.ui.ImportAccountActivity; -import it.niedermann.nextcloud.deck.ui.card.EditActivity; -import it.niedermann.nextcloud.deck.ui.exception.ExceptionHandler; - -import static androidx.lifecycle.Transformations.switchMap; -import static it.niedermann.nextcloud.deck.ui.card.CardAdapter.BUNDLE_KEY_ACCOUNT_ID; -import static it.niedermann.nextcloud.deck.ui.card.CardAdapter.BUNDLE_KEY_BOARD_ID; -import static it.niedermann.nextcloud.deck.ui.card.CardAdapter.BUNDLE_KEY_LOCAL_ID; -import static it.niedermann.nextcloud.deck.ui.card.CardAdapter.BUNDLE_KEY_STACK_ID; -import static it.niedermann.nextcloud.deck.ui.card.CardAdapter.NO_LOCAL_ID; - -public class PickStackActivity extends AppCompatActivity { - - private ActivityPickStackBinding binding; - - private SyncManager syncManager; - - private long lastAccountId; - private long lastBoardId; - private long lastStackId; - - private ArrayAdapter accountAdapter; - private ArrayAdapter boardAdapter; - private ArrayAdapter stackAdapter; - - @Nullable - private LiveData> boardsLiveData; - @NonNull - private Observer> boardsObserver = (boards) -> { - boardAdapter.clear(); - boardAdapter.addAll(boards); - binding.boardSelect.setEnabled(true); - - if (boards.size() > 0) { - binding.boardSelect.setEnabled(true); - - for (Board board : boards) { - if (board.getLocalId() == lastBoardId) { - binding.boardSelect.setSelection(boardAdapter.getPosition(board)); - break; - } - } - } else { - binding.boardSelect.setEnabled(false); - binding.submit.setEnabled(false); - } - }; - - @Nullable - private LiveData> stacksLiveData; - @NonNull - private Observer> stacksObserver = (fullStacks) -> { - stackAdapter.clear(); - stackAdapter.addAll(fullStacks); - - if (fullStacks.size() > 0) { - binding.stackSelect.setEnabled(true); - binding.submit.setEnabled(true); - - for (FullStack fullStack : fullStacks) { - if (fullStack.getLocalId() == lastStackId) { - binding.stackSelect.setSelection(stackAdapter.getPosition(fullStack)); - break; - } - } - } else { - binding.stackSelect.setEnabled(false); - binding.submit.setEnabled(false); - } - }; - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - - Thread.setDefaultUncaughtExceptionHandler(new ExceptionHandler(this)); - setTheme(Application.getAppTheme(this) ? R.style.DarkAppTheme : R.style.AppTheme); - - binding = ActivityPickStackBinding.inflate(getLayoutInflater()); - setContentView(binding.getRoot()); - setSupportActionBar(binding.toolbar); - - accountAdapter = new AccountAdapter(this); - binding.accountSelect.setAdapter(accountAdapter); - binding.accountSelect.setEnabled(false); - boardAdapter = new BoardAdapter(this); - binding.boardSelect.setAdapter(boardAdapter); - binding.stackSelect.setEnabled(false); - stackAdapter = new StackAdapter(this); - binding.stackSelect.setAdapter(stackAdapter); - binding.stackSelect.setEnabled(false); - - syncManager = new SyncManager(this); - - switchMap(syncManager.hasAccounts(), hasAccounts -> { - if (hasAccounts) { - return syncManager.readAccounts(); - } else { - startActivityForResult(new Intent(this, ImportAccountActivity.class), ImportAccountActivity.REQUEST_CODE_IMPORT_ACCOUNT); - return null; - } - }).observe(this, (List accounts) -> { - if (accounts == null || accounts.size() == 0) { - throw new IllegalStateException("hasAccounts() returns true, but readAccounts() returns null or has no entry"); - } - - lastAccountId = Application.readCurrentAccountId(this); - lastBoardId = Application.readCurrentBoardId(this, lastAccountId); - lastStackId = Application.readCurrentStackId(this, lastAccountId, lastBoardId); - - accountAdapter.clear(); - accountAdapter.addAll(accounts); - binding.accountSelect.setEnabled(true); - - for (Account account : accounts) { - if (account.getId() == lastAccountId) { - binding.accountSelect.setSelection(accountAdapter.getPosition(account)); - break; - } - } - }); - - binding.accountSelect.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { - @Override - public void onItemSelected(AdapterView parent, View view, int position, long id) { - updateBoardsSource(parent.getSelectedItemId()); - } - - @Override - public void onNothingSelected(AdapterView parent) { - // Nothing to do here - } - }); - - binding.boardSelect.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { - @Override - public void onItemSelected(AdapterView parent, View view, int position, long id) { - Object selectedItem = parent.getSelectedItem(); - if (selectedItem instanceof Board) { - Board board = (Board) selectedItem; - updateStacksSource(board.getAccountId(), board.getLocalId()); - } else { - DeckLog.logError(new IllegalArgumentException("parent.getSelectedItem() did not return an instance of " + FullStack.class.getCanonicalName() + " but " + selectedItem.getClass().getCanonicalName())); - } - } - - @Override - public void onNothingSelected(AdapterView parent) { - // Nothing to do here - } - }); - binding.cancel.setOnClickListener((v) -> finish()); - binding.submit.setOnClickListener((v) -> onSubmit()); - } - - private void updateBoardsSource(long accountId) { - if (boardsLiveData != null) { - boardsLiveData.removeObserver(boardsObserver); - } - boardsLiveData = syncManager.getBoardsWithEditPermission(accountId); - boardsLiveData.observe(this, boardsObserver); - } - - private void updateStacksSource(long accountId, long boardId) { - if (stacksLiveData != null) { - stacksLiveData.removeObserver(stacksObserver); - } - stacksLiveData = syncManager.getStacksForBoard(accountId, boardId); - stacksLiveData.observe(this, stacksObserver); - } - - /** - * Starts EditActivity and passes parameters. - */ - private void onSubmit() { - final long accountId = binding.accountSelect.getSelectedItemId(); - final long boardId = binding.boardSelect.getSelectedItemId(); - final long stackId = binding.stackSelect.getSelectedItemId(); - - Intent intent = new Intent(getApplicationContext(), EditActivity.class); - - intent.putExtra(BUNDLE_KEY_ACCOUNT_ID, accountId); - intent.putExtra(BUNDLE_KEY_BOARD_ID, boardId); - intent.putExtra(BUNDLE_KEY_STACK_ID, stackId); - intent.putExtra(BUNDLE_KEY_LOCAL_ID, NO_LOCAL_ID); - - intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_NEW_TASK); - startActivity(intent); - - Application.saveCurrentAccountId(this, accountId); - Application.saveCurrentBoardId(this, accountId, boardId); - Application.saveCurrentStackId(this, accountId, boardId, stackId); - - finish(); - } -} \ No newline at end of file diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/ui/pickstack/StackAdapter.java b/app/src/main/java/it/niedermann/nextcloud/deck/ui/pickstack/StackAdapter.java deleted file mode 100644 index 24a9d844e..000000000 --- a/app/src/main/java/it/niedermann/nextcloud/deck/ui/pickstack/StackAdapter.java +++ /dev/null @@ -1,66 +0,0 @@ -package it.niedermann.nextcloud.deck.ui.pickstack; - -import android.content.Context; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.ArrayAdapter; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; - -import org.jetbrains.annotations.NotNull; - -import java.util.Objects; - -import it.niedermann.nextcloud.deck.DeckLog; -import it.niedermann.nextcloud.deck.R; -import it.niedermann.nextcloud.deck.databinding.ItemPickStackStackBinding; -import it.niedermann.nextcloud.deck.model.full.FullStack; - -public class StackAdapter extends ArrayAdapter { - - @NonNull - private final LayoutInflater inflater; - - @SuppressWarnings("WeakerAccess") - public StackAdapter(@NonNull Context context) { - super(context, R.layout.item_pick_stack_account); - setDropDownViewResource(R.layout.item_pick_stack_account); - inflater = LayoutInflater.from(context); - } - - @Override - public boolean hasStableIds() { - return true; - } - - @Override - public long getItemId(int position) { - return Objects.requireNonNull(getItem(position)).getLocalId(); - } - - @NotNull - @Override - public View getView(int position, View convertView, @NotNull ViewGroup parent) { - final ItemPickStackStackBinding binding; - if (convertView == null) { - binding = ItemPickStackStackBinding.inflate(inflater, parent, false); - } else { - binding = ItemPickStackStackBinding.bind(convertView); - } - - final FullStack item = getItem(position); - if (item != null) { - binding.stackTitle.setText(item.getStack().getTitle()); - } else { - DeckLog.logError(new IllegalArgumentException("No item for position " + position)); - } - return binding.getRoot(); - } - - @Override - public View getDropDownView(int position, @Nullable View convertView, @NonNull ViewGroup parent) { - return getView(position, convertView, parent); - } -} diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/ui/preparecreate/AccountAdapter.java b/app/src/main/java/it/niedermann/nextcloud/deck/ui/preparecreate/AccountAdapter.java new file mode 100644 index 000000000..170a0e940 --- /dev/null +++ b/app/src/main/java/it/niedermann/nextcloud/deck/ui/preparecreate/AccountAdapter.java @@ -0,0 +1,71 @@ +package it.niedermann.nextcloud.deck.ui.preparecreate; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ArrayAdapter; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +import org.jetbrains.annotations.NotNull; + +import java.util.Objects; + +import it.niedermann.nextcloud.deck.DeckLog; +import it.niedermann.nextcloud.deck.R; +import it.niedermann.nextcloud.deck.databinding.ItemPickStackAccountBinding; +import it.niedermann.nextcloud.deck.model.Account; +import it.niedermann.nextcloud.deck.util.ViewUtil; + +import static it.niedermann.nextcloud.deck.util.DimensionUtil.getAvatarDimension; + +public class AccountAdapter extends ArrayAdapter { + + @NonNull + private final LayoutInflater inflater; + + @SuppressWarnings("WeakerAccess") + public AccountAdapter(@NonNull Context context) { + super(context, R.layout.item_pick_stack_account); + setDropDownViewResource(R.layout.item_pick_stack_account); + inflater = LayoutInflater.from(context); + } + + @Override + public boolean hasStableIds() { + return true; + } + + @Override + public long getItemId(int position) { + return Objects.requireNonNull(getItem(position)).getId(); + } + + @NotNull + @Override + public View getView(int position, View convertView, @NotNull ViewGroup parent) { + final ItemPickStackAccountBinding binding; + if (convertView == null) { + binding = ItemPickStackAccountBinding.inflate(inflater, parent, false); + } else { + binding = ItemPickStackAccountBinding.bind(convertView); + } + + final Account item = getItem(position); + if (item != null) { + binding.username.setText(item.getUserName()); + binding.instance.setText(item.getUrl()); + ViewUtil.addAvatar(binding.avatar.getContext(), binding.avatar, item.getUrl(), item.getUserName(), getAvatarDimension(binding.avatar.getContext(), R.dimen.icon_size_details), R.drawable.ic_person_grey600_24dp); + } else { + DeckLog.logError(new IllegalArgumentException("No item for position " + position)); + } + return binding.getRoot(); + } + + @Override + public View getDropDownView(int position, @Nullable View convertView, @NonNull ViewGroup parent) { + return getView(position, convertView, parent); + } +} diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/ui/preparecreate/BoardAdapter.java b/app/src/main/java/it/niedermann/nextcloud/deck/ui/preparecreate/BoardAdapter.java new file mode 100644 index 000000000..d7e3f1ee6 --- /dev/null +++ b/app/src/main/java/it/niedermann/nextcloud/deck/ui/preparecreate/BoardAdapter.java @@ -0,0 +1,68 @@ +package it.niedermann.nextcloud.deck.ui.preparecreate; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ArrayAdapter; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +import org.jetbrains.annotations.NotNull; + +import java.util.Objects; + +import it.niedermann.nextcloud.deck.DeckLog; +import it.niedermann.nextcloud.deck.R; +import it.niedermann.nextcloud.deck.databinding.ItemPickStackBoardBinding; +import it.niedermann.nextcloud.deck.model.Board; +import it.niedermann.nextcloud.deck.util.ViewUtil; + +public class BoardAdapter extends ArrayAdapter { + + @NonNull + private final LayoutInflater inflater; + + @SuppressWarnings("WeakerAccess") + public BoardAdapter(@NonNull Context context) { + super(context, R.layout.item_pick_stack_account); + setDropDownViewResource(R.layout.item_pick_stack_account); + inflater = LayoutInflater.from(context); + } + + @Override + public boolean hasStableIds() { + return true; + } + + @Override + public long getItemId(int position) { + return Objects.requireNonNull(getItem(position)).getLocalId(); + } + + @NotNull + @Override + public View getView(int position, View convertView, @NotNull ViewGroup parent) { + final ItemPickStackBoardBinding binding; + if (convertView == null) { + binding = ItemPickStackBoardBinding.inflate(inflater, parent, false); + } else { + binding = ItemPickStackBoardBinding.bind(convertView); + } + + final Board item = getItem(position); + if (item != null) { + binding.boardTitle.setText(item.getTitle()); + binding.avatar.setImageDrawable(ViewUtil.getTintedImageView(binding.avatar.getContext(), R.drawable.circle_grey600_36dp, "#" + item.getColor())); + } else { + DeckLog.logError(new IllegalArgumentException("No item for position " + position)); + } + return binding.getRoot(); + } + + @Override + public View getDropDownView(int position, @Nullable View convertView, @NonNull ViewGroup parent) { + return getView(position, convertView, parent); + } +} diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/ui/preparecreate/PrepareCreateActivity.java b/app/src/main/java/it/niedermann/nextcloud/deck/ui/preparecreate/PrepareCreateActivity.java new file mode 100644 index 000000000..367144943 --- /dev/null +++ b/app/src/main/java/it/niedermann/nextcloud/deck/ui/preparecreate/PrepareCreateActivity.java @@ -0,0 +1,220 @@ +package it.niedermann.nextcloud.deck.ui.preparecreate; + +import android.content.Intent; +import android.os.Bundle; +import android.view.View; +import android.widget.AdapterView; +import android.widget.ArrayAdapter; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.appcompat.app.AppCompatActivity; +import androidx.lifecycle.LiveData; +import androidx.lifecycle.Observer; + +import java.util.List; + +import it.niedermann.nextcloud.deck.Application; +import it.niedermann.nextcloud.deck.DeckLog; +import it.niedermann.nextcloud.deck.R; +import it.niedermann.nextcloud.deck.databinding.ActivityPrepareCreateBinding; +import it.niedermann.nextcloud.deck.model.Account; +import it.niedermann.nextcloud.deck.model.Board; +import it.niedermann.nextcloud.deck.model.full.FullStack; +import it.niedermann.nextcloud.deck.persistence.sync.SyncManager; +import it.niedermann.nextcloud.deck.ui.ImportAccountActivity; +import it.niedermann.nextcloud.deck.ui.card.EditActivity; +import it.niedermann.nextcloud.deck.ui.exception.ExceptionHandler; + +import static androidx.lifecycle.Transformations.switchMap; +import static it.niedermann.nextcloud.deck.ui.card.CardAdapter.BUNDLE_KEY_ACCOUNT_ID; +import static it.niedermann.nextcloud.deck.ui.card.CardAdapter.BUNDLE_KEY_BOARD_ID; +import static it.niedermann.nextcloud.deck.ui.card.CardAdapter.BUNDLE_KEY_LOCAL_ID; +import static it.niedermann.nextcloud.deck.ui.card.CardAdapter.BUNDLE_KEY_STACK_ID; +import static it.niedermann.nextcloud.deck.ui.card.CardAdapter.NO_LOCAL_ID; + +public class PrepareCreateActivity extends AppCompatActivity { + + private ActivityPrepareCreateBinding binding; + + private SyncManager syncManager; + + private long lastAccountId; + private long lastBoardId; + private long lastStackId; + + private ArrayAdapter accountAdapter; + private ArrayAdapter boardAdapter; + private ArrayAdapter stackAdapter; + + @Nullable + private LiveData> boardsLiveData; + @NonNull + private Observer> boardsObserver = (boards) -> { + boardAdapter.clear(); + boardAdapter.addAll(boards); + binding.boardSelect.setEnabled(true); + + if (boards.size() > 0) { + binding.boardSelect.setEnabled(true); + + for (Board board : boards) { + if (board.getLocalId() == lastBoardId) { + binding.boardSelect.setSelection(boardAdapter.getPosition(board)); + break; + } + } + } else { + binding.boardSelect.setEnabled(false); + binding.submit.setEnabled(false); + } + }; + + @Nullable + private LiveData> stacksLiveData; + @NonNull + private Observer> stacksObserver = (fullStacks) -> { + stackAdapter.clear(); + stackAdapter.addAll(fullStacks); + + if (fullStacks.size() > 0) { + binding.stackSelect.setEnabled(true); + binding.submit.setEnabled(true); + + for (FullStack fullStack : fullStacks) { + if (fullStack.getLocalId() == lastStackId) { + binding.stackSelect.setSelection(stackAdapter.getPosition(fullStack)); + break; + } + } + } else { + binding.stackSelect.setEnabled(false); + binding.submit.setEnabled(false); + } + }; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + Thread.setDefaultUncaughtExceptionHandler(new ExceptionHandler(this)); + setTheme(Application.getAppTheme(this) ? R.style.DarkAppTheme : R.style.AppTheme); + + binding = ActivityPrepareCreateBinding.inflate(getLayoutInflater()); + setContentView(binding.getRoot()); + setSupportActionBar(binding.toolbar); + + accountAdapter = new AccountAdapter(this); + binding.accountSelect.setAdapter(accountAdapter); + binding.accountSelect.setEnabled(false); + boardAdapter = new BoardAdapter(this); + binding.boardSelect.setAdapter(boardAdapter); + binding.stackSelect.setEnabled(false); + stackAdapter = new StackAdapter(this); + binding.stackSelect.setAdapter(stackAdapter); + binding.stackSelect.setEnabled(false); + + syncManager = new SyncManager(this); + + switchMap(syncManager.hasAccounts(), hasAccounts -> { + if (hasAccounts) { + return syncManager.readAccounts(); + } else { + startActivityForResult(new Intent(this, ImportAccountActivity.class), ImportAccountActivity.REQUEST_CODE_IMPORT_ACCOUNT); + return null; + } + }).observe(this, (List accounts) -> { + if (accounts == null || accounts.size() == 0) { + throw new IllegalStateException("hasAccounts() returns true, but readAccounts() returns null or has no entry"); + } + + lastAccountId = Application.readCurrentAccountId(this); + lastBoardId = Application.readCurrentBoardId(this, lastAccountId); + lastStackId = Application.readCurrentStackId(this, lastAccountId, lastBoardId); + + accountAdapter.clear(); + accountAdapter.addAll(accounts); + binding.accountSelect.setEnabled(true); + + for (Account account : accounts) { + if (account.getId() == lastAccountId) { + binding.accountSelect.setSelection(accountAdapter.getPosition(account)); + break; + } + } + }); + + binding.accountSelect.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { + @Override + public void onItemSelected(AdapterView parent, View view, int position, long id) { + updateBoardsSource(parent.getSelectedItemId()); + } + + @Override + public void onNothingSelected(AdapterView parent) { + // Nothing to do here + } + }); + + binding.boardSelect.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { + @Override + public void onItemSelected(AdapterView parent, View view, int position, long id) { + Object selectedItem = parent.getSelectedItem(); + if (selectedItem instanceof Board) { + Board board = (Board) selectedItem; + updateStacksSource(board.getAccountId(), board.getLocalId()); + } else { + DeckLog.logError(new IllegalArgumentException("parent.getSelectedItem() did not return an instance of " + FullStack.class.getCanonicalName() + " but " + selectedItem.getClass().getCanonicalName())); + } + } + + @Override + public void onNothingSelected(AdapterView parent) { + // Nothing to do here + } + }); + binding.cancel.setOnClickListener((v) -> finish()); + binding.submit.setOnClickListener((v) -> onSubmit()); + } + + private void updateBoardsSource(long accountId) { + if (boardsLiveData != null) { + boardsLiveData.removeObserver(boardsObserver); + } + boardsLiveData = syncManager.getBoardsWithEditPermission(accountId); + boardsLiveData.observe(this, boardsObserver); + } + + private void updateStacksSource(long accountId, long boardId) { + if (stacksLiveData != null) { + stacksLiveData.removeObserver(stacksObserver); + } + stacksLiveData = syncManager.getStacksForBoard(accountId, boardId); + stacksLiveData.observe(this, stacksObserver); + } + + /** + * Starts EditActivity and passes parameters. + */ + private void onSubmit() { + final long accountId = binding.accountSelect.getSelectedItemId(); + final long boardId = binding.boardSelect.getSelectedItemId(); + final long stackId = binding.stackSelect.getSelectedItemId(); + + Intent intent = new Intent(getApplicationContext(), EditActivity.class); + + intent.putExtra(BUNDLE_KEY_ACCOUNT_ID, accountId); + intent.putExtra(BUNDLE_KEY_BOARD_ID, boardId); + intent.putExtra(BUNDLE_KEY_STACK_ID, stackId); + intent.putExtra(BUNDLE_KEY_LOCAL_ID, NO_LOCAL_ID); + + intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_NEW_TASK); + startActivity(intent); + + Application.saveCurrentAccountId(this, accountId); + Application.saveCurrentBoardId(this, accountId, boardId); + Application.saveCurrentStackId(this, accountId, boardId, stackId); + + finish(); + } +} \ No newline at end of file diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/ui/preparecreate/StackAdapter.java b/app/src/main/java/it/niedermann/nextcloud/deck/ui/preparecreate/StackAdapter.java new file mode 100644 index 000000000..d8065279f --- /dev/null +++ b/app/src/main/java/it/niedermann/nextcloud/deck/ui/preparecreate/StackAdapter.java @@ -0,0 +1,66 @@ +package it.niedermann.nextcloud.deck.ui.preparecreate; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ArrayAdapter; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +import org.jetbrains.annotations.NotNull; + +import java.util.Objects; + +import it.niedermann.nextcloud.deck.DeckLog; +import it.niedermann.nextcloud.deck.R; +import it.niedermann.nextcloud.deck.databinding.ItemPickStackStackBinding; +import it.niedermann.nextcloud.deck.model.full.FullStack; + +public class StackAdapter extends ArrayAdapter { + + @NonNull + private final LayoutInflater inflater; + + @SuppressWarnings("WeakerAccess") + public StackAdapter(@NonNull Context context) { + super(context, R.layout.item_pick_stack_account); + setDropDownViewResource(R.layout.item_pick_stack_account); + inflater = LayoutInflater.from(context); + } + + @Override + public boolean hasStableIds() { + return true; + } + + @Override + public long getItemId(int position) { + return Objects.requireNonNull(getItem(position)).getLocalId(); + } + + @NotNull + @Override + public View getView(int position, View convertView, @NotNull ViewGroup parent) { + final ItemPickStackStackBinding binding; + if (convertView == null) { + binding = ItemPickStackStackBinding.inflate(inflater, parent, false); + } else { + binding = ItemPickStackStackBinding.bind(convertView); + } + + final FullStack item = getItem(position); + if (item != null) { + binding.stackTitle.setText(item.getStack().getTitle()); + } else { + DeckLog.logError(new IllegalArgumentException("No item for position " + position)); + } + return binding.getRoot(); + } + + @Override + public View getDropDownView(int position, @Nullable View convertView, @NonNull ViewGroup parent) { + return getView(position, convertView, parent); + } +} diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/ui/tiles/EditCardTileService.java b/app/src/main/java/it/niedermann/nextcloud/deck/ui/tiles/EditCardTileService.java index 47a2c3528..09abbfa7a 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/ui/tiles/EditCardTileService.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/ui/tiles/EditCardTileService.java @@ -6,7 +6,7 @@ import android.os.Build; import android.service.quicksettings.Tile; import android.service.quicksettings.TileService; -import it.niedermann.nextcloud.deck.ui.pickstack.PickStackActivity; +import it.niedermann.nextcloud.deck.ui.preparecreate.PrepareCreateActivity; @TargetApi(Build.VERSION_CODES.N) public class EditCardTileService extends TileService { @@ -20,7 +20,7 @@ public class EditCardTileService extends TileService { @Override public void onClick() { - Intent intent = new Intent(getApplicationContext(), PickStackActivity.class); + Intent intent = new Intent(getApplicationContext(), PrepareCreateActivity.class); // ensure it won't open twice if already running intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_NEW_TASK); // ask to unlock the screen if locked, then start new note intent -- cgit v1.2.3