diff options
author | stefan-niedermann <info@niedermann.it> | 2019-10-20 15:46:04 +0300 |
---|---|---|
committer | stefan-niedermann <info@niedermann.it> | 2019-10-20 15:46:04 +0300 |
commit | a35a7a1c8ae4022b92b168f7fba5b5742755fb00 (patch) | |
tree | 2ce40a354ebc8bb44c9d99f799b7479efeb99e89 /app/src | |
parent | d080085995b8062dbbb9e7243d27d9ff9fefe240 (diff) | |
parent | faaadc57861666eb4f8933a76651d2e6b2975fdc (diff) |
Merge branch 'select-board'
Diffstat (limited to 'app/src')
12 files changed, 226 insertions, 21 deletions
diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/SyncManager.java b/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/SyncManager.java index eb85341f1..42209dfce 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/SyncManager.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/SyncManager.java @@ -167,6 +167,10 @@ public class SyncManager { return dataBaseAdapter.readAccount(id); } + public LiveData<Account> readAccount(String name) { + return dataBaseAdapter.readAccount(name); + } + public LiveData<List<Account>> readAccounts() { return dataBaseAdapter.readAccounts(); } diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/adapters/db/DataBaseAdapter.java b/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/adapters/db/DataBaseAdapter.java index ddfa06dfb..bbe2c4e1b 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/adapters/db/DataBaseAdapter.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/adapters/db/DataBaseAdapter.java @@ -278,6 +278,10 @@ public class DataBaseAdapter { return LiveDataHelper.onlyIfChanged(db.getAccountDao().selectById(id)); } + public LiveData<Account> readAccount(String name) { + return LiveDataHelper.onlyIfChanged(db.getAccountDao().selectById(name)); + } + public Account readAccountDirectly(long id) { return db.getAccountDao().getAccountByIdDirectly(id); } diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/adapters/db/dao/AccountDao.java b/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/adapters/db/dao/AccountDao.java index 3c0286ef4..56ac92008 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/adapters/db/dao/AccountDao.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/adapters/db/dao/AccountDao.java @@ -1,10 +1,11 @@ package it.niedermann.nextcloud.deck.persistence.sync.adapters.db.dao; -import java.util.List; - import androidx.lifecycle.LiveData; import androidx.room.Dao; import androidx.room.Query; + +import java.util.List; + import it.niedermann.nextcloud.deck.model.Account; @Dao @@ -28,6 +29,9 @@ public interface AccountDao extends GenericDao<Account> { @Query("SELECT * from account where id = :id") LiveData<Account> selectById(long id); + @Query("SELECT * from account where name = :name") + LiveData<Account> selectById(String name); + @Query("SELECT * from account") LiveData<List<Account>> selectAll(); }
\ No newline at end of file diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/ui/EditActivity.java b/app/src/main/java/it/niedermann/nextcloud/deck/ui/EditActivity.java index 53a1ea6a7..711227c27 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/ui/EditActivity.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/ui/EditActivity.java @@ -7,19 +7,28 @@ import android.text.TextWatcher; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; +import android.view.View; import android.view.inputmethod.InputMethodManager; +import android.widget.AdapterView; import android.widget.EditText; +import android.widget.SpinnerAdapter; import androidx.appcompat.app.AlertDialog; import androidx.appcompat.app.AppCompatActivity; +import androidx.appcompat.widget.AppCompatSpinner; import androidx.appcompat.widget.Toolbar; import androidx.viewpager.widget.ViewPager; import com.google.android.material.tabs.TabLayout; import com.google.android.material.textfield.TextInputLayout; +import com.nextcloud.android.sso.exceptions.NextcloudFilesAppAccountNotFoundException; +import com.nextcloud.android.sso.exceptions.NoCurrentAccountSelectedException; +import com.nextcloud.android.sso.helper.SingleAccountHelper; +import com.nextcloud.android.sso.model.SingleSignOnAccount; import java.util.ArrayList; import java.util.Date; +import java.util.List; import butterknife.BindString; import butterknife.BindView; @@ -27,11 +36,14 @@ import butterknife.ButterKnife; import butterknife.Unbinder; import it.niedermann.nextcloud.deck.Application; import it.niedermann.nextcloud.deck.R; +import it.niedermann.nextcloud.deck.model.Account; +import it.niedermann.nextcloud.deck.model.Board; import it.niedermann.nextcloud.deck.model.Card; import it.niedermann.nextcloud.deck.model.Label; import it.niedermann.nextcloud.deck.model.User; import it.niedermann.nextcloud.deck.model.full.FullCard; import it.niedermann.nextcloud.deck.persistence.sync.SyncManager; +import it.niedermann.nextcloud.deck.ui.board.BoardAdapter; import it.niedermann.nextcloud.deck.ui.card.CardDetailsFragment; import it.niedermann.nextcloud.deck.ui.card.CardTabAdapter; import it.niedermann.nextcloud.deck.ui.exception.ExceptionHandler; @@ -43,7 +55,9 @@ import static it.niedermann.nextcloud.deck.ui.card.CardAdapter.BUNDLE_KEY_LOCAL_ 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 EditActivity extends AppCompatActivity implements CardDetailsFragment.CardDetailsListener { +public class EditActivity extends AppCompatActivity implements + CardDetailsFragment.CardDetailsListener, + AdapterView.OnItemSelectedListener { SyncManager syncManager; @@ -53,6 +67,10 @@ public class EditActivity extends AppCompatActivity implements CardDetailsFragme TextInputLayout titleTextInputLayout; @BindView(R.id.title) EditText title; + @BindView(R.id.selectBoardWrapper) + View selectBoardWrapper; + @BindView(R.id.boardSelector) + AppCompatSpinner boardSelector; @BindView(R.id.tab_layout) TabLayout tabLayout; @BindView(R.id.pager) @@ -88,14 +106,43 @@ public class EditActivity extends AppCompatActivity implements CardDetailsFragme setSupportActionBar(toolbar); Bundle extras = getIntent().getExtras(); - if (extras != null) { - accountId = extras.getLong(BUNDLE_KEY_ACCOUNT_ID); - boardId = extras.getLong(BUNDLE_KEY_BOARD_ID); - stackId = extras.getLong(BUNDLE_KEY_STACK_ID); - localId = extras.getLong(BUNDLE_KEY_LOCAL_ID); - syncManager = new SyncManager(this); - - createMode = NO_LOCAL_ID.equals(localId); + if (extras == null) { + throw new IllegalArgumentException("Provide localId"); + } + accountId = extras.getLong(BUNDLE_KEY_ACCOUNT_ID); + boardId = extras.getLong(BUNDLE_KEY_BOARD_ID); + stackId = extras.getLong(BUNDLE_KEY_STACK_ID); + localId = extras.getLong(BUNDLE_KEY_LOCAL_ID); + syncManager = new SyncManager(this); + + createMode = NO_LOCAL_ID.equals(localId); + if (boardId == 0L) { + try { + createMode = true; + SingleSignOnAccount ssoa = SingleAccountHelper.getCurrentSingleSignOnAccount(this); + syncManager.readAccount(ssoa.name).observe(this, (Account account) -> { + accountId = account.getId(); + selectBoardWrapper.setVisibility(View.VISIBLE); + syncManager.getBoards(account.getId()).observe(this, (List<Board> boardsList) -> { + for (Board board : boardsList) { + if (!board.isPermissionEdit()) { + boardsList.remove(board); + } + } + Board[] boardsArray = new Board[boardsList.size()]; + boardsArray = boardsList.toArray(boardsArray); + SpinnerAdapter adapter = new BoardAdapter(this, boardsArray); + boardSelector.setAdapter(adapter); + boardSelector.setOnItemSelectedListener(this); + }); + }); + } catch (NextcloudFilesAppAccountNotFoundException | NoCurrentAccountSelectedException e) { + e.printStackTrace(); + } + } else { + if (accountId == 0L) { + throw new IllegalArgumentException("No accountId given"); + } observeOnce(syncManager.getFullBoardById(accountId, boardId), EditActivity.this, (fullBoard -> { canEdit = fullBoard.getBoard().isPermissionEdit(); invalidateOptionsMenu(); @@ -117,8 +164,6 @@ public class EditActivity extends AppCompatActivity implements CardDetailsFragme }); } })); - } else { - throw new IllegalArgumentException("No localId argument"); } } @@ -151,9 +196,9 @@ public class EditActivity extends AppCompatActivity implements CardDetailsFragme } } if (createMode) { - observeOnce(syncManager.createFullCard(accountId, boardId, stackId, fullCard), EditActivity.this, (card) -> finish()); + observeOnce(syncManager.createFullCard(accountId, boardId, stackId, fullCard), EditActivity.this, (card) -> super.finish()); } else { - observeOnce(syncManager.updateCard(fullCard), EditActivity.this, (card) -> finish()); + observeOnce(syncManager.updateCard(fullCard), EditActivity.this, (card) -> super.finish()); } } @@ -242,14 +287,48 @@ public class EditActivity extends AppCompatActivity implements CardDetailsFragme @Override public void onBackPressed() { + finish(); + } + + @Override + public void finish() { if (!fullCard.equals(originalCard) && canEdit) { new AlertDialog.Builder(this) .setTitle(R.string.simple_save) .setMessage(R.string.do_you_want_to_save_your_changes) - .setPositiveButton(android.R.string.yes, (dialog, whichButton) -> saveAndFinish()) - .setNegativeButton(R.string.simple_discard, (dialog, whichButton) -> super.onBackPressed()).show(); + .setPositiveButton(R.string.simple_save, (dialog, whichButton) -> saveAndFinish()) + .setNegativeButton(R.string.simple_discard, (dialog, whichButton) -> super.finish()).show(); } else { - super.onBackPressed(); + super.finish(); } } + + @Override + public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { + boardId = ((Board) boardSelector.getItemAtPosition(position)).getLocalId(); + observeOnce(syncManager.getFullBoardById(accountId, boardId), EditActivity.this, (fullBoard -> { + canEdit = fullBoard.getBoard().isPermissionEdit(); + observeOnce(syncManager.getStacksForBoard(accountId, boardId), EditActivity.this, (stacks -> { + if(stacks != null && stacks.size() > 0) { + stackId = stacks.get(0).getLocalId(); + } + })); + if (fullCard == null) { + invalidateOptionsMenu(); + fullCard = new FullCard(); + fullCard.setLabels(new ArrayList<>()); + fullCard.setAssignedUsers(new ArrayList<>()); + Card card = new Card(); + card.setStackId(stackId); + fullCard.setCard(card); + setupViewPager(); + setupTitle(createMode); + } + })); + } + + @Override + public void onNothingSelected(AdapterView<?> parent) { + + } } diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/ui/board/AccessControlDialogFragment.java b/app/src/main/java/it/niedermann/nextcloud/deck/ui/board/AccessControlDialogFragment.java index c36a9b431..77d3be6bd 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/ui/board/AccessControlDialogFragment.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/ui/board/AccessControlDialogFragment.java @@ -100,7 +100,7 @@ public class AccessControlDialogFragment extends DialogFragment implements @Override public void deleteAccessControl(AccessControl ac) { // TODO implement in syncManager! - Toast.makeText(getContext(), "Deleting user permisions is not yet supported.", Toast.LENGTH_LONG).show(); + Toast.makeText(getContext(), "Deleting user permissions is not yet supported.", Toast.LENGTH_LONG).show(); } @Override diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/ui/board/BoardAdapter.java b/app/src/main/java/it/niedermann/nextcloud/deck/ui/board/BoardAdapter.java new file mode 100644 index 000000000..986ce9237 --- /dev/null +++ b/app/src/main/java/it/niedermann/nextcloud/deck/ui/board/BoardAdapter.java @@ -0,0 +1,66 @@ +package it.niedermann.nextcloud.deck.ui.board; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ArrayAdapter; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.recyclerview.widget.RecyclerView; + +import butterknife.BindView; +import butterknife.ButterKnife; +import it.niedermann.nextcloud.deck.DeckLog; +import it.niedermann.nextcloud.deck.R; +import it.niedermann.nextcloud.deck.model.Board; +import it.niedermann.nextcloud.deck.util.ViewUtil; + +public class BoardAdapter extends ArrayAdapter<Board> { + + @NonNull + private Context context; + private Board selectedBoard; + + public BoardAdapter(@NonNull Context context, @NonNull Board[] boardsList) { + super(context, R.layout.item_board, boardsList); + this.context = context; + } + + @NonNull + @Override + public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) { + Board board = getItem(position); + // Check if an existing view is being reused, otherwise inflate the view + + if (convertView == null) { + convertView = LayoutInflater.from(getContext()).inflate(R.layout.item_board, parent, false); + } + TextView boardName = convertView.findViewById(R.id.boardName); + if(board != null) { + boardName.setText(board.getTitle()); + boardName.setCompoundDrawables(ViewUtil.getTintedImageView(context, R.drawable.circle_grey600_36dp, "#" + board.getColor()), null, null, null); + } else { + DeckLog.logError(new IllegalArgumentException("board at position " + position + "is null")); + } + return convertView; + } + + @Override + public View getDropDownView(int position, @Nullable View convertView, @NonNull ViewGroup parent) { + return getView(position, convertView, parent); + } + + static class BoardViewHolder extends RecyclerView.ViewHolder { + @BindView(R.id.boardName) + TextView boardName; + + private BoardViewHolder(View view) { + super(view); + ButterKnife.bind(this, view); + } + } + +}
\ No newline at end of file diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/ui/board/EditBoardDialogFragment.java b/app/src/main/java/it/niedermann/nextcloud/deck/ui/board/EditBoardDialogFragment.java index 902d11066..a3f64798c 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/ui/board/EditBoardDialogFragment.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/ui/board/EditBoardDialogFragment.java @@ -91,8 +91,7 @@ public class EditBoardDialogFragment extends DialogFragment { return dialogBuilder .setView(view) - .setNegativeButton(R.string.simple_cancel, (dialog, which) -> { - }) + .setNegativeButton(R.string.simple_cancel, null) .create(); } diff --git a/app/src/main/res/layout/activity_edit.xml b/app/src/main/res/layout/activity_edit.xml index c5250a20e..d55af2f65 100644 --- a/app/src/main/res/layout/activity_edit.xml +++ b/app/src/main/res/layout/activity_edit.xml @@ -41,6 +41,30 @@ </androidx.appcompat.widget.Toolbar> + <LinearLayout + android:id="@+id/selectBoardWrapper" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:orientation="horizontal" + android:visibility="gone" + tools:visibility="visible"> + + <TextView + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:labelFor="@id/boardSelector" + android:padding="@dimen/standard_padding" + android:text="@string/simple_select" + android:textColor="@android:color/white" /> + + <androidx.appcompat.widget.AppCompatSpinner + android:id="@+id/boardSelector" + android:layout_width="match_parent" + android:layout_height="?android:attr/actionBarSize" + android:theme="@style/Spinner" + tools:listitem="@layout/item_board" /> + </LinearLayout> + <com.google.android.material.tabs.TabLayout android:id="@+id/tab_layout" android:layout_width="match_parent" diff --git a/app/src/main/res/layout/dialog_board_select.xml b/app/src/main/res/layout/dialog_board_select.xml new file mode 100644 index 000000000..c203a21d9 --- /dev/null +++ b/app/src/main/res/layout/dialog_board_select.xml @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="utf-8"?> +<androidx.recyclerview.widget.RecyclerView xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" + xmlns:tools="http://schemas.android.com/tools" + android:id="@+id/boards" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:padding="@dimen/standard_margin" + android:scrollbars="vertical" + app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" + tools:listitem="@layout/dialog_board_select" />
\ No newline at end of file diff --git a/app/src/main/res/layout/item_board.xml b/app/src/main/res/layout/item_board.xml new file mode 100644 index 000000000..495b98bad --- /dev/null +++ b/app/src/main/res/layout/item_board.xml @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="utf-8"?> +<TextView xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:tools="http://schemas.android.com/tools" + android:id="@+id/boardName" + android:padding="@dimen/standard_padding" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:textColor="@android:color/white" + android:background="@android:color/transparent" + tools:text="Awesome board name" />
\ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 6b019441a..5b8526ae4 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -142,4 +142,5 @@ <string name="simple_manage">manage</string> <string name="simple_share">share</string> <string name="you_have_to_be_connected_to_the_internet_in_order_to_add_an_account">You have to be connected to the internet in order to add an account.</string> + <string name="simple_select">Select</string> </resources> diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index d529f6ab5..300a9e22a 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -62,4 +62,7 @@ <item name="android:textColor">@color/danger</item> </style> + <style name="Spinner" parent="ThemeOverlay.AppCompat.Dark"> + <item name="android:textColor">@android:color/white</item> + </style> </resources> |