From 22fb9c8efb26248e73055afd26a52c10fe830f5b Mon Sep 17 00:00:00 2001 From: A117870935 Date: Thu, 25 May 2023 14:18:34 +0530 Subject: [PATCH] List divider added for tablet and landscape mode. NMC-2142: Upload file button text size configured. NMC-4239: FolderPickerActivity button text size configured NMC-4667 -- fix tablet grid span count --- .../com/nmc/android/utils/DisplayUtils.kt | 18 +++ .../ui/activity/FolderPickerActivity.kt | 26 ++++ .../ui/activity/UploadFilesActivity.java | 15 +++ .../ui/activity/UploadListActivity.java | 41 ++++++ .../SimpleListItemDividerDecoration.java | 86 +++++++++++++ .../ui/fragment/OCFileListFragment.java | 117 ++++++++++++++++++ .../android/ui/trashbin/TrashbinActivity.kt | 38 ++++++ app/src/main/res/drawable/item_divider.xml | 6 + app/src/main/res/values-night/colors.xml | 64 ++++++++++ app/src/main/res/values-sw480dp/bool.xml | 4 + app/src/main/res/values/bool.xml | 4 + app/src/main/res/values/colors.xml | 89 +++++++++++++ app/src/main/res/values/dimens.xml | 31 +++++ 13 files changed, 539 insertions(+) create mode 100644 app/src/main/java/com/nmc/android/utils/DisplayUtils.kt create mode 100644 app/src/main/java/com/owncloud/android/ui/decoration/SimpleListItemDividerDecoration.java create mode 100644 app/src/main/res/drawable/item_divider.xml create mode 100644 app/src/main/res/values-sw480dp/bool.xml create mode 100644 app/src/main/res/values/bool.xml create mode 100644 app/src/main/res/values/dimens.xml diff --git a/app/src/main/java/com/nmc/android/utils/DisplayUtils.kt b/app/src/main/java/com/nmc/android/utils/DisplayUtils.kt new file mode 100644 index 000000000000..f58e93c4252a --- /dev/null +++ b/app/src/main/java/com/nmc/android/utils/DisplayUtils.kt @@ -0,0 +1,18 @@ +package com.nmc.android.utils + +import android.content.res.Configuration +import com.owncloud.android.MainApp +import com.owncloud.android.R + +object DisplayUtils { + + @JvmStatic + fun isShowDividerForList(): Boolean = isTablet() || isLandscapeOrientation() + + @JvmStatic + fun isTablet(): Boolean = MainApp.getAppContext().resources.getBoolean(R.bool.isTablet) + + @JvmStatic + fun isLandscapeOrientation(): Boolean = + MainApp.getAppContext().resources.configuration.orientation == Configuration.ORIENTATION_LANDSCAPE +} \ No newline at end of file diff --git a/app/src/main/java/com/owncloud/android/ui/activity/FolderPickerActivity.kt b/app/src/main/java/com/owncloud/android/ui/activity/FolderPickerActivity.kt index 3730796b21ae..a5af454479f1 100644 --- a/app/src/main/java/com/owncloud/android/ui/activity/FolderPickerActivity.kt +++ b/app/src/main/java/com/owncloud/android/ui/activity/FolderPickerActivity.kt @@ -16,6 +16,7 @@ import android.content.IntentFilter import android.content.res.Resources import android.os.Bundle import android.os.Parcelable +import android.util.TypedValue import android.view.ActionMode import android.view.Menu import android.view.MenuItem @@ -53,6 +54,7 @@ import com.owncloud.android.utils.PathUtils import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import java.io.File +import java.util.Locale import javax.inject.Inject @Suppress("Detekt.TooManyFunctions") @@ -457,6 +459,30 @@ open class FolderPickerActivity : OperationsService.ACTION_MOVE_FILE ) } + adjustButtonTexts() + } + } + + // NMC-4239 fix + // adjust button german texts in portrait mode + private fun adjustButtonTexts(){ + if (!com.nmc.android.utils.DisplayUtils.isTablet() && !com.nmc.android.utils.DisplayUtils.isLandscapeOrientation()) { + if (Locale.getDefault().language.equals(Locale.GERMAN.language) + || Locale.getDefault().language.equals(Locale.GERMANY.language) + ) { + folderPickerBinding.folderPickerBtnCopy.setTextSize( + TypedValue.COMPLEX_UNIT_PX, + getResources().getDimension(R.dimen.txt_size_11sp) + ) + folderPickerBinding.folderPickerBtnMove.setTextSize( + TypedValue.COMPLEX_UNIT_PX, + getResources().getDimension(R.dimen.txt_size_11sp) + ) + folderPickerBinding.folderPickerBtnCancel.setTextSize( + TypedValue.COMPLEX_UNIT_PX, + getResources().getDimension(R.dimen.txt_size_11sp) + ); + } } } diff --git a/app/src/main/java/com/owncloud/android/ui/activity/UploadFilesActivity.java b/app/src/main/java/com/owncloud/android/ui/activity/UploadFilesActivity.java index 01cd186d83f6..2d0df0f7a5b5 100644 --- a/app/src/main/java/com/owncloud/android/ui/activity/UploadFilesActivity.java +++ b/app/src/main/java/com/owncloud/android/ui/activity/UploadFilesActivity.java @@ -19,6 +19,7 @@ import android.content.Intent; import android.os.Bundle; import android.os.Environment; +import android.util.TypedValue; import android.view.Menu; import android.view.MenuItem; import android.view.View; @@ -57,6 +58,7 @@ import java.io.File; import java.util.ArrayList; import java.util.List; +import java.util.Locale; import javax.inject.Inject; @@ -199,6 +201,19 @@ public void onCreate(Bundle savedInstanceState) { binding.uploadFilesBtnUpload.setOnClickListener(this); binding.uploadFilesBtnUpload.setEnabled(mLocalFolderPickerMode); + //reduce the button text size so that the text doesn't go to next line + //this should only happen for GERMAN language + //and device should not be tablet and should be in portrait mode + if (!com.nmc.android.utils.DisplayUtils.isTablet() && !com.nmc.android.utils.DisplayUtils.isLandscapeOrientation()) { + if (Locale.getDefault().getLanguage().equals(Locale.GERMAN.getLanguage()) + || Locale.getDefault().getLanguage().equals(Locale.GERMANY.getLanguage())) { + binding.uploadFilesBtnUpload.setTextSize(TypedValue.COMPLEX_UNIT_PX, + getResources().getDimensionPixelSize(R.dimen.txt_size_13sp)); + binding.uploadFilesBtnCancel.setTextSize(TypedValue.COMPLEX_UNIT_PX, + getResources().getDimensionPixelSize(R.dimen.txt_size_13sp)); + } + } + int localBehaviour = preferences.getUploaderBehaviour(); // file upload spinner diff --git a/app/src/main/java/com/owncloud/android/ui/activity/UploadListActivity.java b/app/src/main/java/com/owncloud/android/ui/activity/UploadListActivity.java index f66a279a44a2..22065b3a7f86 100755 --- a/app/src/main/java/com/owncloud/android/ui/activity/UploadListActivity.java +++ b/app/src/main/java/com/owncloud/android/ui/activity/UploadListActivity.java @@ -14,6 +14,7 @@ import android.content.Context; import android.content.Intent; import android.content.IntentFilter; +import android.content.res.Configuration; import android.os.Bundle; import android.view.Menu; import android.view.MenuInflater; @@ -41,10 +42,13 @@ import com.owncloud.android.operations.CheckCurrentCredentialsOperation; import com.owncloud.android.ui.adapter.UploadListAdapter; import com.owncloud.android.ui.decoration.MediaGridItemDecoration; +import com.owncloud.android.utils.DisplayUtils; +import com.owncloud.android.ui.decoration.SimpleListItemDividerDecoration; import com.owncloud.android.utils.FilesSyncHelper; import javax.inject.Inject; +import androidx.annotation.NonNull; import androidx.localbroadcastmanager.content.LocalBroadcastManager; import androidx.recyclerview.widget.GridLayoutManager; import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; @@ -90,6 +94,8 @@ public class UploadListActivity extends FileActivity { private UploadListLayoutBinding binding; + private SimpleListItemDividerDecoration simpleListItemDividerDecoration; + public static Intent createIntent(OCFile file, User user, Integer flag, Context context) { Intent intent = new Intent(context, UploadListActivity.class); if (flag != null) { @@ -167,6 +173,8 @@ private void setupContent() { int spacing = getResources().getDimensionPixelSize(R.dimen.media_grid_spacing); binding.list.addItemDecoration(new MediaGridItemDecoration(spacing)); binding.list.setLayoutManager(lm); + simpleListItemDividerDecoration = new SimpleListItemDividerDecoration(this, R.drawable.item_divider, true); + addListItemDecorator(); binding.list.setAdapter(uploadListAdapter); viewThemeUtils.androidx.themeSwipeRefreshLayout(swipeListRefreshLayout); @@ -175,6 +183,23 @@ private void setupContent() { loadItems(); } + private void addListItemDecorator() { + if (com.nmc.android.utils.DisplayUtils.isShowDividerForList()) { + //check and remove divider item decorator if exist then add item decorator + removeListDividerDecorator(); + binding.list.addItemDecoration(simpleListItemDividerDecoration); + } + } + + /** + * method to remove the divider item decorator + */ + private void removeListDividerDecorator() { + if (binding.list.getItemDecorationCount() > 0) { + binding.list.removeItemDecoration(simpleListItemDividerDecoration); + } + } + private void loadItems() { swipeListRefreshLayout.setRefreshing(true); uploadListAdapter.loadUploadItemsFromDb(() -> swipeListRefreshLayout.setRefreshing(false)); @@ -334,4 +359,20 @@ public void onReceive(Context context, Intent intent) { throttler.run("update_upload_list", () -> uploadListAdapter.loadUploadItemsFromDb()); } } + + @Override + public void onConfigurationChanged(@NonNull Configuration newConfig) { + super.onConfigurationChanged(newConfig); + //this should only run when device is not tablet because we are adding dividers in tablet for both the + // orientations + if (!com.nmc.android.utils.DisplayUtils.isTablet()) { + if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) { + //add the divider item decorator when orientation is landscape + addListItemDecorator(); + } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) { + //remove the divider item decorator when orientation is portrait + removeListDividerDecorator(); + } + } + } } diff --git a/app/src/main/java/com/owncloud/android/ui/decoration/SimpleListItemDividerDecoration.java b/app/src/main/java/com/owncloud/android/ui/decoration/SimpleListItemDividerDecoration.java new file mode 100644 index 000000000000..720b40d04e1e --- /dev/null +++ b/app/src/main/java/com/owncloud/android/ui/decoration/SimpleListItemDividerDecoration.java @@ -0,0 +1,86 @@ +/* + * Nextcloud - Android Client + * + * SPDX-FileCopyrightText: 2018 Andy Scherzinger + * SPDX-License-Identifier: AGPL-3.0-or-later OR GPL-2.0-only + */ +package com.owncloud.android.ui.decoration; + +import android.content.Context; +import android.content.res.TypedArray; +import android.graphics.Canvas; +import android.graphics.Rect; +import android.graphics.drawable.Drawable; +import android.util.DisplayMetrics; +import android.view.View; + +import androidx.core.content.ContextCompat; +import androidx.recyclerview.widget.DividerItemDecoration; +import androidx.recyclerview.widget.RecyclerView; + +/** + * DividerItemDecoration based on {@link DividerItemDecoration} adding a 72dp left padding. + */ +public class SimpleListItemDividerDecoration extends DividerItemDecoration { + private static final int[] ATTRS = new int[]{android.R.attr.listDivider}; + + private final Rect bounds = new Rect(); + private Drawable divider; + private int leftPadding = 0; + private boolean hasFooter; + + /** + * Default divider will be used + */ + public SimpleListItemDividerDecoration(Context context) { + super(context, DividerItemDecoration.VERTICAL); + final TypedArray styledAttributes = context.obtainStyledAttributes(ATTRS); + divider = styledAttributes.getDrawable(0); + leftPadding = Math.round(72 * (context.getResources().getDisplayMetrics().xdpi / DisplayMetrics.DENSITY_DEFAULT)); + styledAttributes.recycle(); + } + + /** + * Custom divider will be used + * + * @param hasFooter if recyclerview has footer and no divider should be shown for footer then pass true else false + */ + public SimpleListItemDividerDecoration(Context context, int resId, boolean hasFooter) { + super(context, DividerItemDecoration.VERTICAL); + this.hasFooter = hasFooter; + divider = ContextCompat.getDrawable(context, resId); + } + + @Override + public void onDraw(Canvas canvas, RecyclerView parent, RecyclerView.State state) { + canvas.save(); + final int right; + //noinspection AndroidLintNewApi - NewApi lint fails to handle overrides. + if (parent.getClipToPadding()) { + right = parent.getWidth() - parent.getPaddingRight(); + canvas.clipRect(leftPadding, parent.getPaddingTop(), right, + parent.getHeight() - parent.getPaddingBottom()); + } else { + right = parent.getWidth(); + } + + int childCount = parent.getChildCount(); + + if (hasFooter) { + childCount = childCount - 1; + } + + for (int i = 0; i < childCount; i++) { + final View child = parent.getChildAt(i); + parent.getDecoratedBoundsWithMargins(child, bounds); + final int bottom = bounds.bottom + Math.round(child.getTranslationY()); + final int top = bottom - 1; + + if (divider != null) { + divider.setBounds(leftPadding, top, right, bottom); + divider.draw(canvas); + } + } + canvas.restore(); + } +} diff --git a/app/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java b/app/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java index 25a1d1a0b192..4c74615c2558 100644 --- a/app/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java +++ b/app/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java @@ -19,12 +19,14 @@ import android.app.Activity; import android.content.Context; import android.content.Intent; +import android.content.res.Configuration; import android.os.Bundle; import android.os.Handler; import android.os.Looper; import android.text.TextUtils; import android.util.Log; import android.util.Pair; +import android.util.DisplayMetrics; import android.view.ActionMode; import android.view.LayoutInflater; import android.view.Menu; @@ -47,6 +49,7 @@ import com.nextcloud.client.editimage.EditImageActivity; import com.nextcloud.client.jobs.BackgroundJobManager; import com.nextcloud.client.network.ClientFactory; +import com.nextcloud.client.preferences.AppPreferencesImpl; import com.nextcloud.client.utils.Throttler; import com.nextcloud.common.NextcloudClient; import com.nextcloud.ui.fileactions.FileAction; @@ -87,6 +90,8 @@ import com.owncloud.android.ui.activity.UploadFilesActivity; import com.owncloud.android.ui.adapter.CommonOCFileListAdapterInterface; import com.owncloud.android.ui.adapter.OCFileListAdapter; +import com.owncloud.android.ui.decoration.MediaGridItemDecoration; +import com.owncloud.android.ui.decoration.SimpleListItemDividerDecoration; import com.owncloud.android.ui.dialog.ChooseRichDocumentsTemplateDialogFragment; import com.owncloud.android.ui.dialog.ChooseTemplateDialogFragment; import com.owncloud.android.ui.dialog.ConfirmationDialogFragment; @@ -230,6 +235,9 @@ public class OCFileListFragment extends ExtendedListFragment implements private FloatingActionButton mFabMain; public static boolean isMultipleFileSelectedForCopyOrMove = false; + private SimpleListItemDividerDecoration simpleListItemDividerDecoration; + private MediaGridItemDecoration mediaGridItemDecoration; + @Inject DeviceInfo deviceInfo; protected enum MenuItemAddRemove { @@ -245,6 +253,13 @@ protected enum MenuItemAddRemove { private static OCFileDepth fileDepth = OCFileDepth.Root; + private int maxColumnSizeLandscape = 5; + + //this variable will help us to provide number of span count for grid view + //the width for single item is approx to 180 + private static final int GRID_ITEM_DEFAULT_WIDTH = 180; + private static final int DEFAULT_FALLBACK_SPAN_COUNT = 4; + @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -454,6 +469,10 @@ protected void setAdapter(Bundle args) { viewThemeUtils ); + simpleListItemDividerDecoration = new SimpleListItemDividerDecoration(getContext(), R.drawable.item_divider, true); + int spacing = getResources().getDimensionPixelSize(R.dimen.media_grid_spacing); + mediaGridItemDecoration = new MediaGridItemDecoration(spacing); + setRecyclerViewAdapter(mAdapter); if (getRecyclerView() != null) { @@ -1700,6 +1719,7 @@ public void switchToListView() { if (isGridEnabled()) { switchLayoutManager(false); } + addRemoveRecyclerViewItemDecorator(); } public void setGridAsPreferred() { @@ -1711,6 +1731,33 @@ public void switchToGridView() { if (!isGridEnabled()) { switchLayoutManager(true); } + addRemoveRecyclerViewItemDecorator(); + } + + private void addRemoveRecyclerViewItemDecorator() { + if (getRecyclerView().getLayoutManager() instanceof GridLayoutManager) { + removeItemDecorator(); + if (getRecyclerView().getItemDecorationCount() == 0) { + getRecyclerView().addItemDecoration(mediaGridItemDecoration); + int padding = getResources().getDimensionPixelSize(R.dimen.grid_recyclerview_padding); + getRecyclerView().setPadding(padding, padding, padding, padding); + } + } else { + removeItemDecorator(); + if (getRecyclerView().getItemDecorationCount() == 0 && com.nmc.android.utils.DisplayUtils.isShowDividerForList()) { + getRecyclerView().addItemDecoration(simpleListItemDividerDecoration); + getRecyclerView().setPadding(0, 0, 0, 0); + } + } + } + + /** + * method to remove the item decorator + */ + private void removeItemDecorator() { + while (getRecyclerView().getItemDecorationCount() > 0) { + getRecyclerView().removeItemDecorationAt(0); + } } @SuppressLint("NotifyDataSetChanged") @@ -1750,12 +1797,34 @@ public int getSpanSize(int position) { } recyclerView.setLayoutManager(layoutManager); + updateSpanCount(getResources().getConfiguration()); recyclerView.scrollToPosition(position); adapter.setGridView(grid); recyclerView.setAdapter(adapter); adapter.notifyDataSetChanged(); } + /** + * method will calculate the number of spans required for grid item and will update the span accordingly + * + */ + private void calculateAndUpdateSpanCount() { + // NMC-4667 fix + // use display metrics to calculate the span count + DisplayMetrics displayMetrics = requireContext().getResources().getDisplayMetrics(); + float screenWidthDp = displayMetrics.widthPixels / displayMetrics.density; + int newSpanCount = (int) (screenWidthDp / GRID_ITEM_DEFAULT_WIDTH); + RecyclerView.LayoutManager layoutManager = getRecyclerView().getLayoutManager(); + if (layoutManager instanceof GridLayoutManager) { + if (newSpanCount < 1) { + newSpanCount = DEFAULT_FALLBACK_SPAN_COUNT; + } + ((GridLayoutManager) layoutManager).setSpanCount(newSpanCount); + layoutManager.requestLayout(); + } + + } + public CommonOCFileListAdapterInterface getCommonAdapter() { return mAdapter; } @@ -2350,4 +2419,52 @@ private boolean isSearchEvent(SearchRemoteOperation.SearchType givenEvent) { public boolean shouldNavigateBackToAllFiles() { return ((this instanceof GalleryFragment) || isSearchEventFavorite() || DrawerActivity.menuItemId == R.id.nav_favorites); } + + @Override + public void onConfigurationChanged(@NonNull Configuration newConfig) { + super.onConfigurationChanged(newConfig); + if (getAdapter() != null) { + getAdapter().notifyDataSetChanged(); + } + updateSpanCount(newConfig); + } + + /** + * method will update the span count on basis of device orientation for the file listing + * + * @param newConfig current configuration + */ + private void updateSpanCount(Configuration newConfig) { + //this should only run when current view is not media gallery + if (getAdapter() != null) { + int maxColumnSize = (int) AppPreferencesImpl.DEFAULT_GRID_COLUMN; + if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) { + //add the divider item decorator when orientation is landscape and device is not tablet + //because we don't have to add divider again as it is already added + if (!com.nmc.android.utils.DisplayUtils.isTablet()) { + addRemoveRecyclerViewItemDecorator(); + } + maxColumnSize = maxColumnSizeLandscape; + } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) { + //remove the divider item decorator when orientation is portrait and when device is not tablet + //because we have to show divider in both landscape and portrait mode + if (!com.nmc.android.utils.DisplayUtils.isTablet()) { + removeItemDecorator(); + } + maxColumnSize = (int) AppPreferencesImpl.DEFAULT_GRID_COLUMN; + } + + if (isGridEnabled()) { + //for tablet calculate size on the basis of screen width + if (com.nmc.android.utils.DisplayUtils.isTablet()) { + calculateAndUpdateSpanCount(); + } else { + //and for phones directly show the hardcoded column size + if (getRecyclerView().getLayoutManager() instanceof GridLayoutManager) { + ((GridLayoutManager) getRecyclerView().getLayoutManager()).setSpanCount(maxColumnSize); + } + } + } + } + } } diff --git a/app/src/main/java/com/owncloud/android/ui/trashbin/TrashbinActivity.kt b/app/src/main/java/com/owncloud/android/ui/trashbin/TrashbinActivity.kt index 75fc42f109fd..07e7cb60580d 100644 --- a/app/src/main/java/com/owncloud/android/ui/trashbin/TrashbinActivity.kt +++ b/app/src/main/java/com/owncloud/android/ui/trashbin/TrashbinActivity.kt @@ -10,6 +10,7 @@ package com.owncloud.android.ui.trashbin import android.content.Intent +import android.content.res.Configuration import android.os.Bundle import android.view.ActionMode import android.view.Menu @@ -40,6 +41,7 @@ import com.owncloud.android.datamodel.SyncedFolderProvider import com.owncloud.android.lib.resources.trashbin.model.TrashbinFile import com.owncloud.android.ui.activity.DrawerActivity import com.owncloud.android.ui.adapter.TrashbinListAdapter +import com.owncloud.android.ui.decoration.SimpleListItemDividerDecoration import com.owncloud.android.ui.dialog.SortingOrderDialogFragment.OnSortingOrderListener import com.owncloud.android.ui.interfaces.TrashbinActivityInterface import com.owncloud.android.utils.DisplayUtils @@ -94,6 +96,8 @@ class TrashbinActivity : } } + private var simpleListItemDividerDecoration: SimpleListItemDividerDecoration? = null + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -162,6 +166,8 @@ class TrashbinActivity : recyclerView.setHasFixedSize(true) recyclerView.setHasFooter(true) recyclerView.layoutManager = LinearLayoutManager(this) + simpleListItemDividerDecoration = SimpleListItemDividerDecoration(this, R.drawable.item_divider, true) + addListItemDecorator() viewThemeUtils?.androidx?.themeSwipeRefreshLayout(binding.swipeContainingList) binding.swipeContainingList.setOnRefreshListener { loadFolder() } @@ -196,6 +202,23 @@ class TrashbinActivity : addDrawerListener(mMultiChoiceModeListener) } + private fun addListItemDecorator() { + if (com.nmc.android.utils.DisplayUtils.isShowDividerForList()) { + // check and remove divider item decorator if exist then add item decorator + removeListDividerDecorator() + binding.list.addItemDecoration(simpleListItemDividerDecoration!!) + } + } + + /** + * method to remove the divider item decorator + */ + private fun removeListDividerDecorator() { + if (binding.list.itemDecorationCount > 0) { + binding.list.removeItemDecoration(simpleListItemDividerDecoration!!) + } + } + private fun handleBackPress() { onBackPressedDispatcher.addCallback( this, @@ -471,6 +494,21 @@ class TrashbinActivity : } } + override fun onConfigurationChanged(newConfig: Configuration) { + super.onConfigurationChanged(newConfig) + // this should only run when device is not tablet because we are adding dividers in tablet for both the + // orientations + if (!com.nmc.android.utils.DisplayUtils.isTablet()) { + if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) { + // add the divider item decorator when orientation is landscape + addListItemDecorator() + } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) { + // remove the divider item decorator when orientation is portrait + removeListDividerDecorator() + } + } + } + companion object { const val EMPTY_LIST_COUNT = 1 } diff --git a/app/src/main/res/drawable/item_divider.xml b/app/src/main/res/drawable/item_divider.xml new file mode 100644 index 000000000000..9f742e91d67c --- /dev/null +++ b/app/src/main/res/drawable/item_divider.xml @@ -0,0 +1,6 @@ + + + + + diff --git a/app/src/main/res/values-night/colors.xml b/app/src/main/res/values-night/colors.xml index db1e1d218038..c5134bdaad77 100644 --- a/app/src/main/res/values-night/colors.xml +++ b/app/src/main/res/values-night/colors.xml @@ -39,4 +39,68 @@ @android:color/white #101418 + + + #FFFFFF + @color/grey_30 + @color/grey_30 + #CCCCCC + @color/grey_70 + @color/grey_80 + #2D2D2D + @color/grey_70 + @color/grey_70 + + + @color/grey_80 + @color/grey_0 + + + @color/grey_80 + @color/grey_0 + + + @color/grey_60 + @color/grey_0 + @color/grey_0 + @color/grey_30 + #FFFFFF + @color/grey_30 + @color/grey_80 + #FFFFFF + + + @color/grey_80 + @color/grey_30 + @color/grey_0 + + + @color/grey_80 + @color/grey_0 + @color/grey_80 + + + @color/grey_70 + @color/grey_60 + + + @color/grey_70 + @color/grey_70 + + + #FFFFFF + @color/grey_30 + @color/grey_0 + @color/grey_0 + @color/grey_0 + @color/grey_0 + @color/grey_60 + @color/grey_0 + #FFFFFF + + + #121212 + @color/grey_0 + @color/grey_80 + @color/grey_80 diff --git a/app/src/main/res/values-sw480dp/bool.xml b/app/src/main/res/values-sw480dp/bool.xml new file mode 100644 index 000000000000..8e66f10e898c --- /dev/null +++ b/app/src/main/res/values-sw480dp/bool.xml @@ -0,0 +1,4 @@ + + + true + diff --git a/app/src/main/res/values/bool.xml b/app/src/main/res/values/bool.xml new file mode 100644 index 000000000000..c2dcd8baf0ea --- /dev/null +++ b/app/src/main/res/values/bool.xml @@ -0,0 +1,4 @@ + + + false + diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 36d7459ecdaf..90c40fb1a4ad 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -89,4 +89,93 @@ #A5A5A5 #F7F9FF + + + #191919 + @color/primary + #191919 + #191919 + @color/grey_30 + @android:color/white + #FFFFFF + @color/grey_0 + #CCCCCC + #77c4ff + #B3FFFFFF + @color/grey_10 + + + #101010 + #F2F2F2 + #E5E5E5 + #B2B2B2 + #666666 + #4C4C4C + #333333 + + + @color/design_snackbar_background_color + @color/white + + + #FFFFFF + #191919 + + + @color/grey_0 + #191919 + @color/primary + #191919 + @color/primary + @color/grey_30 + @color/white + #191919 + + + #FFFFFF + #191919 + #191919 + + + #FFFFFF + #191919 + #FFFFFF + + + @color/primary + #F399C7 + #FFFFFF + @color/grey_30 + @color/grey_10 + @color/grey_0 + + + @color/primary + @color/grey_30 + @color/grey_30 + #CCCCCC + + + #191919 + @color/grey_30 + #191919 + #191919 + #191919 + #191919 + @color/grey_30 + #191919 + #000000 + #191919 + #F6E5EB + #C16F81 + #0D39DF + #0099ff + + + @color/grey_0 + #191919 + @color/grey_0 + @color/grey_30 + #77b6bb + #5077b6bb diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml new file mode 100644 index 000000000000..cc9e25255a10 --- /dev/null +++ b/app/src/main/res/values/dimens.xml @@ -0,0 +1,31 @@ + + + 4dp + 16dp + 24dp + 6dp + 18sp + 15sp + 15dp + 56dp + 86dp + 80dp + 11sp + 30dp + 55dp + 258dp + 17sp + 20dp + 160dp + 50dp + 150dp + 55dp + 48dp + 48dp + 24dp + 26dp + 20sp + 145dp + 1dp + 13sp + \ No newline at end of file