NTP-18296 | Gold landing page revamp (#14205)
This commit is contained in:
@@ -33,6 +33,7 @@ import androidx.lifecycle.Lifecycle
|
||||
import androidx.lifecycle.ViewModelProvider
|
||||
import androidx.lifecycle.lifecycleScope
|
||||
import androidx.recyclerview.widget.LinearLayoutManager
|
||||
import androidx.recyclerview.widget.RecyclerView
|
||||
import com.navi.analytics.utils.NaviTrackEvent
|
||||
import com.navi.analytics.utils.SCREEN_NAME
|
||||
import com.navi.base.AppServiceManager
|
||||
@@ -114,6 +115,7 @@ import com.navi.gold.navigator.NaviDigitalGoldDeeplinkNavigator
|
||||
import com.navi.gold.navigator.NaviDigitalGoldDeeplinkNavigator.GOLD
|
||||
import com.navi.gold.toOpenBottomSheet
|
||||
import com.navi.gold.util.CommonUtils
|
||||
import com.navi.gold.util.CommonUtils.updateColorsBasedOnPosition
|
||||
import com.navi.gold.util.Constants
|
||||
import com.navi.gold.util.Constants.AMOUNT_DATA
|
||||
import com.navi.gold.util.Constants.APP_ACTION_OBJECTIVE_REWARDS_CAMPAIGN_ONBOARD
|
||||
@@ -140,6 +142,7 @@ import com.navi.gold.util.Constants.PAN_VERIFY_BOTTOM_SHEET
|
||||
import com.navi.gold.util.Constants.PD_RPD_SELECTION
|
||||
import com.navi.gold.util.Constants.SETTINGS
|
||||
import com.navi.gold.util.Constants.SETUP_SIP_REFRESH
|
||||
import com.navi.gold.util.Constants.SETUP_SIP_WIDGET
|
||||
import com.navi.gold.util.Constants.SHOW_OFFER_BOTTOMSHEET
|
||||
import com.navi.gold.util.Constants.SHOW_WIDGET_BOTTOM_SHEET
|
||||
import com.navi.gold.util.Constants.SIP_SETUP_FAILED
|
||||
@@ -189,6 +192,7 @@ import com.navi.naviwidgets.models.GoldPortfolioCardWidget
|
||||
import com.navi.naviwidgets.models.NaviBaseAdapterModel
|
||||
import com.navi.naviwidgets.models.NaviWidget
|
||||
import com.navi.naviwidgets.models.ShareData
|
||||
import com.navi.naviwidgets.models.SipCardWidget
|
||||
import com.navi.naviwidgets.models.TextCardWithShimmerWidget
|
||||
import com.navi.naviwidgets.models.WidgetChangedData
|
||||
import com.navi.naviwidgets.models.response.HomeProductWidget
|
||||
@@ -405,6 +409,7 @@ class DigitalGoldHomeActivity :
|
||||
onBackPressed()
|
||||
}
|
||||
}
|
||||
setScrollListener()
|
||||
}
|
||||
|
||||
private fun showShimmer() {
|
||||
@@ -1238,6 +1243,7 @@ class DigitalGoldHomeActivity :
|
||||
|
||||
private fun processHeader(response: WidgetResponse?) {
|
||||
response?.header?.let {
|
||||
homeVM.setStatusBarColor(it.backgroundColor.parseColorSafe(COLOR_WHITE))
|
||||
it.title?.let { title ->
|
||||
it.leftIconCode?.let { leftIconCode ->
|
||||
binding.ivBack.showWhenDataIsAvailable(leftIconCode)
|
||||
@@ -1289,6 +1295,23 @@ class DigitalGoldHomeActivity :
|
||||
}
|
||||
}
|
||||
|
||||
private fun setScrollListener() {
|
||||
binding.rvGoldItems.addOnScrollListener(
|
||||
object : RecyclerView.OnScrollListener() {
|
||||
override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
|
||||
super.onScrolled(recyclerView, dx, dy)
|
||||
updateColorsBasedOnPosition(
|
||||
recyclerView = recyclerView,
|
||||
activity = this@DigitalGoldHomeActivity,
|
||||
headerView = binding.clHeaderView,
|
||||
defaultColor = Color.WHITE,
|
||||
statusBarColor = homeVM.getStatusBarColor()
|
||||
)
|
||||
}
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
private fun fetchDigitalHomePageDetails(
|
||||
forceRefresh: Boolean = true,
|
||||
setUpSipRefresh: Boolean = false
|
||||
@@ -1813,8 +1836,9 @@ class DigitalGoldHomeActivity :
|
||||
is GoldMinOfferSectionClickAction -> {
|
||||
if (naviClickAction.actionData?.url == SHOW_OFFER_BOTTOMSHEET) {
|
||||
val bundle = Bundle()
|
||||
naviClickAction.offerSectionData?.content?.remainingAmount =
|
||||
homeVM.getRemainingAmount().formatAmount()
|
||||
naviClickAction.offerSectionData?.content?.offerTickets?.forEach { card ->
|
||||
card.remainingAmount = homeVM.getRemainingAmount().formatAmount()
|
||||
}
|
||||
bundle.putParcelable(DATA, naviClickAction.offerSectionData)
|
||||
GoldOfferBottomSheet.newInstance(bundle = bundle).apply {
|
||||
safelyShowBottomSheet(this, GoldOfferBottomSheet.TAG)
|
||||
@@ -1880,6 +1904,20 @@ class DigitalGoldHomeActivity :
|
||||
)
|
||||
)
|
||||
}
|
||||
if (
|
||||
naviWidget is SipCardWidget &&
|
||||
(naviWidget.widgetId == SETUP_SIP_WIDGET &&
|
||||
(state && naviWidget.widgetId == widgetId || !state))
|
||||
) {
|
||||
|
||||
val sipCardWidget = naviWidget.widgetData
|
||||
sipCardWidget?.buttonLoaderState = ButtonLoaderState(state)
|
||||
isScreenBlocked = state
|
||||
naviAdapter.notifyItemChanged(
|
||||
index,
|
||||
WidgetChangedData(WIDGET_STATE_CHANGE, sipCardWidget?.buttonLoaderState)
|
||||
)
|
||||
}
|
||||
|
||||
if (naviWidget is ContainerWidget) {
|
||||
val itemsOfContainerWidget = naviWidget.widgetData?.items
|
||||
@@ -2009,6 +2047,17 @@ class DigitalGoldHomeActivity :
|
||||
}
|
||||
|
||||
startTimer()
|
||||
binding.rvGoldItems.layoutManager?.let { layoutManager ->
|
||||
if (layoutManager is LinearLayoutManager) {
|
||||
updateColorsBasedOnPosition(
|
||||
recyclerView = binding.rvGoldItems,
|
||||
activity = this@DigitalGoldHomeActivity,
|
||||
headerView = binding.clHeaderView,
|
||||
defaultColor = Color.WHITE,
|
||||
statusBarColor = homeVM.getStatusBarColor()
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun checkForLocationPermission(): Boolean {
|
||||
@@ -2178,6 +2227,8 @@ class DigitalGoldHomeActivity :
|
||||
super.onStop()
|
||||
timer?.cancel()
|
||||
timer = null
|
||||
binding.clHeaderView.setBackgroundColor(Color.WHITE)
|
||||
window?.statusBarColor = Color.WHITE
|
||||
}
|
||||
|
||||
override fun onDestroy() {
|
||||
|
||||
@@ -19,6 +19,7 @@ import androidx.databinding.DataBindingUtil
|
||||
import androidx.lifecycle.ViewModelProvider
|
||||
import androidx.lifecycle.lifecycleScope
|
||||
import androidx.recyclerview.widget.LinearLayoutManager
|
||||
import androidx.recyclerview.widget.RecyclerView
|
||||
import com.google.gson.Gson
|
||||
import com.navi.analytics.utils.NaviTrackEvent
|
||||
import com.navi.analytics.utils.SCREEN_NAME
|
||||
@@ -62,11 +63,13 @@ import com.navi.design.utils.parseColorSafe
|
||||
import com.navi.gold.R
|
||||
import com.navi.gold.databinding.ActivityDigitalGoldTransactionBinding
|
||||
import com.navi.gold.util.CommonUtils
|
||||
import com.navi.gold.util.CommonUtils.updateColorsBasedOnPosition
|
||||
import com.navi.gold.util.Constants
|
||||
import com.navi.gold.util.Constants.CSAT_POPUP_DELAY
|
||||
import com.navi.gold.util.Constants.CSAT_POPUP_DELAY_TIME
|
||||
import com.navi.gold.util.Constants.REDIRECTION_SOURCE
|
||||
import com.navi.gold.util.Constants.SHOW_REWARD_GRATIFICATION
|
||||
import com.navi.gold.util.Constants.TYPE
|
||||
import com.navi.gold.util.GoldAnalytics
|
||||
import com.navi.gold.util.GoldAnalytics.DIGITAL_GOLD_TRANSACTION_SCREEN
|
||||
import com.navi.gold.util.GoldAnalytics.FEEDBACK
|
||||
@@ -85,6 +88,7 @@ import com.navi.naviwidgets.models.NaviWidget
|
||||
import com.navi.naviwidgets.models.response.CSATResponse
|
||||
import com.navi.naviwidgets.models.response.CsatWidget
|
||||
import com.navi.naviwidgets.viewholder.ViewHolderFactoryImpl
|
||||
import com.navi.naviwidgets.widgets.InfoWithTimerWidgetLayout.Companion.COLOR_WHITE
|
||||
import com.navi.rr.scratchcard.ui.fragment.ScratchCardFragment
|
||||
import com.navi.rr.scratchcard.vm.ScratchCardSharedVm
|
||||
import dagger.hilt.android.AndroidEntryPoint
|
||||
@@ -179,6 +183,17 @@ class DigitalGoldTransactionActivity : BaseActivity(), WidgetCallback, CsatCompl
|
||||
viewModel.fetchDigitalGoldCSATResponse(DG_TRANSACTION, null, screenName = screenName)
|
||||
startCsat(0)
|
||||
}
|
||||
binding.rvGoldItems.layoutManager?.let { layoutManager ->
|
||||
if (layoutManager is LinearLayoutManager) {
|
||||
updateColorsBasedOnPosition(
|
||||
recyclerView = binding.rvGoldItems,
|
||||
activity = this@DigitalGoldTransactionActivity,
|
||||
headerView = binding.clHeaderView,
|
||||
defaultColor = Color.WHITE,
|
||||
statusBarColor = viewModel.getStatusBarColor()
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
override fun onPause() {
|
||||
@@ -339,6 +354,7 @@ class DigitalGoldTransactionActivity : BaseActivity(), WidgetCallback, CsatCompl
|
||||
|
||||
private fun setPageContent(pageContent: WidgetResponse) {
|
||||
processHeader(pageContent)
|
||||
setScrollListener()
|
||||
pageContent.contentWidget?.let { listOfWidgets -> naviAdapter.setData(listOfWidgets) }
|
||||
}
|
||||
|
||||
@@ -361,6 +377,7 @@ class DigitalGoldTransactionActivity : BaseActivity(), WidgetCallback, CsatCompl
|
||||
|
||||
private fun processHeader(response: WidgetResponse?) {
|
||||
response?.header?.let {
|
||||
viewModel.setStatusBarColor(it.backgroundColor.parseColorSafe(COLOR_WHITE))
|
||||
viewModel.prefetchData(it.actionData?.url, screenName)
|
||||
it.title?.let { title ->
|
||||
it.leftIconCode?.let { leftIconCode ->
|
||||
@@ -380,6 +397,23 @@ class DigitalGoldTransactionActivity : BaseActivity(), WidgetCallback, CsatCompl
|
||||
}
|
||||
}
|
||||
|
||||
private fun setScrollListener() {
|
||||
binding.rvGoldItems.addOnScrollListener(
|
||||
object : RecyclerView.OnScrollListener() {
|
||||
override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
|
||||
super.onScrolled(recyclerView, dx, dy)
|
||||
updateColorsBasedOnPosition(
|
||||
recyclerView = recyclerView,
|
||||
activity = this@DigitalGoldTransactionActivity,
|
||||
headerView = binding.clHeaderView,
|
||||
defaultColor = Color.WHITE,
|
||||
statusBarColor = viewModel.getStatusBarColor()
|
||||
)
|
||||
}
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
private fun fetchData() {
|
||||
fetchDigitalTransactionPageDetails()
|
||||
viewModel.fetchDigitalGoldCSATResponse(DG_TRANSACTION, null, screenName = screenName)
|
||||
@@ -487,6 +521,20 @@ class DigitalGoldTransactionActivity : BaseActivity(), WidgetCallback, CsatCompl
|
||||
if (naviClickAction.actionData?.type == "DOWNLOAD_INVOICE") {
|
||||
fetchDigitalGoldInvoiceDownloadUrl(naviClickAction.actionData?.title)
|
||||
return
|
||||
} else if (naviClickAction.actionData?.url == "back") {
|
||||
onBackPressed()
|
||||
return
|
||||
}
|
||||
val bundle = Bundle()
|
||||
naviClickAction.actionData?.let {
|
||||
bundle.putString(TYPE, it.type.orEmpty())
|
||||
DeepLinkManager.getDeepLinkListener()
|
||||
?.navigateTo(
|
||||
this,
|
||||
it.toCtaData(),
|
||||
bundle = bundle,
|
||||
finish = naviClickAction.isFinish
|
||||
)
|
||||
}
|
||||
}
|
||||
is ActionData -> {
|
||||
@@ -571,6 +619,12 @@ class DigitalGoldTransactionActivity : BaseActivity(), WidgetCallback, CsatCompl
|
||||
}
|
||||
}
|
||||
|
||||
override fun onStop() {
|
||||
super.onStop()
|
||||
binding.clHeaderView.setBackgroundColor(Color.WHITE)
|
||||
window?.statusBarColor = Color.WHITE
|
||||
}
|
||||
|
||||
override fun onDestroy() {
|
||||
super.onDestroy()
|
||||
binding.unbind()
|
||||
|
||||
@@ -55,7 +55,12 @@ fun OfferBottomSheet(
|
||||
onDismiss = { onDismiss() },
|
||||
modifier = Modifier.padding(bottom = 16.dp)
|
||||
)
|
||||
OfferCard(offerContentData = bottomSheetData?.content)
|
||||
repeat(bottomSheetData?.content?.offerTickets?.size ?: 0) { index ->
|
||||
OfferCard(offerContentData = bottomSheetData?.content?.offerTickets?.get(index))
|
||||
if (index != bottomSheetData?.content?.offerTickets?.size?.minus(1)) {
|
||||
Spacer(modifier = Modifier.height(16.dp))
|
||||
}
|
||||
}
|
||||
BottomSheetFooter(footerData = bottomSheetData?.footer)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -42,6 +42,7 @@ import androidx.compose.ui.graphics.Color
|
||||
import androidx.compose.ui.layout.onSizeChanged
|
||||
import androidx.compose.ui.unit.dp
|
||||
import com.navi.common.uitron.render.TicketWithDividerRenderer
|
||||
import com.navi.design.R
|
||||
import com.navi.naviwidgets.extensions.NaviImage
|
||||
import com.navi.naviwidgets.extensions.NaviTextWidgetized
|
||||
import com.navi.naviwidgets.models.OfferContentData
|
||||
@@ -92,6 +93,26 @@ fun OfferCard(
|
||||
) {
|
||||
Spacer(modifier = Modifier.width(17.dp))
|
||||
NaviTextWidgetized(textFieldData = offerContentData?.title)
|
||||
Spacer(modifier = Modifier.width(3.dp))
|
||||
NaviImage(
|
||||
imageFieldData = offerContentData?.titleIcon,
|
||||
modifier =
|
||||
Modifier.width(
|
||||
(offerContentData?.titleIcon?.iconWidth
|
||||
?: R.integer.integer_16)
|
||||
.dp
|
||||
)
|
||||
.height(
|
||||
(offerContentData?.titleIcon?.iconHeight
|
||||
?: R.integer.integer_16)
|
||||
.dp
|
||||
)
|
||||
.align(Alignment.CenterVertically)
|
||||
)
|
||||
Spacer(modifier = Modifier.width(2.dp))
|
||||
NaviTextWidgetized(
|
||||
textFieldData = offerContentData?.titleSuffix,
|
||||
)
|
||||
}
|
||||
|
||||
Box(
|
||||
@@ -112,13 +133,24 @@ fun OfferCard(
|
||||
|
||||
Spacer(modifier = Modifier.height(8.dp))
|
||||
NaviTextWidgetized(textFieldData = offerContentData?.subTitle)
|
||||
Spacer(modifier = Modifier.height(6.dp))
|
||||
Row() {
|
||||
NaviTextWidgetized(textFieldData = offerContentData?.additionalInfoPrefix)
|
||||
offerContentData?.additionalInfoAmount?.text =
|
||||
" ₹${offerContentData?.remainingAmount} "
|
||||
NaviTextWidgetized(textFieldData = offerContentData?.additionalInfoAmount)
|
||||
NaviTextWidgetized(textFieldData = offerContentData?.additionalInfoSuffix)
|
||||
if (
|
||||
offerContentData?.additionalInfoAmount != null &&
|
||||
(offerContentData.remainingAmount?.toDoubleOrNull() ?: 0.0) > 0.0
|
||||
) {
|
||||
Spacer(modifier = Modifier.height(6.dp))
|
||||
Row() {
|
||||
NaviTextWidgetized(
|
||||
textFieldData = offerContentData.additionalInfoPrefix
|
||||
)
|
||||
offerContentData.additionalInfoAmount?.text =
|
||||
" ₹${offerContentData.remainingAmount} "
|
||||
NaviTextWidgetized(
|
||||
textFieldData = offerContentData.additionalInfoAmount
|
||||
)
|
||||
NaviTextWidgetized(
|
||||
textFieldData = offerContentData.additionalInfoSuffix
|
||||
)
|
||||
}
|
||||
}
|
||||
Spacer(modifier = Modifier.height(12.dp))
|
||||
}
|
||||
|
||||
@@ -10,8 +10,11 @@ package com.navi.gold.util
|
||||
import android.app.Activity
|
||||
import android.content.Intent
|
||||
import android.os.Bundle
|
||||
import android.view.View
|
||||
import androidx.fragment.app.DialogFragment
|
||||
import androidx.lifecycle.lifecycleScope
|
||||
import androidx.recyclerview.widget.LinearLayoutManager
|
||||
import androidx.recyclerview.widget.RecyclerView
|
||||
import com.navi.analytics.utils.NaviTrackEvent
|
||||
import com.navi.base.deeplink.DeepLinkManager
|
||||
import com.navi.base.model.ActionData
|
||||
@@ -139,4 +142,28 @@ object CommonUtils {
|
||||
TemporaryStorageHelper.SOFT_REF_CACHE.remove(NaviDigitalGoldDeeplinkNavigator.GOLD)
|
||||
TemporaryStorageHelper.setIsDataModified(NaviDigitalGoldDeeplinkNavigator.GOLD, true)
|
||||
}
|
||||
|
||||
fun updateColorsBasedOnPosition(
|
||||
recyclerView: RecyclerView,
|
||||
activity: Activity,
|
||||
headerView: View?,
|
||||
defaultColor: Int,
|
||||
statusBarColor: Int
|
||||
) {
|
||||
val layoutManager = recyclerView.layoutManager as? LinearLayoutManager
|
||||
val firstVisibleItemPosition =
|
||||
layoutManager?.findFirstVisibleItemPosition() ?: RecyclerView.NO_POSITION
|
||||
|
||||
if (firstVisibleItemPosition == RecyclerView.NO_POSITION) {
|
||||
return
|
||||
}
|
||||
|
||||
val colorToSet = if (firstVisibleItemPosition == 0) statusBarColor else defaultColor
|
||||
headerView?.let { updateStatusBarAndHeaderColor(activity, colorToSet, it) }
|
||||
}
|
||||
|
||||
private fun updateStatusBarAndHeaderColor(activity: Activity, color: Int, headerView: View) {
|
||||
activity.window?.let { it.statusBarColor = color }
|
||||
headerView.setBackgroundColor(color)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -64,6 +64,7 @@ object Constants {
|
||||
const val GOLD_INVESTMENT_PLAN_WIDGET = "GOLD_INVESTMENT_PLAN_WIDGET"
|
||||
const val SIP_SETUP_SUCCESS_CARD = "SIP_SETUP_SUCCESS_CARD"
|
||||
const val SIP_SETUP_IN_PROGRESS = "SIP_SETUP_IN_PROGRESS"
|
||||
const val SETUP_SIP_WIDGET = "SETUP_SIP_WIDGET"
|
||||
const val BUY_SUMMARY_BOTTOM_SHEET = "buy-summary-bottomsheet"
|
||||
const val PAN_VERIFY_BOTTOM_SHEET = "pan_verify_bottom_sheet"
|
||||
const val LOADER = "loader"
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
|
||||
package com.navi.gold.viewmodels
|
||||
|
||||
import android.graphics.Color
|
||||
import androidx.lifecycle.LiveData
|
||||
import androidx.lifecycle.MutableLiveData
|
||||
import androidx.lifecycle.viewModelScope
|
||||
@@ -74,6 +75,7 @@ constructor(
|
||||
|
||||
private var actualSellAmount: Double = 0.0
|
||||
private var remainingAmount: Double = 0.0
|
||||
private var statusBarColor: Int = Color.WHITE
|
||||
|
||||
private val _buyBottomSheetData = SingleLiveEvent<WidgetResponse>()
|
||||
val buyBottomSheetData: LiveData<WidgetResponse>
|
||||
@@ -119,6 +121,12 @@ constructor(
|
||||
|
||||
fun getRemainingAmount() = remainingAmount
|
||||
|
||||
fun setStatusBarColor(color: Int) {
|
||||
statusBarColor = color
|
||||
}
|
||||
|
||||
fun getStatusBarColor() = statusBarColor
|
||||
|
||||
fun setUserEnteredGoldValue(userEnteredGoldValue: String) {
|
||||
_goldValueState.value = userEnteredGoldValue
|
||||
}
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
|
||||
package com.navi.gold.viewmodels
|
||||
|
||||
import android.graphics.Color
|
||||
import androidx.lifecycle.LiveData
|
||||
import androidx.lifecycle.MutableLiveData
|
||||
import androidx.lifecycle.viewModelScope
|
||||
@@ -59,6 +60,7 @@ constructor(
|
||||
get() = isCsatCoroutineScopeCancelled
|
||||
|
||||
private var isAutoClickConsumed: Boolean = false
|
||||
private var statusBarColor: Int = Color.WHITE
|
||||
|
||||
private val _scratchCardResponse = SingleLiveEvent<GratificationStatus.Success>()
|
||||
val scratchCardResponse: LiveData<GratificationStatus.Success>
|
||||
@@ -210,4 +212,12 @@ constructor(
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fun setStatusBarColor(color: Int) {
|
||||
statusBarColor = color
|
||||
}
|
||||
|
||||
fun getStatusBarColor(): Int {
|
||||
return statusBarColor
|
||||
}
|
||||
}
|
||||
|
||||
@@ -37,9 +37,8 @@
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:clipToPadding="false"
|
||||
android:shadowColor="@color/shadowColorTwo"
|
||||
app:cardBackgroundColor="@color/white"
|
||||
app:cardElevation="@dimen/dp_6"
|
||||
app:cardElevation="@dimen/dp_0"
|
||||
app:layout_constraintBottom_toTopOf="@id/rvGoldItems"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
android:clipToPadding="false"
|
||||
android:shadowColor="@color/shadowColorTwo"
|
||||
app:cardBackgroundColor="@color/white"
|
||||
app:cardElevation="@dimen/dp_6"
|
||||
app:cardElevation="@dimen/dp_0"
|
||||
app:layout_constraintBottom_toTopOf="@id/rvGoldItems"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
|
||||
Reference in New Issue
Block a user