diff options
author | Stefan Niedermann <info@niedermann.it> | 2020-04-12 12:44:26 +0300 |
---|---|---|
committer | Stefan Niedermann <info@niedermann.it> | 2020-04-12 12:44:26 +0300 |
commit | 1063dd2347c7933e20b1d6094cb93beeae54b95b (patch) | |
tree | cd02770a4b9f3caf591fe33a8c57c9d85c20cf8d /app/src | |
parent | e10a845b837cc16b193010615e24c29a59eebb6c (diff) |
#317 Adjust theme for each account
Use DeleteDialog for stacks and boards
Signed-off-by: Stefan Niedermann <info@niedermann.it>
Diffstat (limited to 'app/src')
11 files changed, 233 insertions, 69 deletions
diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/model/Board.java b/app/src/main/java/it/niedermann/nextcloud/deck/model/Board.java index b75b54339..810f4e575 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/model/Board.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/model/Board.java @@ -5,6 +5,7 @@ import androidx.room.ForeignKey; import androidx.room.Ignore; import androidx.room.Index; +import java.io.Serializable; import java.util.Date; import it.niedermann.nextcloud.deck.model.enums.DBStatus; @@ -21,7 +22,7 @@ import it.niedermann.nextcloud.deck.model.interfaces.AbstractRemoteEntity; ) } ) -public class Board extends AbstractRemoteEntity { +public class Board extends AbstractRemoteEntity implements Serializable { public Board() { diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/ui/MainActivity.java b/app/src/main/java/it/niedermann/nextcloud/deck/ui/MainActivity.java index 0458bc4cc..5052d5816 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/ui/MainActivity.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/ui/MainActivity.java @@ -69,6 +69,7 @@ import it.niedermann.nextcloud.deck.persistence.sync.SyncManager; import it.niedermann.nextcloud.deck.persistence.sync.SyncWorker; import it.niedermann.nextcloud.deck.persistence.sync.adapters.db.util.WrappedLiveData; import it.niedermann.nextcloud.deck.ui.about.AboutActivity; +import it.niedermann.nextcloud.deck.ui.board.DeleteBoardListener; import it.niedermann.nextcloud.deck.ui.board.EditBoardDialogFragment; import it.niedermann.nextcloud.deck.ui.board.EditBoardListener; import it.niedermann.nextcloud.deck.ui.branding.BrandedActivity; @@ -76,15 +77,15 @@ import it.niedermann.nextcloud.deck.ui.card.CardAdapter; import it.niedermann.nextcloud.deck.ui.card.EditActivity; import it.niedermann.nextcloud.deck.ui.exception.ExceptionHandler; import it.niedermann.nextcloud.deck.ui.settings.SettingsActivity; +import it.niedermann.nextcloud.deck.ui.stack.DeleteStackDialogFragment; +import it.niedermann.nextcloud.deck.ui.stack.DeleteStackListener; import it.niedermann.nextcloud.deck.ui.stack.EditStackDialogFragment; import it.niedermann.nextcloud.deck.ui.stack.EditStackListener; import it.niedermann.nextcloud.deck.ui.stack.OnScrollListener; import it.niedermann.nextcloud.deck.ui.stack.StackAdapter; import it.niedermann.nextcloud.deck.ui.stack.StackFragment; -import it.niedermann.nextcloud.deck.util.DeleteDialogBuilder; import it.niedermann.nextcloud.deck.util.DrawerMenuUtil; import it.niedermann.nextcloud.deck.util.DrawerMenuUtil.DrawerAccountListener; -import it.niedermann.nextcloud.deck.util.DrawerMenuUtil.DrawerBoardListener; import it.niedermann.nextcloud.deck.util.ExceptionUtil; import it.niedermann.nextcloud.deck.util.ViewUtil; @@ -104,7 +105,7 @@ import static it.niedermann.nextcloud.deck.util.DrawerMenuUtil.MENU_ID_ADD_ACCOU import static it.niedermann.nextcloud.deck.util.DrawerMenuUtil.MENU_ID_ADD_BOARD; import static it.niedermann.nextcloud.deck.util.DrawerMenuUtil.MENU_ID_SETTINGS; -public class MainActivity extends BrandedActivity implements EditStackListener, EditBoardListener, OnScrollListener, OnNavigationItemSelectedListener, DrawerAccountListener, DrawerBoardListener { +public class MainActivity extends BrandedActivity implements DeleteStackListener, EditStackListener, DeleteBoardListener, EditBoardListener, OnScrollListener, OnNavigationItemSelectedListener, DrawerAccountListener { protected ActivityMainBinding binding; protected NavHeaderMainBinding headerBinding; @@ -369,7 +370,7 @@ public class MainActivity extends BrandedActivity implements EditStackListener, @Override public void onCreateStack(String stackName) { observeOnce(syncManager.getStacksForBoard(currentAccount.getId(), currentBoardId), MainActivity.this, fullStacks -> { - Stack s = new Stack(stackName, currentBoardId); + final Stack s = new Stack(stackName, currentBoardId); int heighestOrder = 0; for (FullStack fullStack : fullStacks) { int currentStackOrder = fullStack.stack.getOrder(); @@ -378,12 +379,8 @@ public class MainActivity extends BrandedActivity implements EditStackListener, } } s.setOrder(heighestOrder); - //TODO: returns liveData of the created stack (once!) as desired - // original to do: should return ID of the created stack, so one can immediately switch to the new board after creation - DeckLog.log("Create Stack with account id = " + currentAccount.getId()); - syncManager.createStack(currentAccount.getId(), s).observe(MainActivity.this, (stack) -> { - binding.viewPager.setCurrentItem(stackAdapter.getItemCount()); - }); + DeckLog.info("Create Stack with account id = " + currentAccount.getId()); + syncManager.createStack(currentAccount.getId(), s).observe(MainActivity.this, (stack) -> binding.viewPager.setCurrentItem(stackAdapter.getItemCount())); }); } @@ -558,7 +555,7 @@ public class MainActivity extends BrandedActivity implements EditStackListener, binding.navigationView.setItemIconTintList(null); Menu menu = binding.navigationView.getMenu(); menu.clear(); - DrawerMenuUtil.inflateBoards(this, menu, currentAccount.getId(), currentBoardId, this.boardsList); + DrawerMenuUtil.inflateBoards(this, menu, currentAccount.getId(), this.boardsList); } @Override @@ -621,25 +618,15 @@ public class MainActivity extends BrandedActivity implements EditStackListener, @Override public boolean onOptionsItemSelected(MenuItem item) { + final long stackId = stackAdapter.getItem(binding.viewPager.getCurrentItem()).getLocalId(); switch (item.getItemId()) { case R.id.delete_list: - new DeleteDialogBuilder(this) - .setTitle(R.string.delete_list) - .setMessage(R.string.do_you_want_to_delete_the_current_list) - .setPositiveButton(R.string.simple_delete, (dialog, whichButton) -> { - long stackId = stackAdapter.getItem(binding.viewPager.getCurrentItem()).getLocalId(); - observeOnce(syncManager.getStack(currentAccount.getId(), stackId), MainActivity.this, fullStack -> { - DeckLog.log("Delete stack #" + fullStack.getLocalId() + ": " + fullStack.getStack().getTitle()); - syncManager.deleteStack(fullStack.getStack()); - }); - }) - .setNegativeButton(android.R.string.cancel, null).show(); + DeleteStackDialogFragment.newInstance(stackId).show(getSupportFragmentManager(), DeleteStackDialogFragment.class.getCanonicalName()); return true; case R.id.rename_list: - long stackId = stackAdapter.getItem(binding.viewPager.getCurrentItem()).getLocalId(); observeOnce(syncManager.getStack(currentAccount.getId(), stackId), MainActivity.this, fullStack -> EditStackDialogFragment.newInstance(fullStack.getLocalId(), fullStack.getStack().getTitle()) - .show(getSupportFragmentManager(), getString(R.string.rename_list))); + .show(getSupportFragmentManager(), EditStackDialogFragment.class.getCanonicalName())); return true; default: return super.onOptionsItemSelected(item); @@ -814,19 +801,28 @@ public class MainActivity extends BrandedActivity implements EditStackListener, } @Override - public void onBoardChosen(@NonNull Board board) { - setCurrentBoard(board); + public void onStackDeleted(Long stackLocalId) { + long stackId = stackAdapter.getItem(binding.viewPager.getCurrentItem()).getLocalId(); + observeOnce(syncManager.getStack(currentAccount.getId(), stackId), MainActivity.this, fullStack -> { + DeckLog.log("Delete stack #" + fullStack.getLocalId() + ": " + fullStack.getStack().getTitle()); + syncManager.deleteStack(fullStack.getStack()); + }); } @Override - public void onBoardDeleted(@NonNull Board board) { + public void onBoardDeleted(Board board) { + final int index = this.boardsList.indexOf(board); + if (board.getLocalId() == currentBoardId) { + if (index > 0) { // Select first board after deletion + setCurrentBoard(this.boardsList.get(0)); + } else if (this.boardsList.size() > 1) { // Select second board after deletion + setCurrentBoard(this.boardsList.get(1)); + } else { // No other board is available, open create dialog + clearCurrentBoard(); + EditBoardDialogFragment.newInstance().show(getSupportFragmentManager(), addBoard); + } + } syncManager.deleteBoard(board); binding.drawerLayout.closeDrawer(GravityCompat.START); } - - @Override - public void onLastBoardDeleted() { - clearCurrentBoard(); - EditBoardDialogFragment.newInstance().show(getSupportFragmentManager(), addBoard); - } }
\ No newline at end of file diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/ui/board/DeleteBoardDialogFragment.java b/app/src/main/java/it/niedermann/nextcloud/deck/ui/board/DeleteBoardDialogFragment.java new file mode 100644 index 000000000..9574d96e1 --- /dev/null +++ b/app/src/main/java/it/niedermann/nextcloud/deck/ui/board/DeleteBoardDialogFragment.java @@ -0,0 +1,64 @@ +package it.niedermann.nextcloud.deck.ui.board; + +import android.app.Dialog; +import android.content.Context; +import android.os.Bundle; + +import androidx.annotation.NonNull; +import androidx.appcompat.app.AlertDialog; +import androidx.fragment.app.DialogFragment; + +import it.niedermann.nextcloud.deck.R; +import it.niedermann.nextcloud.deck.model.Board; +import it.niedermann.nextcloud.deck.ui.view.DeleteDialogFragment; + +public class DeleteBoardDialogFragment extends DeleteDialogFragment { + + private static final String KEY_BOARD = "board"; + + private DeleteBoardListener deleteBoardListener; + private Board board; + + /** + * Use newInstance()-Method + */ + public DeleteBoardDialogFragment() { + } + + @Override + public void onAttach(@NonNull Context context) { + super.onAttach(context); + if (context instanceof DeleteBoardListener) { + this.deleteBoardListener = (DeleteBoardListener) context; + } else { + throw new ClassCastException("Caller must implement " + DeleteBoardListener.class.getCanonicalName()); + } + + if (getArguments() == null || !getArguments().containsKey(KEY_BOARD)) { + throw new IllegalArgumentException("Please provide at least " + KEY_BOARD + " as an argument"); + } else { + this.board = (Board) getArguments().getSerializable(KEY_BOARD); + } + } + + @NonNull + @Override + public Dialog onCreateDialog(Bundle savedInstanceState) { + AlertDialog.Builder builder = new AlertDialog.Builder(requireContext()) + .setTitle(getString(R.string.delete_something, board.getTitle())) + .setMessage(R.string.delete_board_message) + .setPositiveButton(R.string.simple_delete, (dialog, which) -> deleteBoardListener.onBoardDeleted(board)) + .setNegativeButton(android.R.string.cancel, null); + return builder.create(); + } + + public static DialogFragment newInstance(Board board) { + DeleteBoardDialogFragment dialog = new DeleteBoardDialogFragment(); + + Bundle args = new Bundle(); + args.putSerializable(KEY_BOARD, board); + dialog.setArguments(args); + + return dialog; + } +} diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/ui/board/DeleteBoardListener.java b/app/src/main/java/it/niedermann/nextcloud/deck/ui/board/DeleteBoardListener.java new file mode 100644 index 000000000..e9fb53652 --- /dev/null +++ b/app/src/main/java/it/niedermann/nextcloud/deck/ui/board/DeleteBoardListener.java @@ -0,0 +1,7 @@ +package it.niedermann.nextcloud.deck.ui.board; + +import it.niedermann.nextcloud.deck.model.Board; + +public interface DeleteBoardListener { + void onBoardDeleted(Board board); +}
\ No newline at end of file diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/ui/branding/BrandedActivity.java b/app/src/main/java/it/niedermann/nextcloud/deck/ui/branding/BrandedActivity.java index b95b9dbdb..032c35004 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/ui/branding/BrandedActivity.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/ui/branding/BrandedActivity.java @@ -132,6 +132,8 @@ public abstract class BrandedActivity extends AppCompatActivity implements Brand if (isFocused) { editText.clearFocus(); } + final int highlightColor = Color.argb(77, Color.red(finalMainColor), Color.green(finalMainColor), Color.blue(finalMainColor)); + editText.setHighlightColor(highlightColor); editText.setOnFocusChangeListener((v, hasFocus) -> { if (hasFocus) { background.setColorFilter(finalMainColor, PorterDuff.Mode.SRC_ATOP); diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/EditActivity.java b/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/EditActivity.java index dd95e69c9..8fc21110e 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/EditActivity.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/EditActivity.java @@ -1,6 +1,7 @@ package it.niedermann.nextcloud.deck.ui.card; import android.content.res.ColorStateList; +import android.graphics.Color; import android.graphics.ColorFilter; import android.graphics.PorterDuff; import android.graphics.drawable.Drawable; @@ -21,6 +22,7 @@ import androidx.core.graphics.drawable.DrawableCompat; import com.google.android.material.tabs.TabLayout; import com.google.android.material.tabs.TabLayoutMediator; +import com.google.android.material.textfield.TextInputLayout; import java.util.ArrayList; import java.util.Date; @@ -350,10 +352,14 @@ public class EditActivity extends BrandedActivity implements CardDetailsListener super.applyBrand(mainColor, textColor); applyBrandToPrimaryToolbar(mainColor, textColor, binding.toolbar); applyBrandToPrimaryTabLayout(mainColor, textColor, binding.tabLayout); + final int highlightColor = Color.argb(77, Color.red(textColor), Color.green(textColor), Color.blue(textColor)); + binding.title.setHighlightColor(highlightColor); binding.title.setTextColor(textColor); DrawableCompat.setTintList(binding.title.getBackground(), ColorStateList.valueOf(textColor)); applyBrandToTitle(textColor, binding.title); binding.titleTextInputLayout.setDefaultHintTextColor(ColorStateList.valueOf(textColor)); + + applyBrandToTitleWrapper(textColor, binding.titleTextInputLayout); } private static void applyBrandToTitle(@ColorInt int textColor, @NonNull EditText editText) { @@ -379,4 +385,28 @@ public class EditActivity extends BrandedActivity implements CardDetailsListener editText.requestFocus(); } } + + private static void applyBrandToTitleWrapper(@ColorInt int textColor, @NonNull TextInputLayout editText) { + final Drawable background = editText.getBackground(); +// final ColorFilter oldColorFilter = DrawableCompat.getColorFilter(background); + final View.OnFocusChangeListener oldOnFocusChangeListener = editText.getOnFocusChangeListener(); + + final boolean isFocused = editText.isFocused(); + if (isFocused) { + editText.clearFocus(); + } + editText.setOnFocusChangeListener((v, hasFocus) -> { + if (hasFocus) { + background.setColorFilter(textColor, PorterDuff.Mode.SRC_ATOP); + } else { +// background.setColorFilter(oldColorFilter); + } + if (oldOnFocusChangeListener != null) { + oldOnFocusChangeListener.onFocusChange(v, hasFocus); + } + }); + if (isFocused) { + editText.requestFocus(); + } + } } diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/ui/stack/DeleteStackDialogFragment.java b/app/src/main/java/it/niedermann/nextcloud/deck/ui/stack/DeleteStackDialogFragment.java new file mode 100644 index 000000000..da1070b4a --- /dev/null +++ b/app/src/main/java/it/niedermann/nextcloud/deck/ui/stack/DeleteStackDialogFragment.java @@ -0,0 +1,64 @@ +package it.niedermann.nextcloud.deck.ui.stack; + +import android.app.Dialog; +import android.content.Context; +import android.os.Bundle; + +import androidx.annotation.NonNull; +import androidx.appcompat.app.AlertDialog; +import androidx.fragment.app.DialogFragment; + +import it.niedermann.nextcloud.deck.R; +import it.niedermann.nextcloud.deck.ui.view.DeleteDialogFragment; + +public class DeleteStackDialogFragment extends DeleteDialogFragment { + + private static final String KEY_STACK_ID = "stack_id"; + + private DeleteStackListener deleteStackListener; + private Long stackId; + + + /** + * Use newInstance()-Method + */ + public DeleteStackDialogFragment() { + } + + @Override + public void onAttach(@NonNull Context context) { + super.onAttach(context); + if (context instanceof DeleteStackListener) { + this.deleteStackListener = (DeleteStackListener) context; + } else { + throw new ClassCastException("Caller must implement " + DeleteStackListener.class.getCanonicalName()); + } + + if (getArguments() == null || !getArguments().containsKey(KEY_STACK_ID)) { + throw new IllegalArgumentException("Please provide at least stack id as an argument"); + } else { + this.stackId = getArguments().getLong(KEY_STACK_ID); + } + } + + @NonNull + @Override + public Dialog onCreateDialog(Bundle savedInstanceState) { + AlertDialog.Builder builder = new AlertDialog.Builder(requireContext()) + .setTitle(R.string.delete_list) + .setMessage(R.string.do_you_want_to_delete_the_current_list) + .setPositiveButton(R.string.simple_delete, (dialog, whichButton) -> deleteStackListener.onStackDeleted(stackId)) + .setNegativeButton(android.R.string.cancel, null); + return builder.create(); + } + + public static DialogFragment newInstance(long stackId) { + DeleteStackDialogFragment dialog = new DeleteStackDialogFragment(); + + Bundle args = new Bundle(); + args.putLong(KEY_STACK_ID, stackId); + dialog.setArguments(args); + + return dialog; + } +} diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/ui/stack/DeleteStackListener.java b/app/src/main/java/it/niedermann/nextcloud/deck/ui/stack/DeleteStackListener.java new file mode 100644 index 000000000..dfd1b4497 --- /dev/null +++ b/app/src/main/java/it/niedermann/nextcloud/deck/ui/stack/DeleteStackListener.java @@ -0,0 +1,5 @@ +package it.niedermann.nextcloud.deck.ui.stack; + +public interface DeleteStackListener { + void onStackDeleted(Long stackLocalId); +}
\ No newline at end of file diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/ui/view/DeleteDialogFragment.java b/app/src/main/java/it/niedermann/nextcloud/deck/ui/view/DeleteDialogFragment.java new file mode 100644 index 000000000..4ae92e43c --- /dev/null +++ b/app/src/main/java/it/niedermann/nextcloud/deck/ui/view/DeleteDialogFragment.java @@ -0,0 +1,27 @@ +package it.niedermann.nextcloud.deck.ui.view; + +import android.app.Dialog; +import android.content.DialogInterface; +import android.widget.Button; + +import androidx.annotation.ColorInt; +import androidx.appcompat.app.AlertDialog; + +import it.niedermann.nextcloud.deck.R; +import it.niedermann.nextcloud.deck.ui.branding.BrandedDialogFragment; + +public class DeleteDialogFragment extends BrandedDialogFragment { + + @Override + public void applyBrand(@ColorInt int mainColor, @ColorInt int textColor) { + super.applyBrand(mainColor, textColor); + final Dialog dialog = requireDialog(); + if (dialog instanceof AlertDialog) { + final Button positiveButton = ((AlertDialog) dialog).getButton(DialogInterface.BUTTON_POSITIVE); + if (positiveButton != null) { + positiveButton.setTextColor(getResources().getColor(R.color.danger)); + } + } + } + +} diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/util/DrawerMenuUtil.java b/app/src/main/java/it/niedermann/nextcloud/deck/util/DrawerMenuUtil.java index 31b081e31..ce0b1ec00 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/util/DrawerMenuUtil.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/util/DrawerMenuUtil.java @@ -28,6 +28,7 @@ import it.niedermann.nextcloud.deck.DeckLog; 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.ui.board.DeleteBoardDialogFragment; import it.niedermann.nextcloud.deck.ui.board.EditBoardDialogFragment; import it.niedermann.nextcloud.deck.ui.board.accesscontrol.AccessControlDialogFragment; @@ -101,11 +102,10 @@ public class DrawerMenuUtil { menu.add(Menu.NONE, MENU_ID_ADD_ACCOUNT, Menu.NONE, context.getString(R.string.add_account)).setIcon(R.drawable.ic_person_add_black_24dp); } - public static <T extends FragmentActivity & DrawerBoardListener> void inflateBoards( + public static <T extends FragmentActivity> void inflateBoards( @NonNull T context, @NonNull Menu menu, @NonNull Long currentAccountId, - long currentBoardId, @NonNull List<Board> boards) { final String addBoard = context.getString(R.string.add_board); final String simpleBoards = context.getString(R.string.simple_boards); @@ -143,23 +143,7 @@ public class DrawerMenuUtil { Toast.makeText(context, "Archiving boards is not yet supported.", Toast.LENGTH_LONG).show(); return true; case R.id.delete_board: - new DeleteDialogBuilder(context) - .setTitle(context.getString(R.string.delete_something, board.getTitle())) - .setMessage(R.string.delete_board_message) - .setPositiveButton(R.string.simple_delete, (dialog, which) -> { - if (board.getLocalId() == currentBoardId) { - if (currentIndex > 0) { // Select first board after deletion - context.onBoardChosen(boards.get(0)); - } else if (boards.size() > 1) { // Select second board after deletion - context.onBoardChosen(boards.get(1)); - } else { // No other board is available, open create dialog - context.onLastBoardDeleted(); - } - } - context.onBoardDeleted(board); - }) - .setNegativeButton(android.R.string.cancel, null) - .show(); + DeleteBoardDialogFragment.newInstance(board).show(context.getSupportFragmentManager(), DeleteBoardDialogFragment.class.getCanonicalName()); return true; default: return false; @@ -188,14 +172,4 @@ public class DrawerMenuUtil { void onAccountDeleted(@NonNull Long accountId); } - - public interface DrawerBoardListener { - void onBoardChosen(@NonNull Board board); - - void onBoardDeleted(@NonNull Board board); - - default void onLastBoardDeleted() { - // Optional - } - } } diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 09af701b4..44056cdac 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -11,12 +11,6 @@ <item name="windowNoTitle">true</item> </style> -<!-- <style name="AppTheme.EditText" parent="ThemeOverlay.MaterialComponents.Dark">--> -<!-- <item name="colorControlNormal">@android:color/white</item>--> -<!-- <item name="colorControlActivated">@android:color/white</item>--> -<!-- <item name="colorControlHighlight">@android:color/white</item>--> -<!-- </style>--> - <style name="DarkAppTheme" parent="Theme.AppCompat.DayNight.DarkActionBar"> <item name="colorPrimary">@color/primary</item> <item name="colorPrimaryDark">@color/primary</item> |