From 2f31d19279605c43cd0aa8a69e38a3c0dcd95cd8 Mon Sep 17 00:00:00 2001 From: Floens Date: Mon, 17 Jul 2017 19:57:16 +0200 Subject: [PATCH] Work on making all components work without a complete board list. We want to support sites which have no boards.json like endpoint or have support for infine boards, so we want to work without boards being available. Don't crash when no board is loaded. Partial workaround for filters, will get to that later. --- .../chan/core/manager/BoardManager.java | 17 +--- .../chan/core/manager/FilterEngine.java | 41 ++++++-- .../chan/core/presenter/ReplyPresenter.java | 2 +- .../chan/core/presenter/ThreadPresenter.java | 4 + .../java/org/floens/chan/core/site/Site.java | 10 +- .../chan/core/site/sites/chan4/Chan4.java | 57 ++++++----- .../chan/ui/activity/StartActivity.java | 44 ++++++--- .../chan/ui/controller/BrowseController.java | 72 +++++++------- .../chan/ui/controller/HistoryController.java | 8 +- .../floens/chan/ui/layout/FilterLayout.java | 94 +++++++++++++------ .../res/layout/layout_site_board_select.xml | 36 +++++++ Clover/app/src/main/res/values/strings.xml | 2 - 12 files changed, 248 insertions(+), 139 deletions(-) create mode 100644 Clover/app/src/main/res/layout/layout_site_board_select.xml diff --git a/Clover/app/src/main/java/org/floens/chan/core/manager/BoardManager.java b/Clover/app/src/main/java/org/floens/chan/core/manager/BoardManager.java index 07a5accf..04279fb9 100644 --- a/Clover/app/src/main/java/org/floens/chan/core/manager/BoardManager.java +++ b/Clover/app/src/main/java/org/floens/chan/core/manager/BoardManager.java @@ -35,6 +35,9 @@ import javax.inject.Singleton; import de.greenrobot.event.EventBus; +/** + * Keeps track of {@link Board}s that the user has "saved" to their list. + */ @Singleton public class BoardManager { private static final String TAG = "BoardManager"; @@ -67,13 +70,6 @@ public class BoardManager { boards = databaseManager.runTaskSync(databaseManager.getDatabaseBoardManager().getBoards(defaultSite)); if (boards.isEmpty()) { - defaultSite.boards(new Site.BoardsListener() { - @Override - public void onBoardsReceived(Boards boards) { - appendBoards(boards); - } - }); - } else { update(false); } } @@ -118,12 +114,7 @@ public class BoardManager { } // Thread-safe - public boolean getBoardExists(String code) { - return getBoardByCode(code) != null; - } - - // Thread-safe - public Board getBoardByCode(String code) { + private Board getBoardByCode(String code) { synchronized (boardsByCode) { return boardsByCode.get(code); } diff --git a/Clover/app/src/main/java/org/floens/chan/core/manager/FilterEngine.java b/Clover/app/src/main/java/org/floens/chan/core/manager/FilterEngine.java index d3bc4880..bd431547 100644 --- a/Clover/app/src/main/java/org/floens/chan/core/manager/FilterEngine.java +++ b/Clover/app/src/main/java/org/floens/chan/core/manager/FilterEngine.java @@ -22,9 +22,9 @@ import android.text.TextUtils; import org.floens.chan.core.database.DatabaseFilterManager; import org.floens.chan.core.database.DatabaseManager; -import org.floens.chan.core.model.Board; import org.floens.chan.core.model.Filter; import org.floens.chan.core.model.Post; +import org.floens.chan.core.site.Sites; import org.floens.chan.utils.Logger; import java.util.ArrayList; @@ -67,6 +67,21 @@ public class FilterEngine { } } + // This is messy but required now that we can't know the Board immediately. + public static class SiteIdBoardCode { + public final int siteId; + public final String boardCode; + + private SiteIdBoardCode(int site, String board) { + siteId = site; + boardCode = board; + } + + public static SiteIdBoardCode fromSiteIdBoardCode(int siteId, String boardCode) { + return new SiteIdBoardCode(siteId, boardCode); + } + } + private final DatabaseManager databaseManager; private final BoardManager boardManager; @@ -221,15 +236,21 @@ public class FilterEngine { return pattern; } - public List getBoardsForFilter(Filter filter) { + public List getBoardsForFilter(Filter filter) { if (filter.allBoards) { - return boardManager.getSavedBoards(); + return Collections.emptyList(); } else if (!TextUtils.isEmpty(filter.boards)) { - List appliedBoards = new ArrayList<>(); + List appliedBoards = new ArrayList<>(); for (String value : filter.boards.split(",")) { - Board boardByValue = boardManager.getBoardByCode(value); - if (boardByValue != null) { - appliedBoards.add(boardByValue); + if (value.contains(";")) { + String[] siteAndBoard = value.split(";"); + if (siteAndBoard.length == 1) { + appliedBoards.add(SiteIdBoardCode.fromSiteIdBoardCode(Integer.parseInt(siteAndBoard[0]), "")); + } else { + appliedBoards.add(SiteIdBoardCode.fromSiteIdBoardCode(Integer.parseInt(siteAndBoard[0]), siteAndBoard[1])); + } + } else { + appliedBoards.add(SiteIdBoardCode.fromSiteIdBoardCode(Sites.defaultSite().id(), value)); } } return appliedBoards; @@ -238,11 +259,11 @@ public class FilterEngine { } } - public void saveBoardsToFilter(List appliedBoards, Filter filter) { + public void saveBoardsToFilter(List appliedBoards, Filter filter) { filter.boards = ""; for (int i = 0; i < appliedBoards.size(); i++) { - Board board = appliedBoards.get(i); - filter.boards += board.code; + SiteIdBoardCode siteAndBoard = appliedBoards.get(i); + filter.boards += siteAndBoard.siteId + ";" + siteAndBoard.boardCode; if (i < appliedBoards.size() - 1) { filter.boards += ","; } diff --git a/Clover/app/src/main/java/org/floens/chan/core/presenter/ReplyPresenter.java b/Clover/app/src/main/java/org/floens/chan/core/presenter/ReplyPresenter.java index 5f6370f4..f9ab3d7c 100644 --- a/Clover/app/src/main/java/org/floens/chan/core/presenter/ReplyPresenter.java +++ b/Clover/app/src/main/java/org/floens/chan/core/presenter/ReplyPresenter.java @@ -106,7 +106,7 @@ public class ReplyPresenter implements CaptchaCallback, ImagePickDelegate.ImageP callback.setCaptchaVersion(ChanSettings.postNewCaptcha.get()); - this.board = boardManager.getBoardByCode(loadable.boardCode); + this.board = loadable.board; draft = replyManager.getReply(loadable); diff --git a/Clover/app/src/main/java/org/floens/chan/core/presenter/ThreadPresenter.java b/Clover/app/src/main/java/org/floens/chan/core/presenter/ThreadPresenter.java index ed712099..07a8b8f9 100644 --- a/Clover/app/src/main/java/org/floens/chan/core/presenter/ThreadPresenter.java +++ b/Clover/app/src/main/java/org/floens/chan/core/presenter/ThreadPresenter.java @@ -141,6 +141,10 @@ public class ThreadPresenter implements ChanLoader.ChanLoaderCallback, PostAdapt } } + public boolean isBound() { + return chanLoader != null; + } + public void requestInitialData() { if (chanLoader.getThread() == null) { requestData(); diff --git a/Clover/app/src/main/java/org/floens/chan/core/site/Site.java b/Clover/app/src/main/java/org/floens/chan/core/site/Site.java index 8f6170b7..5a6b23a3 100644 --- a/Clover/app/src/main/java/org/floens/chan/core/site/Site.java +++ b/Clover/app/src/main/java/org/floens/chan/core/site/Site.java @@ -109,6 +109,8 @@ public interface Site { */ int id(); + String name(); + boolean feature(Feature feature); boolean boardFeature(BoardFeature boardFeature, Board board); @@ -129,7 +131,13 @@ public interface Site { void onBoardsReceived(Boards boards); } - Board board(String name); + Board board(String code); + + interface BoardListener { + void onBoardReceived(Board board); + + void onBoardNonexistent(); + } ChanLoaderRequest loaderRequest(ChanLoaderRequestParams request); diff --git a/Clover/app/src/main/java/org/floens/chan/core/site/sites/chan4/Chan4.java b/Clover/app/src/main/java/org/floens/chan/core/site/sites/chan4/Chan4.java index e81ec824..7a6c22d8 100644 --- a/Clover/app/src/main/java/org/floens/chan/core/site/sites/chan4/Chan4.java +++ b/Clover/app/src/main/java/org/floens/chan/core/site/sites/chan4/Chan4.java @@ -274,6 +274,11 @@ public class Chan4 implements Site { return 0; } + @Override + public String name() { + return "4chan"; + } + @Override public boolean feature(Feature feature) { switch (feature) { @@ -330,10 +335,34 @@ public class Chan4 implements Site { } @Override - public Board board(String name) { + public void boards(final BoardsListener listener) { + requestQueue.add(new Chan4BoardsRequest(this, new Response.Listener>() { + @Override + public void onResponse(List response) { + listener.onBoardsReceived(new Boards(response)); + } + }, new Response.ErrorListener() { + @Override + public void onErrorResponse(VolleyError error) { + Logger.e(TAG, "Failed to get boards from server", error); + + // API fail, provide some default boards + List list = new ArrayList<>(); + list.add(new Board(Chan4.this, "Technology", "g", true, true)); + list.add(new Board(Chan4.this, "Food & Cooking", "ck", true, true)); + list.add(new Board(Chan4.this, "Do It Yourself", "diy", true, true)); + list.add(new Board(Chan4.this, "Animals & Nature", "an", true, true)); + Collections.shuffle(list); + listener.onBoardsReceived(new Boards(list)); + } + })); + } + + @Override + public Board board(String code) { List allBoards = getGraph().getBoardManager().getAllBoards(); for (Board board : allBoards) { - if (board.code.equals(name)) { + if (board.code.equals(code)) { return board; } } @@ -356,30 +385,6 @@ public class Chan4 implements Site { return authentication; } - @Override - public void boards(final BoardsListener listener) { - requestQueue.add(new Chan4BoardsRequest(this, new Response.Listener>() { - @Override - public void onResponse(List response) { - listener.onBoardsReceived(new Boards(response)); - } - }, new Response.ErrorListener() { - @Override - public void onErrorResponse(VolleyError error) { - Logger.e(TAG, "Failed to get boards from server", error); - - // API fail, provide some default boards - List list = new ArrayList<>(); - list.add(new Board(Chan4.this, "Technology", "g", true, true)); - list.add(new Board(Chan4.this, "Food & Cooking", "ck", true, true)); - list.add(new Board(Chan4.this, "Do It Yourself", "diy", true, true)); - list.add(new Board(Chan4.this, "Animals & Nature", "an", true, true)); - Collections.shuffle(list); - listener.onBoardsReceived(new Boards(list)); - } - })); - } - @Override public ChanLoaderRequest loaderRequest(ChanLoaderRequestParams request) { return new ChanLoaderRequest(new Chan4ReaderRequest(request)); diff --git a/Clover/app/src/main/java/org/floens/chan/ui/activity/StartActivity.java b/Clover/app/src/main/java/org/floens/chan/ui/activity/StartActivity.java index c440c181..89a1fed0 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/activity/StartActivity.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/activity/StartActivity.java @@ -28,6 +28,7 @@ import android.os.Bundle; import android.support.annotation.NonNull; import android.support.v7.app.AlertDialog; import android.support.v7.app.AppCompatActivity; +import android.util.Pair; import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.ViewGroup; @@ -45,6 +46,8 @@ import org.floens.chan.core.model.Board; import org.floens.chan.core.model.Loadable; import org.floens.chan.core.model.Pin; import org.floens.chan.core.settings.ChanSettings; +import org.floens.chan.core.site.Site; +import org.floens.chan.core.site.Sites; import org.floens.chan.ui.controller.BrowseController; import org.floens.chan.ui.controller.DoubleNavigationController; import org.floens.chan.ui.controller.DrawerController; @@ -53,8 +56,8 @@ import org.floens.chan.ui.controller.StyledToolbarNavigationController; import org.floens.chan.ui.controller.ThreadSlideController; import org.floens.chan.ui.controller.ViewThreadController; import org.floens.chan.ui.helper.ImagePickDelegate; -import org.floens.chan.ui.helper.VersionHandler; import org.floens.chan.ui.helper.RuntimePermissionsHelper; +import org.floens.chan.ui.helper.VersionHandler; import org.floens.chan.ui.state.ChanState; import org.floens.chan.ui.theme.ThemeHelper; import org.floens.chan.utils.AndroidUtils; @@ -131,16 +134,16 @@ public class StartActivity extends AppCompatActivity implements NfcAdapter.Creat if (chanState == null) { Logger.w(TAG, "savedInstanceState was not null, but no ChanState was found!"); } else { - DatabaseLoadableManager loadableManager = databaseManager.getDatabaseLoadableManager(); - chanState.board = loadableManager.get(chanState.board); - chanState.thread = loadableManager.get(chanState.thread); + Pair boardThreadPair = resolveChanState(chanState); + + if (boardThreadPair != null && boardThreadPair.first != null) { + loadDefault = false; - loadDefault = false; - Board board = boardManager.getBoardByCode(chanState.board.boardCode); - browseController.loadBoard(board); + browseController.loadBoard(boardThreadPair.first.board); - if (chanState.thread.mode == Loadable.Mode.THREAD) { - browseController.showThread(chanState.thread, false); + if (boardThreadPair.second != null) { + browseController.showThread(boardThreadPair.second); + } } } } else { @@ -149,8 +152,7 @@ public class StartActivity extends AppCompatActivity implements NfcAdapter.Creat Loadable fromUri = ChanHelper.getLoadableFromStartUri(data); if (fromUri != null) { loadDefault = false; - Board board = boardManager.getBoardByCode(fromUri.boardCode); - browseController.loadBoard(board); + browseController.loadBoard(fromUri.board); if (fromUri.isThreadMode()) { browseController.showThread(fromUri, false); @@ -176,6 +178,26 @@ public class StartActivity extends AppCompatActivity implements NfcAdapter.Creat versionHandler.run(); } + private Pair resolveChanState(ChanState state) { + DatabaseLoadableManager loadableManager = databaseManager.getDatabaseLoadableManager(); + + Site site = Sites.forId(state.board.siteId); + Board board = site.board(state.board.boardCode); + if (board != null) { + state.board.site = site; + state.board.board = board; + state.thread.site = site; + state.thread.board = board; + + Loadable boardLoadable = loadableManager.get(state.board); + Loadable threadLoadable = loadableManager.get(state.thread); + + return new Pair<>(boardLoadable, threadLoadable.mode == Loadable.Mode.THREAD ? threadLoadable : null); + } + + return null; + } + private void setupLayout() { mainNavigationController = new StyledToolbarNavigationController(this); diff --git a/Clover/app/src/main/java/org/floens/chan/ui/controller/BrowseController.java b/Clover/app/src/main/java/org/floens/chan/ui/controller/BrowseController.java index 7793854f..7a5a4f88 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/controller/BrowseController.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/controller/BrowseController.java @@ -19,13 +19,13 @@ package org.floens.chan.ui.controller; import android.annotation.SuppressLint; import android.app.Activity; -import android.app.ProgressDialog; import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.animation.DecelerateInterpolator; import android.widget.BaseAdapter; +import android.widget.ImageView; import android.widget.TextView; import org.floens.chan.R; @@ -72,8 +72,6 @@ public class BrowseController extends ThreadController implements ToolbarMenuIte private PostsFilter.Order order; private List boardItems; - private ProgressDialog waitingForBoardsDialog; - private FloatingMenuItem viewModeMenuItem; private ToolbarMenuItem search; private ToolbarMenuItem refresh; @@ -123,20 +121,32 @@ public class BrowseController extends ThreadController implements ToolbarMenuIte @Override public void onMenuItemClicked(ToolbarMenuItem item) { + ThreadPresenter presenter = threadLayout.getPresenter(); + switch ((Integer) item.getId()) { case SEARCH_ID: - ((ToolbarNavigationController) navigationController).showSearch(); + if (presenter.isBound()) { + ((ToolbarNavigationController) navigationController).showSearch(); + } break; case REFRESH_ID: - threadLayout.getPresenter().requestData(); - refresh.getView().setRotation(0f); - refresh.getView().animate().rotation(360f).setDuration(500).setInterpolator(new DecelerateInterpolator(2f)); + if (presenter.isBound()) { + presenter.requestData(); + ImageView refreshView = refresh.getView(); + refreshView.setRotation(0f); + refreshView.animate() + .rotation(360f) + .setDuration(500) + .setInterpolator(new DecelerateInterpolator(2f)); + } break; } } @Override public void onSubMenuItemClicked(ToolbarMenuItem parent, FloatingMenuItem item) { + final ThreadPresenter presenter = threadLayout.getPresenter(); + Integer id = (Integer) item.getId(); switch (id) { case REPLY_ID: @@ -144,14 +154,15 @@ public class BrowseController extends ThreadController implements ToolbarMenuIte break; case SHARE_ID: case OPEN_BROWSER_ID: - String link = ChanUrls.getCatalogUrlDesktop(threadLayout.getPresenter().getLoadable().boardCode); + if (presenter.isBound()) { + String link = ChanUrls.getCatalogUrlDesktop(presenter.getLoadable().boardCode); - if (id == SHARE_ID) { - AndroidUtils.shareLink(link); - } else { - AndroidUtils.openLinkInBrowser((Activity) context, link); + if (id == SHARE_ID) { + AndroidUtils.shareLink(link); + } else { + AndroidUtils.openLinkInBrowser((Activity) context, link); + } } - break; case VIEW_MODE_ID: if (postViewMode == ChanSettings.PostViewMode.LIST) { @@ -205,7 +216,7 @@ public class BrowseController extends ThreadController implements ToolbarMenuIte PostsFilter.Order order = (PostsFilter.Order) item.getId(); ChanSettings.boardOrder.set(order.name); BrowseController.this.order = order; - threadLayout.getPresenter().setOrder(order); + presenter.setOrder(order); } @Override @@ -341,32 +352,19 @@ public class BrowseController extends ThreadController implements ToolbarMenuIte private void loadBoards() { List boards = boardManager.getSavedBoards(); - if (boards.isEmpty()) { - if (waitingForBoardsDialog == null) { - String title = getString(R.string.thread_fetching_boards_title); - String message = getString(R.string.thread_fetching_boards); - waitingForBoardsDialog = ProgressDialog.show(context, title, message, true, false); - waitingForBoardsDialog.show(); - } - } else { - boolean wasWaiting = waitingForBoardsDialog != null; - if (waitingForBoardsDialog != null) { - waitingForBoardsDialog.dismiss(); - waitingForBoardsDialog = null; - } + boolean wasEmpty = boardItems == null; - boardItems = new ArrayList<>(); - for (Board board : boards) { - FloatingMenuItem item = new FloatingMenuItemBoard(board); - boardItems.add(item); - } + boardItems = new ArrayList<>(); + for (Board board : boards) { + FloatingMenuItem item = new FloatingMenuItemBoard(board); + boardItems.add(item); + } - navigationItem.middleMenu.setItems(boardItems); - navigationItem.middleMenu.setAdapter(new BoardsAdapter(context, boardItems)); + navigationItem.middleMenu.setItems(boardItems); + navigationItem.middleMenu.setAdapter(new BoardsAdapter(context, boardItems)); - if (wasWaiting) { - loadDefault(); - } + if (wasEmpty) { + loadDefault(); } } diff --git a/Clover/app/src/main/java/org/floens/chan/ui/controller/HistoryController.java b/Clover/app/src/main/java/org/floens/chan/ui/controller/HistoryController.java index 91c8170f..e66a1ef6 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/controller/HistoryController.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/controller/HistoryController.java @@ -31,7 +31,6 @@ import android.widget.CompoundButton; import android.widget.ImageView; import android.widget.TextView; -import org.floens.chan.Chan; import org.floens.chan.R; import org.floens.chan.controller.Controller; import org.floens.chan.core.database.DatabaseHistoryManager; @@ -47,7 +46,6 @@ import org.floens.chan.ui.toolbar.ToolbarMenuItem; import org.floens.chan.ui.view.CrossfadeView; import org.floens.chan.ui.view.FloatingMenuItem; import org.floens.chan.ui.view.ThumbnailView; -import org.floens.chan.utils.Logger; import java.util.ArrayList; import java.util.List; @@ -205,12 +203,8 @@ public class HistoryController extends Controller implements CompoundButton.OnCh History history = displayList.get(position); holder.thumbnail.setUrl(history.thumbnailUrl, dp(48), dp(48)); - if (history.loadable == null) { - Logger.test("null!"); - } - holder.text.setText(history.loadable.title); - Board board = boardManager.getBoardByCode(history.loadable.boardCode); + Board board = history.loadable.board; holder.subtext.setText(board == null ? null : ("/" + board.code + "/ \u2013 " + board.name)); } diff --git a/Clover/app/src/main/java/org/floens/chan/ui/layout/FilterLayout.java b/Clover/app/src/main/java/org/floens/chan/ui/layout/FilterLayout.java index 565148b3..d946bdf6 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/layout/FilterLayout.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/layout/FilterLayout.java @@ -33,23 +33,29 @@ import android.util.AttributeSet; import android.view.Gravity; import android.view.LayoutInflater; import android.view.View; +import android.widget.AdapterView; +import android.widget.ArrayAdapter; import android.widget.CheckBox; +import android.widget.EditText; import android.widget.ImageView; import android.widget.LinearLayout; +import android.widget.Spinner; +import android.widget.SpinnerAdapter; import android.widget.TextView; import org.floens.chan.R; import org.floens.chan.core.manager.BoardManager; import org.floens.chan.core.manager.FilterEngine; import org.floens.chan.core.manager.FilterType; -import org.floens.chan.core.model.Board; import org.floens.chan.core.model.Filter; +import org.floens.chan.core.site.Site; +import org.floens.chan.core.site.Sites; import org.floens.chan.ui.controller.FiltersController; import org.floens.chan.ui.dialog.ColorPickerView; import org.floens.chan.ui.drawable.DropdownArrowDrawable; -import org.floens.chan.ui.helper.BoardHelper; import org.floens.chan.ui.view.FloatingMenu; import org.floens.chan.ui.view.FloatingMenuItem; +import org.floens.chan.utils.Logger; import java.util.ArrayList; import java.util.List; @@ -84,7 +90,7 @@ public class FilterLayout extends LinearLayout implements View.OnClickListener { private FilterLayoutCallback callback; private Filter filter; - private List appliedBoards = new ArrayList<>(); + private List appliedBoards = new ArrayList<>(); public FilterLayout(Context context) { super(context); @@ -226,49 +232,75 @@ public class FilterLayout extends LinearLayout implements View.OnClickListener { }) .show(); } else if (v == boardsSelector) { - @SuppressWarnings("unchecked") - final SelectLayout selectLayout = (SelectLayout) LayoutInflater.from(getContext()).inflate(R.layout.layout_select, null); - - List> items = new ArrayList<>(); - List savedList = boardManager.getSavedBoards(); - for (int i = 0; i < savedList.size(); i++) { - Board saved = savedList.get(i); - String name = BoardHelper.getName(saved); - String description = BoardHelper.getDescription(saved); - String search = name + " " + saved.code; - - boolean checked = false; - for (int j = 0; j < appliedBoards.size(); j++) { - Board appliedBoard = appliedBoards.get(j); - if (appliedBoard.code.equals(saved.code)) { - checked = true; - break; - } + // TODO(multi-site): fix this crap. + // we need a new proper recyclerview layout where you can individually select each site and board combination + // and if you don't select anything, it becomes a global filter. + + final LinearLayout selectLayout = (LinearLayout) LayoutInflater.from(getContext()) + .inflate(R.layout.layout_site_board_select, null); + + final Spinner spinner = (Spinner) selectLayout.findViewById(R.id.spinner); + + final List allSites = Sites.ALL_SITES; + + final Site[] selectedSite = {allSites.get(0)}; + + List allSitesNames = new ArrayList<>(allSites.size()); + for (int i = 0; i < allSites.size(); i++) { + Site site = allSites.get(i); + allSitesNames.add(site.name()); + } + + SpinnerAdapter adapter = new ArrayAdapter<>(getContext(), android.R.layout.simple_list_item_1, allSitesNames); + spinner.setAdapter(adapter); + + spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { + @Override + public void onItemSelected(AdapterView parent, View view, int position, long id) { + Site site = allSites.get(position); + selectedSite[0] = site; + Logger.test(site.name()); } - items.add(new SelectLayout.SelectItem<>( - saved, saved.id, name, description, search, checked - )); + @Override + public void onNothingSelected(AdapterView parent) { + } + }); + + final EditText editText = (EditText) selectLayout.findViewById(R.id.boards); + + String text = ""; + for (int i = 0; i < appliedBoards.size(); i++) { + FilterEngine.SiteIdBoardCode siteIdBoardCode = appliedBoards.get(i); + text += siteIdBoardCode.boardCode; + if (i < appliedBoards.size() - 1) { + text += ","; + } } - selectLayout.setItems(items); + editText.setText(text); new AlertDialog.Builder(getContext()) .setView(selectLayout) .setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { + Site site = selectedSite[0]; + appliedBoards.clear(); - List> items = selectLayout.getItems(); - for (int i = 0; i < items.size(); i++) { - SelectLayout.SelectItem selectItem = items.get(i); - if (selectItem.checked) { - appliedBoards.add(selectItem.item); + String[] codes = editText.getText().toString().split(","); + if (codes.length == 0) { + filter.allBoards = true; + } else { + filter.allBoards = false; + for (String code : codes) { + appliedBoards.add(FilterEngine.SiteIdBoardCode.fromSiteIdBoardCode( + site.id(), code + )); } } - filter.allBoards = selectLayout.areAllChecked(); updateBoardsSummary(); } }) diff --git a/Clover/app/src/main/res/layout/layout_site_board_select.xml b/Clover/app/src/main/res/layout/layout_site_board_select.xml new file mode 100644 index 00000000..b5ca5d5d --- /dev/null +++ b/Clover/app/src/main/res/layout/layout_site_board_select.xml @@ -0,0 +1,36 @@ + + + + + + + + diff --git a/Clover/app/src/main/res/values/strings.xml b/Clover/app/src/main/res/values/strings.xml index 77340251..ab7e10b6 100644 --- a/Clover/app/src/main/res/values/strings.xml +++ b/Clover/app/src/main/res/values/strings.xml @@ -145,8 +145,6 @@ Re-enable this permission in the app settings if you permanently disabled it."Failed to open image Spoiler image - Fetching boards - Please wait for the boards to be fetched, this may take up to a minute. Add more… HTTPS error Network error