From 7391303d352276e73c2a1e5830f9a33fd17eeb51 Mon Sep 17 00:00:00 2001 From: Floens Date: Sat, 30 Dec 2017 23:11:56 +0100 Subject: [PATCH] add select all to board add layout rename runtask methods uptimize board order call --- .../core/database/DatabaseBoardManager.java | 14 ++++++++++- .../database/DatabaseLoadableManager.java | 2 +- .../chan/core/database/DatabaseManager.java | 20 ++++++++-------- .../chan/core/manager/BoardManager.java | 22 +++++++++++------- .../chan/core/manager/FilterEngine.java | 8 +++---- .../chan/core/manager/WatchManager.java | 10 ++++---- .../core/presenter/BoardSetupPresenter.java | 19 +++++++-------- .../chan/core/presenter/ReplyPresenter.java | 2 +- .../core/presenter/SiteSetupPresenter.java | 2 +- .../chan/core/presenter/ThreadPresenter.java | 8 +++---- .../floens/chan/core/site/SiteRepository.java | 6 ++--- .../ui/controller/BoardSetupController.java | 10 ++++---- .../chan/ui/controller/FiltersController.java | 2 +- .../chan/ui/controller/HistoryController.java | 8 +++---- .../floens/chan/ui/layout/BoardAddLayout.java | 13 ++++++++++- .../src/main/res/layout/layout_board_add.xml | 23 +++++++++++++++---- Clover/app/src/main/res/values/strings.xml | 1 + 17 files changed, 108 insertions(+), 62 deletions(-) diff --git a/Clover/app/src/main/java/org/floens/chan/core/database/DatabaseBoardManager.java b/Clover/app/src/main/java/org/floens/chan/core/database/DatabaseBoardManager.java index 7c6f6332..7957ffe2 100644 --- a/Clover/app/src/main/java/org/floens/chan/core/database/DatabaseBoardManager.java +++ b/Clover/app/src/main/java/org/floens/chan/core/database/DatabaseBoardManager.java @@ -37,7 +37,7 @@ public class DatabaseBoardManager { }; } - public Callable update(final Board board) { + public Callable updateIncludingUserFields(final Board board) { return () -> { helper.boardsDao.update(board); @@ -45,6 +45,18 @@ public class DatabaseBoardManager { }; } + public Callable updateOrders(final List boards, final int fromOrder) { + return () -> { + for (int i = 0; i < boards.size(); i++) { + Board board = boards.get(i); + board.order = fromOrder + i; + helper.boardsDao.update(board); + } + + return null; + }; + } + public Callable createAll(final List boards) { return () -> { // TODO: optimize diff --git a/Clover/app/src/main/java/org/floens/chan/core/database/DatabaseLoadableManager.java b/Clover/app/src/main/java/org/floens/chan/core/database/DatabaseLoadableManager.java index 101f2856..8921412c 100644 --- a/Clover/app/src/main/java/org/floens/chan/core/database/DatabaseLoadableManager.java +++ b/Clover/app/src/main/java/org/floens/chan/core/database/DatabaseLoadableManager.java @@ -94,7 +94,7 @@ public class DatabaseLoadableManager { // We only cache THREAD loadables in the db if (loadable.isThreadMode()) { long start = Time.startTiming(); - Loadable result = databaseManager.runTaskSync(getLoadable(loadable)); + Loadable result = databaseManager.runTask(getLoadable(loadable)); Time.endTiming("get loadable from db " + loadable.boardCode, start); return result; } else { diff --git a/Clover/app/src/main/java/org/floens/chan/core/database/DatabaseManager.java b/Clover/app/src/main/java/org/floens/chan/core/database/DatabaseManager.java index 8b275257..4424df6c 100644 --- a/Clover/app/src/main/java/org/floens/chan/core/database/DatabaseManager.java +++ b/Clover/app/src/main/java/org/floens/chan/core/database/DatabaseManager.java @@ -52,8 +52,8 @@ import de.greenrobot.event.EventBus; /** * The central point for database related access.
* All database queries are run on a single database thread, therefor all functions return a - * {@link Callable} that needs to be queued on either {@link #runTask(Callable)}, - * {@link #runTask(Callable, TaskResult)} or {@link #runTaskSync(Callable)}.
+ * {@link Callable} that needs to be queued on either {@link #runTaskAsync(Callable)}, + * {@link #runTaskAsync(Callable, TaskResult)} or {@link #runTask(Callable)}.
* You often want the sync flavour for queries that return data, it waits for the task to be finished on the other thread.
* Use the async versions when you don't care when the query is done. */ @@ -126,7 +126,7 @@ public class DatabaseManager { // Called when the app changes foreground state public void onEvent(Chan.ForegroundChangedMessage message) { if (!message.inForeground) { - runTask(databaseLoadableManager.flush()); + runTaskAsync(databaseLoadableManager.flush()); } } @@ -134,10 +134,10 @@ public class DatabaseManager { loadThreadHides(); // Loads data into fields. - runTaskSync(databaseSavedReplyManager.load()); + runTask(databaseSavedReplyManager.load()); // Only trims. - runTask(databaseHistoryManager.load()); + runTaskAsync(databaseHistoryManager.load()); } /** @@ -268,15 +268,15 @@ public class DatabaseManager { } } - public void runTask(final Callable taskCallable) { - runTask(taskCallable, null); + public void runTaskAsync(final Callable taskCallable) { + runTaskAsync(taskCallable, null); } - public void runTask(final Callable taskCallable, final TaskResult taskResult) { - Future f = executeTask(taskCallable, taskResult); + public void runTaskAsync(final Callable taskCallable, final TaskResult taskResult) { + executeTask(taskCallable, taskResult); } - public T runTaskSync(final Callable taskCallable) { + public T runTask(final Callable taskCallable) { try { return executeTask(taskCallable, null).get(); } catch (InterruptedException | ExecutionException e) { 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 35649795..60e0e5fd 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 @@ -64,7 +64,7 @@ public class BoardManager { } public void createAll(List boards) { - databaseManager.runTaskSync( + databaseManager.runTask( databaseManager.getDatabaseBoardManager().createAll(boards)); } @@ -77,17 +77,17 @@ public class BoardManager { * @return the board code with the same site and board code, or {@code null} if not found. */ public Board getBoard(Site site, String code) { - return databaseManager.runTaskSync( + return databaseManager.runTask( databaseManager.getDatabaseBoardManager().getBoard(site, code)); } public List getSiteBoards(Site site) { - return databaseManager.runTaskSync( + return databaseManager.runTask( databaseManager.getDatabaseBoardManager().getSiteBoards(site)); } public List getSiteSavedBoards(Site site) { - List boards = databaseManager.runTaskSync( + List boards = databaseManager.runTask( databaseManager.getDatabaseBoardManager().getSiteSavedBoards(site)); Collections.sort(boards, ORDER_SORT); return boards; @@ -107,14 +107,20 @@ public class BoardManager { public void updateBoardOrder(Board board, int order) { board.order = order; - // not sync, does not update observable. - databaseManager.runTask(databaseManager.getDatabaseBoardManager().update(board), - result -> updateSavedBoards()); + databaseManager.runTask(databaseManager.getDatabaseBoardManager() + .updateIncludingUserFields(board)); + updateSavedBoards(); + } + + public void updateBoardOrders(List boards, int fromOrder) { + databaseManager.runTask(databaseManager.getDatabaseBoardManager() + .updateOrders(boards, fromOrder)); + updateSavedBoards(); } private void setSaved(Board board, boolean saved) { board.saved = saved; - databaseManager.runTaskSync(databaseManager.getDatabaseBoardManager().update(board)); + databaseManager.runTask(databaseManager.getDatabaseBoardManager().updateIncludingUserFields(board)); updateSavedBoards(); } 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 9f3e7ae2..97aaaf88 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 @@ -84,15 +84,15 @@ public class FilterEngine { } public void deleteFilter(Filter filter) { - databaseManager.runTaskSync(databaseFilterManager.deleteFilter(filter)); + databaseManager.runTask(databaseFilterManager.deleteFilter(filter)); update(); } public void createOrUpdateFilter(Filter filter) { if (filter.id == 0) { - databaseManager.runTaskSync(databaseFilterManager.createFilter(filter)); + databaseManager.runTask(databaseFilterManager.createFilter(filter)); } else { - databaseManager.runTaskSync(databaseFilterManager.updateFilter(filter)); + databaseManager.runTask(databaseFilterManager.updateFilter(filter)); } update(); } @@ -261,7 +261,7 @@ public class FilterEngine { } private void update() { - List filters = databaseManager.runTaskSync(databaseFilterManager.getFilters()); + List filters = databaseManager.runTask(databaseFilterManager.getFilters()); List enabled = new ArrayList<>(); for (Filter filter : filters) { if (filter.enabled) { diff --git a/Clover/app/src/main/java/org/floens/chan/core/manager/WatchManager.java b/Clover/app/src/main/java/org/floens/chan/core/manager/WatchManager.java index af7ec753..e362516e 100644 --- a/Clover/app/src/main/java/org/floens/chan/core/manager/WatchManager.java +++ b/Clover/app/src/main/java/org/floens/chan/core/manager/WatchManager.java @@ -141,7 +141,7 @@ public class WatchManager { this.chanLoaderFactory = chanLoaderFactory; databasePinManager = databaseManager.getDatabasePinManager(); - pins = databaseManager.runTaskSync(databasePinManager.getPins()); + pins = databaseManager.runTask(databasePinManager.getPins()); Collections.sort(pins, SORT_PINS); handler = new Handler(Looper.getMainLooper(), new Handler.Callback() { @@ -184,7 +184,7 @@ public class WatchManager { } pins.add(pin); applyOrder(); - databaseManager.runTaskSync(databasePinManager.createPin(pin)); + databaseManager.runTask(databasePinManager.createPin(pin)); updateState(); @@ -198,7 +198,7 @@ public class WatchManager { destroyPinWatcher(pin); - databaseManager.runTaskSync(databasePinManager.deletePin(pin)); + databaseManager.runTask(databasePinManager.deletePin(pin)); // Update the new orders applyOrder(); updatePinsInDatabase(); @@ -209,7 +209,7 @@ public class WatchManager { } public void updatePin(Pin pin) { - databaseManager.runTaskSync(databasePinManager.updatePin(pin)); + databaseManager.runTask(databasePinManager.updatePin(pin)); updateState(); @@ -431,7 +431,7 @@ public class WatchManager { } private void updatePinsInDatabase() { - databaseManager.runTask(databasePinManager.updatePins(pins)); + databaseManager.runTaskAsync(databasePinManager.updatePins(pins)); } private Boolean isWatchingSettingEnabled() { diff --git a/Clover/app/src/main/java/org/floens/chan/core/presenter/BoardSetupPresenter.java b/Clover/app/src/main/java/org/floens/chan/core/presenter/BoardSetupPresenter.java index b772806d..d7487c2f 100644 --- a/Clover/app/src/main/java/org/floens/chan/core/presenter/BoardSetupPresenter.java +++ b/Clover/app/src/main/java/org/floens/chan/core/presenter/BoardSetupPresenter.java @@ -78,6 +78,14 @@ public class BoardSetupPresenter { selectedSuggestions.clear(); } + public void onSelectAllClicked() { + for (BoardSuggestion suggestion : suggestions) { + suggestion.checked = true; + selectedSuggestions.add(suggestion.getCode()); + } + addCallback.updateSuggestions(); + } + public void onSuggestionClicked(BoardSuggestion suggestion) { suggestion.checked = !suggestion.checked; if (suggestion.checked) { @@ -134,9 +142,8 @@ public class BoardSetupPresenter { Board board = savedBoards.remove(position); boardManager.unsaveBoard(board); - for (int i = position; i < savedBoards.size(); i++) { - boardManager.updateBoardOrder(savedBoards.get(i), i); - } + boardManager.updateBoardOrders( + savedBoards.subList(position, savedBoards.size()), position); updateSavedBoards(); callback.setSavedBoards(savedBoards); @@ -152,10 +159,6 @@ public class BoardSetupPresenter { callback.setSavedBoards(savedBoards); } - public void done() { - callback.finish(); - } - public void searchEntered(String userQuery) { if (suggestionCall != null) { suggestionCall.cancel(); @@ -225,8 +228,6 @@ public class BoardSetupPresenter { void showRemovedSnackbar(Board board); - void finish(); - void boardsWereAdded(int count); } 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 35657359..4c9147d7 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 @@ -218,7 +218,7 @@ public class ReplyPresenter implements AuthenticationLayoutCallback, ImagePickDe SavedReply savedReply = SavedReply.fromSiteBoardNoPassword( loadable.site, loadable.board, replyResponse.postNo, replyResponse.password); - databaseManager.runTask(databaseManager.getDatabaseSavedReplyManager() + databaseManager.runTaskAsync(databaseManager.getDatabaseSavedReplyManager() .saveReply(savedReply)); switchPage(Page.INPUT, false); diff --git a/Clover/app/src/main/java/org/floens/chan/core/presenter/SiteSetupPresenter.java b/Clover/app/src/main/java/org/floens/chan/core/presenter/SiteSetupPresenter.java index 48a9c59d..3c028420 100644 --- a/Clover/app/src/main/java/org/floens/chan/core/presenter/SiteSetupPresenter.java +++ b/Clover/app/src/main/java/org/floens/chan/core/presenter/SiteSetupPresenter.java @@ -36,7 +36,7 @@ public class SiteSetupPresenter { private void setBoardCount(Callback callback, Site site) { callback.setBoardCount( - databaseManager.runTaskSync( + databaseManager.runTask( databaseManager.getDatabaseBoardManager().getSiteSavedBoards(site) ).size() ); 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 2d18a863..9faceba4 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 @@ -498,7 +498,7 @@ public class ThreadPresenter implements ChanLoader.ChanLoaderCallback, PostAdapt case POST_OPTION_SAVE: SavedReply savedReply = SavedReply.fromSiteBoardNoPassword( post.board.site, post.board, post.no, ""); - databaseManager.runTask(databaseManager.getDatabaseSavedReplyManager().saveReply(savedReply)); + databaseManager.runTaskAsync(databaseManager.getDatabaseSavedReplyManager().saveReply(savedReply)); break; case POST_OPTION_PIN: Loadable pinLoadable = databaseManager.getDatabaseLoadableManager().get(Loadable.forThread(loadable.site, post.board, post.no)); @@ -606,7 +606,7 @@ public class ThreadPresenter implements ChanLoader.ChanLoaderCallback, PostAdapt public void deletePostConfirmed(Post post, boolean onlyImageDelete) { threadPresenterCallback.showDeleting(); - SavedReply reply = databaseManager.runTaskSync( + SavedReply reply = databaseManager.runTask( databaseManager.getDatabaseSavedReplyManager().findSavedReply(post.board, post.no) ); if (reply != null) { @@ -634,7 +634,7 @@ public class ThreadPresenter implements ChanLoader.ChanLoaderCallback, PostAdapt } private void requestDeletePost(Post post) { - SavedReply reply = databaseManager.runTaskSync( + SavedReply reply = databaseManager.runTask( databaseManager.getDatabaseSavedReplyManager().findSavedReply(post.board, post.no) ); if (reply != null) { @@ -698,7 +698,7 @@ public class ThreadPresenter implements ChanLoader.ChanLoaderCallback, PostAdapt history.loadable = loadable; PostImage image = chanLoader.getThread().op.image; history.thumbnailUrl = image == null ? "" : image.thumbnailUrl.toString(); - databaseManager.runTask(databaseManager.getDatabaseHistoryManager().addHistory(history)); + databaseManager.runTaskAsync(databaseManager.getDatabaseHistoryManager().addHistory(history)); } } diff --git a/Clover/app/src/main/java/org/floens/chan/core/site/SiteRepository.java b/Clover/app/src/main/java/org/floens/chan/core/site/SiteRepository.java index 8dde2aa7..4a0b0ba5 100644 --- a/Clover/app/src/main/java/org/floens/chan/core/site/SiteRepository.java +++ b/Clover/app/src/main/java/org/floens/chan/core/site/SiteRepository.java @@ -18,18 +18,18 @@ public class SiteRepository { } public List all() { - return databaseManager.runTaskSync(databaseManager.getDatabaseSiteManager().getAll()); + return databaseManager.runTask(databaseManager.getDatabaseSiteManager().getAll()); } public SiteModel create(SiteConfig config, SiteUserSettings userSettings) { SiteModel siteModel = new SiteModel(); siteModel.storeConfigFields(config, userSettings); - databaseManager.runTaskSync(databaseManager.getDatabaseSiteManager().add(siteModel)); + databaseManager.runTask(databaseManager.getDatabaseSiteManager().add(siteModel)); return siteModel; } public void setId(SiteModel siteModel, int id) { - databaseManager.runTaskSync(databaseManager.getDatabaseSiteManager() + databaseManager.runTask(databaseManager.getDatabaseSiteManager() .updateId(siteModel, id)); } } diff --git a/Clover/app/src/main/java/org/floens/chan/ui/controller/BoardSetupController.java b/Clover/app/src/main/java/org/floens/chan/ui/controller/BoardSetupController.java index 9e65563d..ceb68d4b 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/controller/BoardSetupController.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/controller/BoardSetupController.java @@ -127,6 +127,11 @@ public class BoardSetupController extends Controller implements View.OnClickList presenter.create(this, site); } + @Override + public void onDestroy() { + super.onDestroy(); + } + public void setSite(Site site) { this.site = site; } @@ -199,11 +204,6 @@ public class BoardSetupController extends Controller implements View.OnClickList snackbar.show(); } - @Override - public void finish() { - navigationController.popController(); - } - private class SavedBoardsAdapter extends RecyclerView.Adapter { private List savedBoards; diff --git a/Clover/app/src/main/java/org/floens/chan/ui/controller/FiltersController.java b/Clover/app/src/main/java/org/floens/chan/ui/controller/FiltersController.java index b3fd9fde..4be55fd2 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/controller/FiltersController.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/controller/FiltersController.java @@ -242,7 +242,7 @@ public class FiltersController extends Controller implements ToolbarMenuItem.Too private void load() { sourceList.clear(); - sourceList.addAll(databaseManager.runTaskSync(databaseManager.getDatabaseFilterManager().getFilters())); + sourceList.addAll(databaseManager.runTask(databaseManager.getDatabaseFilterManager().getFilters())); filter(); } 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 8e1d5cb9..6c978baf 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 @@ -133,7 +133,7 @@ public class HistoryController extends Controller implements CompoundButton.OnCh .setPositiveButton(R.string.history_clear_confirm_button, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { - databaseManager.runTask(databaseHistoryManager.clearHistory()); + databaseManager.runTaskAsync(databaseHistoryManager.clearHistory()); adapter.load(); } }) @@ -146,7 +146,7 @@ public class HistoryController extends Controller implements CompoundButton.OnCh .setPositiveButton(R.string.saved_reply_clear_confirm_button, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { - databaseManager.runTask(databaseSavedReplyManager.clearSavedReplies()); + databaseManager.runTaskAsync(databaseSavedReplyManager.clearSavedReplies()); } }) .show(); @@ -166,7 +166,7 @@ public class HistoryController extends Controller implements CompoundButton.OnCh } private void deleteHistory(History history) { - databaseManager.runTaskSync(databaseHistoryManager.removeHistory(history)); + databaseManager.runTask(databaseHistoryManager.removeHistory(history)); adapter.load(); } @@ -226,7 +226,7 @@ public class HistoryController extends Controller implements CompoundButton.OnCh private void load() { if (!resultPending) { resultPending = true; - databaseManager.runTask(databaseHistoryManager.getHistory(), this); + databaseManager.runTaskAsync(databaseHistoryManager.getHistory(), this); } } diff --git a/Clover/app/src/main/java/org/floens/chan/ui/layout/BoardAddLayout.java b/Clover/app/src/main/java/org/floens/chan/ui/layout/BoardAddLayout.java index 013063b0..c73ac3f3 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/layout/BoardAddLayout.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/layout/BoardAddLayout.java @@ -25,6 +25,7 @@ import android.util.AttributeSet; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.widget.Button; import android.widget.CheckBox; import android.widget.LinearLayout; import android.widget.TextView; @@ -35,12 +36,13 @@ import org.floens.chan.core.presenter.BoardSetupPresenter; import static org.floens.chan.utils.AndroidUtils.getAttrColor; import static org.floens.chan.utils.AndroidUtils.getString; -public class BoardAddLayout extends LinearLayout implements SearchLayout.SearchLayoutCallback, BoardSetupPresenter.AddCallback { +public class BoardAddLayout extends LinearLayout implements SearchLayout.SearchLayoutCallback, BoardSetupPresenter.AddCallback, View.OnClickListener { private BoardSetupPresenter presenter; private SuggestionsAdapter suggestionsAdapter; private SearchLayout search; + private Button checkAllButton; private RecyclerView suggestionsRecycler; private AlertDialog dialog; @@ -64,6 +66,7 @@ public class BoardAddLayout extends LinearLayout implements SearchLayout.SearchL // View binding search = findViewById(R.id.search); suggestionsRecycler = findViewById(R.id.suggestions); + checkAllButton = (Button) findViewById(R.id.select_all); // Adapters suggestionsAdapter = new SuggestionsAdapter(); @@ -74,6 +77,7 @@ public class BoardAddLayout extends LinearLayout implements SearchLayout.SearchL search.setTextColor(getAttrColor(getContext(), R.attr.text_color_primary)); search.setHintColor(getAttrColor(getContext(), R.attr.text_color_hint)); search.setClearButtonImage(R.drawable.ic_clear_black_24dp); + checkAllButton.setOnClickListener(this); suggestionsRecycler.setLayoutManager(new LinearLayoutManager(getContext())); suggestionsRecycler.setAdapter(suggestionsAdapter); @@ -92,6 +96,13 @@ public class BoardAddLayout extends LinearLayout implements SearchLayout.SearchL presenter.unbindAddDialog(); } + @Override + public void onClick(View v) { + if (v == checkAllButton) { + presenter.onSelectAllClicked(); + } + } + @Override public void onSearchEntered(String entered) { presenter.searchEntered(entered); diff --git a/Clover/app/src/main/res/layout/layout_board_add.xml b/Clover/app/src/main/res/layout/layout_board_add.xml index e3d736c1..97450a03 100644 --- a/Clover/app/src/main/res/layout/layout_board_add.xml +++ b/Clover/app/src/main/res/layout/layout_board_add.xml @@ -24,12 +24,27 @@ along with this program. If not, see . android:paddingLeft="16dp" android:paddingRight="16dp"> - + android:orientation="horizontal"> + + + +