From 7110a4a77b8b98bc1a1368ada4b2ca9af5dd9f9b Mon Sep 17 00:00:00 2001 From: Rahul Patel Date: Thu, 11 Jul 2024 02:18:42 +0530 Subject: [PATCH] Improve viewbinding - [3/3] --- .../aurora/store/view/custom/RatingView.kt | 35 +++---- .../view/custom/layouts/ActionHeaderLayout.kt | 14 +-- .../view/custom/layouts/DevInfoLayout.kt | 21 ++--- .../view/custom/layouts/PermissionGroup.kt | 56 ++++------- .../custom/layouts/button/ActionButton.kt | 37 +++----- .../view/custom/layouts/button/StateButton.kt | 23 ++--- .../custom/layouts/button/UpdateButton.kt | 30 +++--- .../view/epoxy/groups/CarouselShimmerGroup.kt | 2 +- .../store/view/epoxy/views/AppProgressView.kt | 32 +------ .../store/view/epoxy/views/BaseModel.kt | 50 ++++++++++ .../aurora/store/view/epoxy/views/BaseView.kt | 85 ++++++++--------- .../store/view/epoxy/views/BlackListView.kt | 48 +++------- .../store/view/epoxy/views/CategoryView.kt | 39 ++------ .../store/view/epoxy/views/DispenserView.kt | 33 ++----- .../store/view/epoxy/views/DownloadView.kt | 58 ++++-------- .../store/view/epoxy/views/EditorHeadView.kt | 37 ++------ .../store/view/epoxy/views/EditorImageView.kt | 52 ++++------- .../store/view/epoxy/views/FavouriteView.kt | 32 ++----- .../store/view/epoxy/views/HeaderView.kt | 42 ++------- .../view/epoxy/views/HorizontalDividerView.kt | 34 ++----- .../view/epoxy/views/MinimalHeaderView.kt | 40 ++------ .../view/epoxy/views/SearchSuggestionView.kt | 42 +++------ .../view/epoxy/views/UpdateHeaderView.kt | 41 ++------ .../store/view/epoxy/views/app/AppListView.kt | 45 +++------ .../view/epoxy/views/app/AppUpdateView.kt | 93 ++++++++----------- .../store/view/epoxy/views/app/AppView.kt | 46 +++------ .../view/epoxy/views/app/NoAppAltView.kt | 36 ++----- .../store/view/epoxy/views/app/NoAppView.kt | 38 ++------ .../epoxy/views/details/AppDependentView.kt | 41 +++----- .../view/epoxy/views/details/BadgeView.kt | 42 +++------ .../view/epoxy/views/details/ExodusView.kt | 42 +++------ .../view/epoxy/views/details/FileView.kt | 38 ++------ .../view/epoxy/views/details/InfoView.kt | 40 +++----- .../views/details/LargeScreenshotView.kt | 35 ++----- .../epoxy/views/details/MiniScreenshotView.kt | 44 +++------ .../view/epoxy/views/details/MoreBadgeView.kt | 43 +++------ .../view/epoxy/views/details/ReviewView.kt | 50 +++------- .../epoxy/views/details/ScreenshotView.kt | 44 +++------ .../view/epoxy/views/preference/DashView.kt | 42 +++------ .../view/epoxy/views/preference/DeviceView.kt | 43 +++------ .../epoxy/views/preference/InstallerView.kt | 46 +++------ .../view/epoxy/views/preference/LinkView.kt | 48 +++------- .../view/epoxy/views/preference/LocaleView.kt | 42 +++------ .../epoxy/views/preference/PermissionView.kt | 47 +++------- .../epoxy/views/shimmer/AppListViewShimmer.kt | 35 ++----- .../epoxy/views/shimmer/AppViewShimmer.kt | 35 ++----- .../epoxy/views/shimmer/HeaderViewShimmer.kt | 35 ++----- .../store/view/ui/all/AppsGamesFragment.kt | 4 +- .../store/view/ui/commons/BaseFragment.kt | 1 + .../view/ui/commons/BlacklistFragment.kt | 4 +- .../view/ui/commons/CategoryBrowseFragment.kt | 4 +- .../ui/commons/EditorStreamBrowseFragment.kt | 4 +- .../commons/ExpandedStreamBrowseFragment.kt | 4 +- .../view/ui/commons/StreamBrowseFragment.kt | 4 +- .../view/ui/details/DetailsExodusFragment.kt | 6 +- .../store/view/ui/details/DevAppsFragment.kt | 23 +++-- .../store/view/ui/sale/AppSalesFragment.kt | 4 +- .../store/view/ui/sheets/BaseDialogSheet.kt | 1 + .../view/ui/sheets/PermissionBottomSheet.kt | 11 +-- .../store/view/ui/spoof/SpoofFragment.kt | 4 +- ...er.xml => fragment_generic_with_pager.xml} | 0 ....xml => fragment_generic_with_toolbar.xml} | 0 .../main/res/navigation/mobile_navigation.xml | 22 ++--- 63 files changed, 633 insertions(+), 1396 deletions(-) create mode 100644 app/src/main/java/com/aurora/store/view/epoxy/views/BaseModel.kt rename app/src/main/res/layout/{activity_generic_pager.xml => fragment_generic_with_pager.xml} (100%) rename app/src/main/res/layout/{activity_generic_recycler.xml => fragment_generic_with_toolbar.xml} (100%) diff --git a/app/src/main/java/com/aurora/store/view/custom/RatingView.kt b/app/src/main/java/com/aurora/store/view/custom/RatingView.kt index 85128c51e..deeb961ec 100644 --- a/app/src/main/java/com/aurora/store/view/custom/RatingView.kt +++ b/app/src/main/java/com/aurora/store/view/custom/RatingView.kt @@ -25,44 +25,31 @@ import android.widget.RelativeLayout import com.aurora.store.R import com.aurora.store.databinding.ViewRatingBinding -class RatingView : RelativeLayout { +class RatingView @JvmOverloads constructor( + context: Context?, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : RelativeLayout(context, attrs, defStyleAttr) { - private lateinit var B: ViewRatingBinding + private lateinit var binding: ViewRatingBinding var number = 0 var max = 0 var rating = 0 - constructor(context: Context, number: Int, max: Int, rating: Int) : super(context) { + constructor(context: Context, number: Int, max: Int, rating: Int) : this(context) { this.number = number this.max = max this.rating = rating init(context) } - constructor(context: Context?) : super(context) {} - constructor(context: Context?, attrs: AttributeSet?) : super(context, attrs) {} - constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int) : super( - context, - attrs, - defStyleAttr - ) { - } - - constructor( - context: Context?, - attrs: AttributeSet?, - defStyleAttr: Int, - defStyleRes: Int - ) : super(context, attrs, defStyleAttr, defStyleRes) { - } - private fun init(context: Context) { val view = inflate(context, R.layout.view_rating, this) - B = ViewRatingBinding.bind(view) + binding = ViewRatingBinding.bind(view) - B.avgNum.text = number.toString() - B.avgRating.max = max - B.avgRating.progress = rating + binding.avgNum.text = number.toString() + binding.avgRating.max = max + binding.avgRating.progress = rating } } diff --git a/app/src/main/java/com/aurora/store/view/custom/layouts/ActionHeaderLayout.kt b/app/src/main/java/com/aurora/store/view/custom/layouts/ActionHeaderLayout.kt index ca54b2ca6..76af65422 100644 --- a/app/src/main/java/com/aurora/store/view/custom/layouts/ActionHeaderLayout.kt +++ b/app/src/main/java/com/aurora/store/view/custom/layouts/ActionHeaderLayout.kt @@ -28,7 +28,7 @@ import com.aurora.store.databinding.ViewActionHeaderBinding class ActionHeaderLayout : RelativeLayout { - private lateinit var B: ViewActionHeaderBinding + private lateinit var binding: ViewActionHeaderBinding constructor(context: Context) : super(context) { init(context, null) @@ -48,22 +48,24 @@ class ActionHeaderLayout : RelativeLayout { private fun init(context: Context, attrs: AttributeSet?) { val view = inflate(context, R.layout.view_action_header, this) - B = ViewActionHeaderBinding.bind(view) + binding = ViewActionHeaderBinding.bind(view) val typedArray = context.obtainStyledAttributes(attrs, R.styleable.ActionHeaderLayout) val textPrimary = typedArray.getString(R.styleable.ActionHeaderLayout_headerTitle) + typedArray.recycle() + textPrimary?.let { - B.txtTitle.text = it + binding.txtTitle.text = it } } fun setHeader(header: String?) { - B.txtTitle.text = header + binding.txtTitle.text = header } fun addClickListener(onclickListener: OnClickListener?) { - B.imgAction.visibility = View.VISIBLE - B.imgAction.setOnClickListener(onclickListener) + binding.imgAction.visibility = View.VISIBLE + binding.imgAction.setOnClickListener(onclickListener) } } \ No newline at end of file diff --git a/app/src/main/java/com/aurora/store/view/custom/layouts/DevInfoLayout.kt b/app/src/main/java/com/aurora/store/view/custom/layouts/DevInfoLayout.kt index c37de2ca2..1c3c69124 100644 --- a/app/src/main/java/com/aurora/store/view/custom/layouts/DevInfoLayout.kt +++ b/app/src/main/java/com/aurora/store/view/custom/layouts/DevInfoLayout.kt @@ -27,7 +27,7 @@ import com.aurora.store.databinding.ViewDevInfoBinding class DevInfoLayout : RelativeLayout { - private lateinit var B: ViewDevInfoBinding + private lateinit var binding: ViewDevInfoBinding constructor(context: Context) : super(context) { init(context, null) @@ -45,18 +45,9 @@ class DevInfoLayout : RelativeLayout { init(context, attrs) } - constructor( - context: Context, - attrs: AttributeSet?, - defStyleAttr: Int, - defStyleRes: Int - ) : super(context, attrs, defStyleAttr, defStyleRes) { - init(context, attrs) - } - private fun init(context: Context, attrs: AttributeSet?) { val view = inflate(context, R.layout.view_dev_info, this) - B = ViewDevInfoBinding.bind(view) + binding = ViewDevInfoBinding.bind(view) val typedArray = context.obtainStyledAttributes(attrs, R.styleable.DevInfoLayout) val icon = typedArray.getResourceId( @@ -67,14 +58,14 @@ class DevInfoLayout : RelativeLayout { val textPrimary = typedArray.getString(R.styleable.DevInfoLayout_txtTitle) val textSecondary = typedArray.getString(R.styleable.DevInfoLayout_txtSubtitle) - B.img.setImageResource(icon) - B.txtTitle.text = textPrimary - B.txtSubtitle.text = textSecondary + binding.img.setImageResource(icon) + binding.txtTitle.text = textPrimary + binding.txtSubtitle.text = textSecondary typedArray.recycle() } fun setTxtSubtitle(text: String?) { - B.txtSubtitle.text = text + binding.txtSubtitle.text = text invalidate() } } diff --git a/app/src/main/java/com/aurora/store/view/custom/layouts/PermissionGroup.kt b/app/src/main/java/com/aurora/store/view/custom/layouts/PermissionGroup.kt index dafec6527..076cc682b 100644 --- a/app/src/main/java/com/aurora/store/view/custom/layouts/PermissionGroup.kt +++ b/app/src/main/java/com/aurora/store/view/custom/layouts/PermissionGroup.kt @@ -33,48 +33,32 @@ import com.aurora.store.R import com.aurora.store.data.model.PermissionGroupInfo import java.util.Locale -class PermissionGroup : LinearLayout { +class PermissionGroup @JvmOverloads constructor( + context: Context?, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : LinearLayout(context, attrs, defStyleAttr) { private lateinit var permissionGroupInfo: PermissionGroupInfo private lateinit var packageManager: PackageManager private val permissionMap: MutableMap = HashMap() - constructor(context: Context?) : super(context) { - init() - } + constructor(context: Context?, permissionGroupInfo: PermissionGroupInfo) : this(context) { + if (context != null) { + inflate(context, R.layout.layout_permission, this) - constructor(context: Context?, attrs: AttributeSet?) : super(context, attrs) { - init() - } + layoutParams = LayoutParams( + LayoutParams.WRAP_CONTENT, + LayoutParams.WRAP_CONTENT + ) - constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int) : super( - context, - attrs, - defStyleAttr - ) { - init() - } + this.packageManager = context.packageManager + this.permissionGroupInfo = permissionGroupInfo - constructor( - context: Context?, - attrs: AttributeSet?, - defStyleAttr: Int, - defStyleRes: Int - ) : super(context, attrs, defStyleAttr, defStyleRes) { - init() - } - - private fun init() { - inflate(context, R.layout.layout_permission, this) - packageManager = context.packageManager - } - - fun setPermissionGroupInfo(permissionGroupInfo: PermissionGroupInfo) { - this.permissionGroupInfo = permissionGroupInfo - val imageView = findViewById(R.id.img) - imageView.setImageDrawable(getPermissionGroupIcon(permissionGroupInfo)) - //imageView.setColorFilter(getContext().getStyledAttributeColor(imageView.getContext(), android.R.attr.colorAccent)); + val imageView = findViewById(R.id.img) + imageView.setImageDrawable(getPermissionGroupIcon(permissionGroupInfo)) + } } fun addPermission(permissionInfo: PermissionInfo, currentPerms: List = emptyList()) { @@ -166,11 +150,7 @@ class PermissionGroup : LinearLayout { } return label.replaceFirstChar { - if (it.isLowerCase()) { - it.titlecase(Locale.getDefault()) - } else { - it.toString() - } + it.titlecase(Locale.getDefault()) } } } diff --git a/app/src/main/java/com/aurora/store/view/custom/layouts/button/ActionButton.kt b/app/src/main/java/com/aurora/store/view/custom/layouts/button/ActionButton.kt index 90e423a9a..f00394091 100644 --- a/app/src/main/java/com/aurora/store/view/custom/layouts/button/ActionButton.kt +++ b/app/src/main/java/com/aurora/store/view/custom/layouts/button/ActionButton.kt @@ -32,7 +32,7 @@ import com.aurora.store.databinding.ViewActionButtonBinding class ActionButton : RelativeLayout { - private lateinit var B: ViewActionButtonBinding + private lateinit var binding: ViewActionButtonBinding constructor(context: Context) : super(context) { init(context, null) @@ -50,18 +50,9 @@ class ActionButton : RelativeLayout { init(context, attrs) } - constructor( - context: Context, - attrs: AttributeSet?, - defStyleAttr: Int, - defStyleRes: Int - ) : super(context, attrs, defStyleAttr, defStyleRes) { - init(context, attrs) - } - private fun init(context: Context, attrs: AttributeSet?) { val view = inflate(context, R.layout.view_action_button, this) - B = ViewActionButtonBinding.bind(view) + binding = ViewActionButtonBinding.bind(view) val typedArray = context.obtainStyledAttributes(attrs, R.styleable.ActionButton) val btnTxt = typedArray.getString(R.styleable.ActionButton_btnActionText) @@ -87,27 +78,27 @@ class ActionButton : RelativeLayout { } stateBackground?.let { - B.root.background = ContextCompat.getDrawable(context, it) + binding.root.background = ContextCompat.getDrawable(context, it) } val stateColor = ContextCompat.getColor(context, btnTxtColor) - B.btn.text = btnTxt - B.btn.setTextColor(stateColor) - B.img.setImageDrawable(ContextCompat.getDrawable(context, stateIcon)) - B.img.imageTintList = ColorStateList.valueOf(stateColor) + binding.btn.text = btnTxt + binding.btn.setTextColor(stateColor) + binding.img.setImageDrawable(ContextCompat.getDrawable(context, stateIcon)) + binding.img.imageTintList = ColorStateList.valueOf(stateColor) typedArray.recycle() } fun setText(text: String) { - B.viewFlipper.displayedChild = 0 - B.btn.text = text + binding.viewFlipper.displayedChild = 0 + binding.btn.text = text } fun setText(text: Int) { - B.viewFlipper.displayedChild = 0 - B.btn.text = getString(text) + binding.viewFlipper.displayedChild = 0 + binding.btn.text = getString(text) } fun updateState(state: State) { @@ -118,15 +109,15 @@ class ActionButton : RelativeLayout { else -> 0 } - if (B.viewFlipper.displayedChild != displayChild) { + if (binding.viewFlipper.displayedChild != displayChild) { runOnUiThread { - B.viewFlipper.displayedChild = displayChild + binding.viewFlipper.displayedChild = displayChild if (displayChild == 2) updateState(State.IDLE) } } } fun addOnClickListener(onClickListener: OnClickListener?) { - B.btn.setOnClickListener(onClickListener) + binding.btn.setOnClickListener(onClickListener) } } diff --git a/app/src/main/java/com/aurora/store/view/custom/layouts/button/StateButton.kt b/app/src/main/java/com/aurora/store/view/custom/layouts/button/StateButton.kt index cf8c28128..ac9e1060b 100644 --- a/app/src/main/java/com/aurora/store/view/custom/layouts/button/StateButton.kt +++ b/app/src/main/java/com/aurora/store/view/custom/layouts/button/StateButton.kt @@ -29,7 +29,7 @@ import com.aurora.store.databinding.ViewStateButtonBinding class StateButton : RelativeLayout { - private lateinit var B: ViewStateButtonBinding + private lateinit var binding: ViewStateButtonBinding constructor(context: Context) : super(context) { init(context, null) @@ -47,18 +47,9 @@ class StateButton : RelativeLayout { init(context, attrs) } - constructor( - context: Context, - attrs: AttributeSet?, - defStyleAttr: Int, - defStyleRes: Int - ) : super(context, attrs, defStyleAttr, defStyleRes) { - init(context, attrs) - } - private fun init(context: Context, attrs: AttributeSet?) { val view = inflate(context, R.layout.view_state_button, this) - B = ViewStateButtonBinding.bind(view) + binding = ViewStateButtonBinding.bind(view) val typedArray = context.obtainStyledAttributes(attrs, R.styleable.StateButton) val btnTxt = typedArray.getString(R.styleable.StateButton_btnStateText) @@ -67,20 +58,20 @@ class StateButton : RelativeLayout { R.drawable.ic_arrow_right ) - B.btn.text = btnTxt - B.btn.icon = ContextCompat.getDrawable(context, btnIcon) + binding.btn.text = btnTxt + binding.btn.icon = ContextCompat.getDrawable(context, btnIcon) typedArray.recycle() } fun updateProgress(isVisible: Boolean) { if (isVisible) - B.progress.visibility = View.VISIBLE + binding.progress.visibility = View.VISIBLE else - B.progress.visibility = View.INVISIBLE + binding.progress.visibility = View.INVISIBLE } fun addOnClickListener(onClickListener: OnClickListener) { - B.btn.setOnClickListener(onClickListener) + binding.btn.setOnClickListener(onClickListener) } } diff --git a/app/src/main/java/com/aurora/store/view/custom/layouts/button/UpdateButton.kt b/app/src/main/java/com/aurora/store/view/custom/layouts/button/UpdateButton.kt index f8261d32a..49ba8a8fe 100644 --- a/app/src/main/java/com/aurora/store/view/custom/layouts/button/UpdateButton.kt +++ b/app/src/main/java/com/aurora/store/view/custom/layouts/button/UpdateButton.kt @@ -30,7 +30,7 @@ import com.aurora.store.databinding.ViewUpdateButtonBinding class UpdateButton : RelativeLayout { - private lateinit var B: ViewUpdateButtonBinding + private lateinit var binding: ViewUpdateButtonBinding constructor(context: Context) : super(context) { init(context) @@ -48,49 +48,41 @@ class UpdateButton : RelativeLayout { init(context) } - constructor( - context: Context, - attrs: AttributeSet?, - defStyleAttr: Int, - defStyleRes: Int - ) : super(context, attrs, defStyleAttr, defStyleRes) { - init(context) - } - private fun init(context: Context) { val view = inflate(context, R.layout.view_update_button, this) - B = ViewUpdateButtonBinding.bind(view) + binding = ViewUpdateButtonBinding.bind(view) } fun setText(text: String) { - B.viewFlipper.displayedChild = 0 - B.btnPositive.text = text + binding.viewFlipper.displayedChild = 0 + binding.btnPositive.text = text } fun setText(text: Int) { - B.viewFlipper.displayedChild = 0 - B.btnPositive.text = getString(text) + binding.viewFlipper.displayedChild = 0 + binding.btnPositive.text = getString(text) } fun updateState(downloadStatus: DownloadStatus) { val displayChild = when (downloadStatus) { DownloadStatus.QUEUED, DownloadStatus.DOWNLOADING -> 2 + else -> 0 } - if (B.viewFlipper.displayedChild != displayChild) { + if (binding.viewFlipper.displayedChild != displayChild) { runOnUiThread { - B.viewFlipper.displayedChild = displayChild + binding.viewFlipper.displayedChild = displayChild } } } fun addPositiveOnClickListener(onClickListener: OnClickListener?) { - B.btnPositive.setOnClickListener(onClickListener) + binding.btnPositive.setOnClickListener(onClickListener) } fun addNegativeOnClickListener(onClickListener: OnClickListener?) { - B.btnNegative.setOnClickListener(onClickListener) + binding.btnNegative.setOnClickListener(onClickListener) } } diff --git a/app/src/main/java/com/aurora/store/view/epoxy/groups/CarouselShimmerGroup.kt b/app/src/main/java/com/aurora/store/view/epoxy/groups/CarouselShimmerGroup.kt index 18cacc2cf..9eb743385 100644 --- a/app/src/main/java/com/aurora/store/view/epoxy/groups/CarouselShimmerGroup.kt +++ b/app/src/main/java/com/aurora/store/view/epoxy/groups/CarouselShimmerGroup.kt @@ -26,7 +26,7 @@ import com.aurora.store.view.epoxy.views.shimmer.AppViewShimmerModel_ import com.aurora.store.view.epoxy.views.shimmer.HeaderViewShimmerModel_ import java.util.UUID -class CarouselShimmerGroup() : +class CarouselShimmerGroup : EpoxyModelGroup( R.layout.model_carousel_group, buildModels() ) { diff --git a/app/src/main/java/com/aurora/store/view/epoxy/views/AppProgressView.kt b/app/src/main/java/com/aurora/store/view/epoxy/views/AppProgressView.kt index 9f54bee11..841fe7565 100644 --- a/app/src/main/java/com/aurora/store/view/epoxy/views/AppProgressView.kt +++ b/app/src/main/java/com/aurora/store/view/epoxy/views/AppProgressView.kt @@ -21,34 +21,12 @@ package com.aurora.store.view.epoxy.views import android.content.Context import android.util.AttributeSet -import android.widget.RelativeLayout import com.airbnb.epoxy.ModelView -import com.aurora.store.R import com.aurora.store.databinding.ViewAppProgressBinding @ModelView(autoLayout = ModelView.Size.WRAP_WIDTH_WRAP_HEIGHT) -class AppProgressView : RelativeLayout { - - private lateinit var B: ViewAppProgressBinding - - constructor(context: Context?) : super(context) { - init(context) - } - - constructor(context: Context?, attrs: AttributeSet?) : super(context, attrs) { - init(context) - } - - constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int) : super( - context, - attrs, - defStyleAttr - ) { - init(context) - } - - private fun init(context: Context?) { - val view = inflate(context, R.layout.view_app_progress, this) - B = ViewAppProgressBinding.bind(view) - } -} +class AppProgressView @JvmOverloads constructor( + context: Context?, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : BaseView(context, attrs, defStyleAttr) \ No newline at end of file diff --git a/app/src/main/java/com/aurora/store/view/epoxy/views/BaseModel.kt b/app/src/main/java/com/aurora/store/view/epoxy/views/BaseModel.kt new file mode 100644 index 000000000..919aedd03 --- /dev/null +++ b/app/src/main/java/com/aurora/store/view/epoxy/views/BaseModel.kt @@ -0,0 +1,50 @@ +/* + * Aurora Store + * Copyright (C) 2021, Rahul Kumar Patel + * + * Aurora Store is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * Aurora Store is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Aurora Store. If not, see . + * + */ + +package com.aurora.store.view.epoxy.views + +import android.view.View +import android.view.animation.AnimationUtils +import com.airbnb.epoxy.EpoxyModel +import com.aurora.store.view.epoxy.views.app.AppListView + +abstract class BaseModel : EpoxyModel() { + + override fun bind(view: T) { + super.bind(view) + when (view) { + is AppListView -> { + view.startAnimation( + AnimationUtils.loadAnimation( + view.context, + android.R.anim.fade_in + ) + ) + } + } + } + + override fun unbind(view: T) { + when (view) { + is AppListView -> { + view.clearAnimation() + } + } + } +} diff --git a/app/src/main/java/com/aurora/store/view/epoxy/views/BaseView.kt b/app/src/main/java/com/aurora/store/view/epoxy/views/BaseView.kt index 7befd3cf8..3fc5573e1 100644 --- a/app/src/main/java/com/aurora/store/view/epoxy/views/BaseView.kt +++ b/app/src/main/java/com/aurora/store/view/epoxy/views/BaseView.kt @@ -1,50 +1,51 @@ -/* - * Aurora Store - * Copyright (C) 2021, Rahul Kumar Patel - * - * Aurora Store is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 2 of the License, or - * (at your option) any later version. - * - * Aurora Store is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Aurora Store. If not, see . - * - */ - package com.aurora.store.view.epoxy.views -import android.view.View -import android.view.animation.AnimationUtils -import com.airbnb.epoxy.EpoxyModel -import com.aurora.store.view.epoxy.views.app.AppListView +import android.content.Context +import android.util.AttributeSet +import android.view.LayoutInflater +import android.view.ViewGroup +import android.widget.RelativeLayout +import androidx.viewbinding.ViewBinding +import java.lang.reflect.ParameterizedType -abstract class BaseView : EpoxyModel() { +abstract class BaseView : RelativeLayout { - override fun bind(view: T) { - super.bind(view) - when (view) { - is AppListView -> { - view.startAnimation( - AnimationUtils.loadAnimation( - view.context, - android.R.anim.fade_in - ) - ) - } + private lateinit var _binding: ViewBindingType + protected val binding get() = _binding + + constructor(context: Context?) : super(context) { + init(context) + } + + constructor(context: Context?, attrs: AttributeSet?) : super(context, attrs) { + init(context) + } + + constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int) : super( + context, + attrs, + defStyleAttr + ) { + init(context) + } + + private fun init(context: Context?) { + if (context != null) { + _binding = inflateViewBinding(LayoutInflater.from(context)) + addView(_binding.root) } } - override fun unbind(view: T) { - when (view) { - is AppListView -> { - view.clearAnimation() - } - } + @Suppress("UNCHECKED_CAST") + private fun inflateViewBinding(inflater: LayoutInflater): ViewBindingType { + val type = + (javaClass.genericSuperclass as ParameterizedType).actualTypeArguments[0] as Class + val method = type.getMethod( + "inflate", + LayoutInflater::class.java, + ViewGroup::class.java, + Boolean::class.java + ) + return method.invoke(null, inflater, this, false) as ViewBindingType } -} +} \ No newline at end of file diff --git a/app/src/main/java/com/aurora/store/view/epoxy/views/BlackListView.kt b/app/src/main/java/com/aurora/store/view/epoxy/views/BlackListView.kt index 69d6d46d2..9cdaa8e7b 100644 --- a/app/src/main/java/com/aurora/store/view/epoxy/views/BlackListView.kt +++ b/app/src/main/java/com/aurora/store/view/epoxy/views/BlackListView.kt @@ -22,7 +22,6 @@ package com.aurora.store.view.epoxy.views import android.content.Context import android.util.AttributeSet import android.widget.CompoundButton -import android.widget.RelativeLayout import coil.load import coil.transform.RoundedCornersTransformation import com.airbnb.epoxy.CallbackProp @@ -34,62 +33,43 @@ import com.aurora.store.databinding.ViewBlackBinding @ModelView( autoLayout = ModelView.Size.MATCH_WIDTH_WRAP_HEIGHT, - baseModelClass = BaseView::class + baseModelClass = BaseModel::class ) -class BlackListView : RelativeLayout { - - private lateinit var B: ViewBlackBinding - - constructor(context: Context?) : super(context) { - init(context) - } - - constructor(context: Context?, attrs: AttributeSet?) : super(context, attrs) { - init(context) - } - - constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int) : super( - context, - attrs, - defStyleAttr - ) { - init(context) - } - - private fun init(context: Context?) { - val view = inflate(context, R.layout.view_black, this) - B = ViewBlackBinding.bind(view) - } +class BlackListView @JvmOverloads constructor( + context: Context?, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : BaseView(context, attrs, defStyleAttr) { @ModelProp fun app(app: App) { - B.imgIcon.load(app.iconArtwork.url) { + binding.imgIcon.load(app.iconArtwork.url) { placeholder(R.drawable.bg_placeholder) transformations(RoundedCornersTransformation(25F)) } - B.txtLine1.text = app.displayName - B.txtLine2.text = app.packageName - B.txtLine3.text = ("${app.versionName}.${app.versionCode}") + binding.txtLine1.text = app.displayName + binding.txtLine2.text = app.packageName + binding.txtLine3.text = ("${app.versionName}.${app.versionCode}") } @ModelProp fun markChecked(isChecked: Boolean) { - B.checkbox.isChecked = isChecked + binding.checkbox.isChecked = isChecked } @CallbackProp fun checked(onCheckedChangeListener: CompoundButton.OnCheckedChangeListener?) { - B.checkbox.setOnCheckedChangeListener(onCheckedChangeListener) + binding.checkbox.setOnCheckedChangeListener(onCheckedChangeListener) } @CallbackProp fun click(onClickListener: OnClickListener?) { - B.root.setOnClickListener(onClickListener) + binding.root.setOnClickListener(onClickListener) } @CallbackProp fun longClick(onClickListener: OnLongClickListener?) { - B.root.setOnLongClickListener(onClickListener) + binding.root.setOnLongClickListener(onClickListener) } } diff --git a/app/src/main/java/com/aurora/store/view/epoxy/views/CategoryView.kt b/app/src/main/java/com/aurora/store/view/epoxy/views/CategoryView.kt index 48795604b..950e07701 100644 --- a/app/src/main/java/com/aurora/store/view/epoxy/views/CategoryView.kt +++ b/app/src/main/java/com/aurora/store/view/epoxy/views/CategoryView.kt @@ -21,52 +21,31 @@ package com.aurora.store.view.epoxy.views import android.content.Context import android.util.AttributeSet -import android.widget.RelativeLayout import coil.load import com.airbnb.epoxy.CallbackProp import com.airbnb.epoxy.ModelProp import com.airbnb.epoxy.ModelView import com.aurora.gplayapi.data.models.Category -import com.aurora.store.R import com.aurora.store.databinding.ViewCategoryBinding @ModelView( autoLayout = ModelView.Size.MATCH_WIDTH_WRAP_HEIGHT, - baseModelClass = BaseView::class + baseModelClass = BaseModel::class ) -class CategoryView : RelativeLayout { - - private lateinit var B: ViewCategoryBinding - - constructor(context: Context?) : super(context) { - init(context) - } - - constructor(context: Context?, attrs: AttributeSet?) : super(context, attrs) { - init(context) - } - - constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int) : super( - context, - attrs, - defStyleAttr - ) { - init(context) - } - - private fun init(context: Context?) { - val view = inflate(context, R.layout.view_category, this) - B = ViewCategoryBinding.bind(view) - } +class CategoryView @JvmOverloads constructor( + context: Context?, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : BaseView(context, attrs, defStyleAttr) { @ModelProp fun category(category: Category) { - B.txtName.text = category.title - B.imgBackground.load(category.imageUrl) + binding.txtName.text = category.title + binding.imgBackground.load(category.imageUrl) } @CallbackProp fun click(onClickListener: OnClickListener?) { - B.root.setOnClickListener(onClickListener) + binding.root.setOnClickListener(onClickListener) } } diff --git a/app/src/main/java/com/aurora/store/view/epoxy/views/DispenserView.kt b/app/src/main/java/com/aurora/store/view/epoxy/views/DispenserView.kt index dd6023503..a0735ad69 100644 --- a/app/src/main/java/com/aurora/store/view/epoxy/views/DispenserView.kt +++ b/app/src/main/java/com/aurora/store/view/epoxy/views/DispenserView.kt @@ -2,41 +2,20 @@ package com.aurora.store.view.epoxy.views import android.content.Context import android.util.AttributeSet -import android.widget.RelativeLayout import com.airbnb.epoxy.CallbackProp import com.airbnb.epoxy.ModelProp import com.airbnb.epoxy.ModelView -import com.aurora.store.R import com.aurora.store.databinding.ViewDispenserBinding @ModelView( autoLayout = ModelView.Size.MATCH_WIDTH_WRAP_HEIGHT, - baseModelClass = BaseView::class + baseModelClass = BaseModel::class ) -class DispenserView : RelativeLayout { - - private lateinit var binding: ViewDispenserBinding - - constructor(context: Context?) : super(context) { - init(context) - } - - constructor(context: Context?, attrs: AttributeSet?) : super(context, attrs) { - init(context) - } - - constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int) : super( - context, - attrs, - defStyleAttr - ) { - init(context) - } - - private fun init(context: Context?) { - val view = inflate(context, R.layout.view_dispenser, this) - binding = ViewDispenserBinding.bind(view) - } +class DispenserView @JvmOverloads constructor( + context: Context?, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : BaseView(context, attrs, defStyleAttr) { @ModelProp fun url(url: String) { diff --git a/app/src/main/java/com/aurora/store/view/epoxy/views/DownloadView.kt b/app/src/main/java/com/aurora/store/view/epoxy/views/DownloadView.kt index b4c284bd8..ab5509985 100644 --- a/app/src/main/java/com/aurora/store/view/epoxy/views/DownloadView.kt +++ b/app/src/main/java/com/aurora/store/view/epoxy/views/DownloadView.kt @@ -21,7 +21,6 @@ package com.aurora.store.view.epoxy.views import android.content.Context import android.util.AttributeSet -import android.widget.RelativeLayout import coil.load import coil.transform.RoundedCornersTransformation import com.airbnb.epoxy.CallbackProp @@ -37,42 +36,23 @@ import java.util.Locale @ModelView( autoLayout = ModelView.Size.MATCH_WIDTH_WRAP_HEIGHT, - baseModelClass = BaseView::class + baseModelClass = BaseModel::class ) -class DownloadView : RelativeLayout { - - private lateinit var B: ViewDownloadBinding - - constructor(context: Context?) : super(context) { - init(context) - } - - constructor(context: Context?, attrs: AttributeSet?) : super(context, attrs) { - init(context) - } - - constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int) : super( - context, - attrs, - defStyleAttr - ) { - init(context) - } - - private fun init(context: Context?) { - val view = inflate(context, R.layout.view_download, this) - B = ViewDownloadBinding.bind(view) - } +class DownloadView @JvmOverloads constructor( + context: Context?, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : BaseView(context, attrs, defStyleAttr) { @ModelProp fun download(download: Download) { - B.imgDownload.load(download.iconURL) { + binding.imgDownload.load(download.iconURL) { placeholder(R.drawable.bg_placeholder) transformations(RoundedCornersTransformation(32F)) } - B.txtTitle.text = download.displayName + binding.txtTitle.text = download.displayName - B.txtStatus.text = download.downloadStatus.name + binding.txtStatus.text = download.downloadStatus.name .lowercase(Locale.getDefault()) .replaceFirstChar { if (it.isLowerCase()) { @@ -82,38 +62,38 @@ class DownloadView : RelativeLayout { } } - B.progressDownload.apply { + binding.progressDownload.apply { progress = download.progress isIndeterminate = download.progress <= 0 && !download.isFinished } - B.txtProgress.text = ("${download.progress}%") + binding.txtProgress.text = ("${download.progress}%") - B.txtEta.text = getETAString(context, download.timeRemaining) - B.txtSpeed.text = getDownloadSpeedString( + binding.txtEta.text = getETAString(context, download.timeRemaining) + binding.txtSpeed.text = getDownloadSpeedString( context, download.speed ) when (download.downloadStatus) { DownloadStatus.DOWNLOADING, DownloadStatus.QUEUED -> { - B.txtSpeed.visibility = VISIBLE - B.txtEta.visibility = VISIBLE + binding.txtSpeed.visibility = VISIBLE + binding.txtEta.visibility = VISIBLE } else -> { - B.txtSpeed.visibility = INVISIBLE - B.txtEta.visibility = INVISIBLE + binding.txtSpeed.visibility = INVISIBLE + binding.txtEta.visibility = INVISIBLE } } } @CallbackProp fun click(onClickListener: OnClickListener?) { - B.root.setOnClickListener(onClickListener) + binding.root.setOnClickListener(onClickListener) } @CallbackProp fun longClick(onClickListener: OnLongClickListener?) { - B.root.setOnLongClickListener(onClickListener) + binding.root.setOnLongClickListener(onClickListener) } } diff --git a/app/src/main/java/com/aurora/store/view/epoxy/views/EditorHeadView.kt b/app/src/main/java/com/aurora/store/view/epoxy/views/EditorHeadView.kt index 6be12f34a..f8ebf8ba9 100644 --- a/app/src/main/java/com/aurora/store/view/epoxy/views/EditorHeadView.kt +++ b/app/src/main/java/com/aurora/store/view/epoxy/views/EditorHeadView.kt @@ -21,49 +21,28 @@ package com.aurora.store.view.epoxy.views import android.content.Context import android.util.AttributeSet -import android.widget.RelativeLayout import com.airbnb.epoxy.CallbackProp import com.airbnb.epoxy.ModelProp import com.airbnb.epoxy.ModelView -import com.aurora.store.R import com.aurora.store.databinding.ViewEditorHeadBinding @ModelView( autoLayout = ModelView.Size.MATCH_WIDTH_WRAP_HEIGHT, - baseModelClass = BaseView::class + baseModelClass = BaseModel::class ) -class EditorHeadView : RelativeLayout { - - private lateinit var B: ViewEditorHeadBinding - - constructor(context: Context?) : super(context) { - init(context) - } - - constructor(context: Context?, attrs: AttributeSet?) : super(context, attrs) { - init(context) - } - - constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int) : super( - context, - attrs, - defStyleAttr - ) { - init(context) - } - - private fun init(context: Context?) { - val view = inflate(context, R.layout.view_editor_head, this) - B = ViewEditorHeadBinding.bind(view) - } +class EditorHeadView @JvmOverloads constructor( + context: Context?, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : BaseView(context, attrs, defStyleAttr) { @CallbackProp fun click(onClickListener: OnClickListener?) { - B.root.setOnClickListener(onClickListener) + binding.root.setOnClickListener(onClickListener) } @ModelProp fun title(title: String) { - B.title.text = title + binding.title.text = title } } diff --git a/app/src/main/java/com/aurora/store/view/epoxy/views/EditorImageView.kt b/app/src/main/java/com/aurora/store/view/epoxy/views/EditorImageView.kt index de4163883..7c607f6bd 100644 --- a/app/src/main/java/com/aurora/store/view/epoxy/views/EditorImageView.kt +++ b/app/src/main/java/com/aurora/store/view/epoxy/views/EditorImageView.kt @@ -21,7 +21,6 @@ package com.aurora.store.view.epoxy.views import android.content.Context import android.util.AttributeSet -import android.widget.RelativeLayout import coil.load import coil.transform.RoundedCornersTransformation import com.airbnb.epoxy.CallbackProp @@ -29,55 +28,36 @@ import com.airbnb.epoxy.ModelProp import com.airbnb.epoxy.ModelView import com.aurora.extensions.px import com.aurora.gplayapi.data.models.Artwork -import com.aurora.store.R import com.aurora.store.databinding.ViewEditorImageBinding @ModelView( autoLayout = ModelView.Size.WRAP_WIDTH_WRAP_HEIGHT, - baseModelClass = BaseView::class + baseModelClass = BaseModel::class ) -class EditorImageView : RelativeLayout { - - private lateinit var B: ViewEditorImageBinding - - constructor(context: Context?) : super(context) { - init(context) - } - - constructor(context: Context?, attrs: AttributeSet?) : super(context, attrs) { - init(context) - } - - constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int) : super( - context, - attrs, - defStyleAttr - ) { - init(context) - } - - private fun init(context: Context?) { - val view = inflate(context, R.layout.view_editor_image, this) - B = ViewEditorImageBinding.bind(view) - } +class EditorImageView @JvmOverloads constructor( + context: Context?, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : BaseView(context, attrs, defStyleAttr) { @ModelProp fun artwork(artwork: Artwork) { when (artwork.type) { 14 -> { - B.img.layoutParams.height = 108.px.toInt() - B.img.layoutParams.width = 192.px.toInt() - B.img.requestLayout() + binding.img.layoutParams.height = 108.px.toInt() + binding.img.layoutParams.width = 192.px.toInt() + binding.img.requestLayout() - B.img.load(artwork.url) { + binding.img.load(artwork.url) { transformations(RoundedCornersTransformation(8.px.toFloat())) } } + else -> { - B.img.layoutParams.width = 24.px.toInt() - B.img.layoutParams.height = 24.px.toInt() - B.img.requestLayout() - B.img.load(artwork.url) { + binding.img.layoutParams.width = 24.px.toInt() + binding.img.layoutParams.height = 24.px.toInt() + binding.img.requestLayout() + binding.img.load(artwork.url) { transformations(RoundedCornersTransformation(4.px.toFloat())) } } @@ -86,6 +66,6 @@ class EditorImageView : RelativeLayout { @CallbackProp fun click(onClickListener: OnClickListener?) { - B.root.setOnClickListener(onClickListener) + binding.root.setOnClickListener(onClickListener) } } diff --git a/app/src/main/java/com/aurora/store/view/epoxy/views/FavouriteView.kt b/app/src/main/java/com/aurora/store/view/epoxy/views/FavouriteView.kt index acccd1c4c..8ceae0f42 100644 --- a/app/src/main/java/com/aurora/store/view/epoxy/views/FavouriteView.kt +++ b/app/src/main/java/com/aurora/store/view/epoxy/views/FavouriteView.kt @@ -21,7 +21,6 @@ package com.aurora.store.view.epoxy.views import android.content.Context import android.util.AttributeSet -import android.widget.RelativeLayout import coil.load import coil.transform.RoundedCornersTransformation import com.airbnb.epoxy.CallbackProp @@ -33,32 +32,13 @@ import com.aurora.store.databinding.ViewFavBinding @ModelView( autoLayout = ModelView.Size.MATCH_WIDTH_WRAP_HEIGHT, - baseModelClass = BaseView::class + baseModelClass = BaseModel::class ) -class FavouriteView : RelativeLayout { - - private lateinit var binding: ViewFavBinding - - constructor(context: Context?) : super(context) { - init(context) - } - - constructor(context: Context?, attrs: AttributeSet?) : super(context, attrs) { - init(context) - } - - constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int) : super( - context, - attrs, - defStyleAttr - ) { - init(context) - } - - private fun init(context: Context?) { - val view = inflate(context, R.layout.view_fav, this) - binding = ViewFavBinding.bind(view) - } +class FavouriteView @JvmOverloads constructor( + context: Context?, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : BaseView(context, attrs, defStyleAttr) { @ModelProp fun favourite(favourite: Favourite) { diff --git a/app/src/main/java/com/aurora/store/view/epoxy/views/HeaderView.kt b/app/src/main/java/com/aurora/store/view/epoxy/views/HeaderView.kt index 8475e2c7f..aa5d23bc4 100644 --- a/app/src/main/java/com/aurora/store/view/epoxy/views/HeaderView.kt +++ b/app/src/main/java/com/aurora/store/view/epoxy/views/HeaderView.kt @@ -21,63 +21,41 @@ package com.aurora.store.view.epoxy.views import android.content.Context import android.util.AttributeSet -import android.widget.RelativeLayout import com.airbnb.epoxy.CallbackProp import com.airbnb.epoxy.ModelProp import com.airbnb.epoxy.ModelView import com.airbnb.epoxy.OnViewRecycled -import com.aurora.store.R import com.aurora.store.databinding.ViewHeaderBinding - @ModelView( autoLayout = ModelView.Size.MATCH_WIDTH_WRAP_HEIGHT, - baseModelClass = BaseView::class + baseModelClass = BaseModel::class ) -class HeaderView : RelativeLayout { - - private lateinit var B: ViewHeaderBinding - - constructor(context: Context?) : super(context) { - init(context) - } - - constructor(context: Context?, attrs: AttributeSet?) : super(context, attrs) { - init(context) - } - - constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int) : super( - context, - attrs, - defStyleAttr - ) { - init(context) - } - - private fun init(context: Context?) { - val view = inflate(context, R.layout.view_header, this) - B = ViewHeaderBinding.bind(view) - } +class HeaderView @JvmOverloads constructor( + context: Context?, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : BaseView(context, attrs, defStyleAttr) { @ModelProp fun title(title: String) { - B.txtTitle.text = title + binding.txtTitle.text = title } @JvmOverloads @ModelProp fun browseUrl(browseUrl: String? = String()) { if (browseUrl.isNullOrEmpty()) - B.imgAction.visibility = INVISIBLE + binding.imgAction.visibility = INVISIBLE } @CallbackProp fun click(onClickListener: OnClickListener?) { - B.root.setOnClickListener(onClickListener) + binding.root.setOnClickListener(onClickListener) } @OnViewRecycled fun clear() { - B.imgAction.visibility = VISIBLE + binding.imgAction.visibility = VISIBLE } } diff --git a/app/src/main/java/com/aurora/store/view/epoxy/views/HorizontalDividerView.kt b/app/src/main/java/com/aurora/store/view/epoxy/views/HorizontalDividerView.kt index db47faa08..b7bda8a87 100644 --- a/app/src/main/java/com/aurora/store/view/epoxy/views/HorizontalDividerView.kt +++ b/app/src/main/java/com/aurora/store/view/epoxy/views/HorizontalDividerView.kt @@ -21,37 +21,15 @@ package com.aurora.store.view.epoxy.views import android.content.Context import android.util.AttributeSet -import android.widget.RelativeLayout import com.airbnb.epoxy.ModelView -import com.aurora.store.R import com.aurora.store.databinding.ViewDividerBinding @ModelView( autoLayout = ModelView.Size.MATCH_WIDTH_WRAP_HEIGHT, - baseModelClass = BaseView::class + baseModelClass = BaseModel::class ) -class HorizontalDividerView : RelativeLayout { - - private lateinit var B: ViewDividerBinding - - constructor(context: Context?) : super(context) { - init(context) - } - - constructor(context: Context?, attrs: AttributeSet?) : super(context, attrs) { - init(context) - } - - constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int) : super( - context, - attrs, - defStyleAttr - ) { - init(context) - } - - private fun init(context: Context?) { - val view = inflate(context, R.layout.view_divider, this) - B = ViewDividerBinding.bind(view) - } -} +class HorizontalDividerView @JvmOverloads constructor( + context: Context?, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : BaseView(context, attrs, defStyleAttr) \ No newline at end of file diff --git a/app/src/main/java/com/aurora/store/view/epoxy/views/MinimalHeaderView.kt b/app/src/main/java/com/aurora/store/view/epoxy/views/MinimalHeaderView.kt index 23ac02d6e..e801e3670 100644 --- a/app/src/main/java/com/aurora/store/view/epoxy/views/MinimalHeaderView.kt +++ b/app/src/main/java/com/aurora/store/view/epoxy/views/MinimalHeaderView.kt @@ -21,56 +21,34 @@ package com.aurora.store.view.epoxy.views import android.content.Context import android.util.AttributeSet -import android.widget.RelativeLayout import com.airbnb.epoxy.CallbackProp import com.airbnb.epoxy.ModelProp import com.airbnb.epoxy.ModelView import com.airbnb.epoxy.OnViewRecycled -import com.aurora.store.R import com.aurora.store.databinding.ViewActionHeaderBinding - @ModelView( autoLayout = ModelView.Size.MATCH_WIDTH_WRAP_HEIGHT, - baseModelClass = BaseView::class + baseModelClass = BaseModel::class ) -class MinimalHeaderView : RelativeLayout { - - private lateinit var B: ViewActionHeaderBinding - - constructor(context: Context?) : super(context) { - init(context) - } - - constructor(context: Context?, attrs: AttributeSet?) : super(context, attrs) { - init(context) - } - - constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int) : super( - context, - attrs, - defStyleAttr - ) { - init(context) - } - - private fun init(context: Context?) { - val view = inflate(context, R.layout.view_action_header, this) - B = ViewActionHeaderBinding.bind(view) - } +class MinimalHeaderView @JvmOverloads constructor( + context: Context?, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : BaseView(context, attrs, defStyleAttr) { @ModelProp fun title(title: String) { - B.txtTitle.text = title + binding.txtTitle.text = title } @CallbackProp fun click(onClickListener: OnClickListener?) { - B.imgAction.setOnClickListener(onClickListener) + binding.imgAction.setOnClickListener(onClickListener) } @OnViewRecycled fun clear() { - B.imgAction.visibility = VISIBLE + binding.imgAction.visibility = VISIBLE } } diff --git a/app/src/main/java/com/aurora/store/view/epoxy/views/SearchSuggestionView.kt b/app/src/main/java/com/aurora/store/view/epoxy/views/SearchSuggestionView.kt index f8196de72..cc4190e05 100644 --- a/app/src/main/java/com/aurora/store/view/epoxy/views/SearchSuggestionView.kt +++ b/app/src/main/java/com/aurora/store/view/epoxy/views/SearchSuggestionView.kt @@ -21,7 +21,6 @@ package com.aurora.store.view.epoxy.views import android.content.Context import android.util.AttributeSet -import android.widget.RelativeLayout import androidx.core.content.ContextCompat import coil.load import coil.transform.RoundedCornersTransformation @@ -34,41 +33,22 @@ import com.aurora.store.databinding.ViewSearchSuggestionBinding @ModelView( autoLayout = ModelView.Size.MATCH_WIDTH_WRAP_HEIGHT, - baseModelClass = BaseView::class + baseModelClass = BaseModel::class ) -class SearchSuggestionView : RelativeLayout { - - private lateinit var B: ViewSearchSuggestionBinding - - constructor(context: Context?) : super(context) { - init(context) - } - - constructor(context: Context?, attrs: AttributeSet?) : super(context, attrs) { - init(context) - } - - constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int) : super( - context, - attrs, - defStyleAttr - ) { - init(context) - } - - private fun init(context: Context?) { - val view = inflate(context, R.layout.view_search_suggestion, this) - B = ViewSearchSuggestionBinding.bind(view) - } +class SearchSuggestionView @JvmOverloads constructor( + context: Context?, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : BaseView(context, attrs, defStyleAttr) { @ModelProp fun entry(searchSuggestEntry: SearchSuggestEntry) { if (searchSuggestEntry.hasImageContainer()) { - B.img.load(searchSuggestEntry.imageContainer.imageUrl) { + binding.img.load(searchSuggestEntry.imageContainer.imageUrl) { transformations(RoundedCornersTransformation(8F)) } } else { - B.img.setImageDrawable( + binding.img.setImageDrawable( ContextCompat.getDrawable( context, R.drawable.ic_search_suggestion @@ -76,16 +56,16 @@ class SearchSuggestionView : RelativeLayout { ) } - B.txtTitle.text = searchSuggestEntry.title + binding.txtTitle.text = searchSuggestEntry.title } @CallbackProp fun click(onClickListener: OnClickListener?) { - B.root.setOnClickListener(onClickListener) + binding.root.setOnClickListener(onClickListener) } @CallbackProp fun action(onClickListener: OnClickListener?) { - B.action.setOnClickListener(onClickListener) + binding.action.setOnClickListener(onClickListener) } } diff --git a/app/src/main/java/com/aurora/store/view/epoxy/views/UpdateHeaderView.kt b/app/src/main/java/com/aurora/store/view/epoxy/views/UpdateHeaderView.kt index e78164893..8faaf1a90 100644 --- a/app/src/main/java/com/aurora/store/view/epoxy/views/UpdateHeaderView.kt +++ b/app/src/main/java/com/aurora/store/view/epoxy/views/UpdateHeaderView.kt @@ -21,61 +21,40 @@ package com.aurora.store.view.epoxy.views import android.content.Context import android.util.AttributeSet -import android.widget.RelativeLayout import com.airbnb.epoxy.CallbackProp import com.airbnb.epoxy.ModelProp import com.airbnb.epoxy.ModelView import com.airbnb.epoxy.OnViewRecycled -import com.aurora.store.R import com.aurora.store.databinding.ViewHeaderUpdateBinding @ModelView( autoLayout = ModelView.Size.MATCH_WIDTH_WRAP_HEIGHT, - baseModelClass = BaseView::class + baseModelClass = BaseModel::class ) -class UpdateHeaderView : RelativeLayout { - - private lateinit var B: ViewHeaderUpdateBinding - - constructor(context: Context?) : super(context) { - init(context) - } - - constructor(context: Context?, attrs: AttributeSet?) : super(context, attrs) { - init(context) - } - - constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int) : super( - context, - attrs, - defStyleAttr - ) { - init(context) - } - - private fun init(context: Context?) { - val view = inflate(context, R.layout.view_header_update, this) - B = ViewHeaderUpdateBinding.bind(view) - } +class UpdateHeaderView @JvmOverloads constructor( + context: Context?, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : BaseView(context, attrs, defStyleAttr) { @ModelProp fun title(title: String) { - B.txtTitle.text = title + binding.txtTitle.text = title } @ModelProp fun action(action: String) { - B.btnAction.text = action + binding.btnAction.text = action } @CallbackProp fun click(onClickListener: OnClickListener?) { - B.btnAction.setOnClickListener(onClickListener) + binding.btnAction.setOnClickListener(onClickListener) } @OnViewRecycled fun clear() { - B.btnAction.isEnabled = true + binding.btnAction.isEnabled = true } } diff --git a/app/src/main/java/com/aurora/store/view/epoxy/views/app/AppListView.kt b/app/src/main/java/com/aurora/store/view/epoxy/views/app/AppListView.kt index dac6ace6d..33f030007 100644 --- a/app/src/main/java/com/aurora/store/view/epoxy/views/app/AppListView.kt +++ b/app/src/main/java/com/aurora/store/view/epoxy/views/app/AppListView.kt @@ -21,7 +21,6 @@ package com.aurora.store.view.epoxy.views.app import android.content.Context import android.util.AttributeSet -import android.widget.RelativeLayout import coil.load import coil.transform.RoundedCornersTransformation import com.airbnb.epoxy.CallbackProp @@ -31,46 +30,28 @@ import com.aurora.extensions.getString import com.aurora.gplayapi.data.models.App import com.aurora.store.R import com.aurora.store.databinding.ViewAppListBinding +import com.aurora.store.view.epoxy.views.BaseModel import com.aurora.store.view.epoxy.views.BaseView @ModelView( autoLayout = ModelView.Size.MATCH_WIDTH_WRAP_HEIGHT, - baseModelClass = BaseView::class + baseModelClass = BaseModel::class ) -class AppListView : RelativeLayout { - - private lateinit var B: ViewAppListBinding - - constructor(context: Context?) : super(context) { - init(context) - } - - constructor(context: Context?, attrs: AttributeSet?) : super(context, attrs) { - init(context) - } - - constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int) : super( - context, - attrs, - defStyleAttr - ) { - init(context) - } - - private fun init(context: Context?) { - val view = inflate(context, R.layout.view_app_list, this) - B = ViewAppListBinding.bind(view) - } +class AppListView @JvmOverloads constructor( + context: Context?, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : BaseView(context, attrs, defStyleAttr) { @ModelProp fun app(app: App) { - B.imgIcon.load(app.iconArtwork.url) { + binding.imgIcon.load(app.iconArtwork.url) { placeholder(R.drawable.bg_placeholder) transformations(RoundedCornersTransformation(25F)) } - B.txtLine1.text = app.displayName - B.txtLine2.text = app.developerName + binding.txtLine1.text = app.displayName + binding.txtLine2.text = app.developerName val extras: MutableList = mutableListOf() extras.add(app.downloadString) @@ -88,16 +69,16 @@ class AppListView : RelativeLayout { if (app.dependencies.dependentPackages.isNotEmpty()) extras.add(getString(R.string.details_gsf_dependent)) - B.txtLine3.text = extras.joinToString(separator = " • ") + binding.txtLine3.text = extras.joinToString(separator = " • ") } @CallbackProp fun click(onClickListener: OnClickListener?) { - B.root.setOnClickListener(onClickListener) + binding.root.setOnClickListener(onClickListener) } @CallbackProp fun longClick(onClickListener: OnLongClickListener?) { - B.root.setOnLongClickListener(onClickListener) + binding.root.setOnLongClickListener(onClickListener) } } diff --git a/app/src/main/java/com/aurora/store/view/epoxy/views/app/AppUpdateView.kt b/app/src/main/java/com/aurora/store/view/epoxy/views/app/AppUpdateView.kt index e973ff853..f7d7643c1 100644 --- a/app/src/main/java/com/aurora/store/view/epoxy/views/app/AppUpdateView.kt +++ b/app/src/main/java/com/aurora/store/view/epoxy/views/app/AppUpdateView.kt @@ -22,7 +22,6 @@ package com.aurora.store.view.epoxy.views.app import android.content.Context import android.util.AttributeSet import android.view.View -import android.widget.RelativeLayout import androidx.core.content.ContextCompat import androidx.core.text.HtmlCompat import androidx.core.view.isVisible @@ -40,51 +39,33 @@ import com.aurora.store.data.model.DownloadStatus import com.aurora.store.data.room.download.Download import com.aurora.store.databinding.ViewAppUpdateBinding import com.aurora.store.util.CommonUtil +import com.aurora.store.view.epoxy.views.BaseModel import com.aurora.store.view.epoxy.views.BaseView @ModelView( autoLayout = ModelView.Size.MATCH_WIDTH_WRAP_HEIGHT, - baseModelClass = BaseView::class + baseModelClass = BaseModel::class ) -class AppUpdateView : RelativeLayout { - - private lateinit var B: ViewAppUpdateBinding - - constructor(context: Context?) : super(context) { - init(context) - } - - constructor(context: Context?, attrs: AttributeSet?) : super(context, attrs) { - init(context) - } - - constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int) : super( - context, - attrs, - defStyleAttr - ) { - init(context) - } - - private fun init(context: Context?) { - val view = inflate(context, R.layout.view_app_update, this) - B = ViewAppUpdateBinding.bind(view) - } +class AppUpdateView @JvmOverloads constructor( + context: Context?, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : BaseView(context, attrs, defStyleAttr) { @ModelProp fun app(app: App) { /*Inflate App details*/ with(app) { - B.txtLine1.text = displayName - B.imgIcon.load(iconArtwork.url) { + binding.txtLine1.text = displayName + binding.imgIcon.load(iconArtwork.url) { placeholder(R.drawable.bg_placeholder) transformations(RoundedCornersTransformation(8.px.toFloat())) } - B.txtLine2.text = developerName - B.txtLine3.text = ("${CommonUtil.addSiPrefix(size)} • $updatedOn") - B.txtLine4.text = ("$versionName (${versionCode})") - B.txtChangelog.text = if (changes.isNotEmpty()) + binding.txtLine2.text = developerName + binding.txtLine3.text = ("${CommonUtil.addSiPrefix(size)} • $updatedOn") + binding.txtLine4.text = ("$versionName (${versionCode})") + binding.txtChangelog.text = if (changes.isNotEmpty()) HtmlCompat.fromHtml( changes, HtmlCompat.FROM_HTML_OPTION_USE_CSS_COLORS @@ -92,13 +73,15 @@ class AppUpdateView : RelativeLayout { else context.getString(R.string.details_changelog_unavailable) - B.headerIndicator.setOnClickListener { - if (B.txtChangelog.isVisible) { - B.headerIndicator.icon = ContextCompat.getDrawable(context, R.drawable.ic_arrow_down) - B.txtChangelog.visibility = View.GONE + binding.headerIndicator.setOnClickListener { + if (binding.txtChangelog.isVisible) { + binding.headerIndicator.icon = + ContextCompat.getDrawable(context, R.drawable.ic_arrow_down) + binding.txtChangelog.visibility = View.GONE } else { - B.headerIndicator.icon = ContextCompat.getDrawable(context, R.drawable.ic_arrow_up) - B.txtChangelog.visibility = View.VISIBLE + binding.headerIndicator.icon = + ContextCompat.getDrawable(context, R.drawable.ic_arrow_up) + binding.txtChangelog.visibility = View.VISIBLE } } } @@ -108,26 +91,28 @@ class AppUpdateView : RelativeLayout { fun download(download: Download?) { if (download != null) { /*Inflate Download details*/ - B.btnAction.updateState(download.downloadStatus) - B.progressDownload.isIndeterminate = download.progress < 1 + binding.btnAction.updateState(download.downloadStatus) + binding.progressDownload.isIndeterminate = download.progress < 1 when (download.downloadStatus) { DownloadStatus.QUEUED -> { - B.progressDownload.progress = 0 - B.progressDownload.show() + binding.progressDownload.progress = 0 + binding.progressDownload.show() } + DownloadStatus.DOWNLOADING -> { if (download.progress > 0) { if (download.progress == 100) { - B.progressDownload.invisible() + binding.progressDownload.invisible() } else { - B.progressDownload.progress = download.progress - B.progressDownload.show() + binding.progressDownload.progress = download.progress + binding.progressDownload.show() } } } + else -> { - B.progressDownload.progress = 0 - B.progressDownload.invisible() + binding.progressDownload.progress = 0 + binding.progressDownload.invisible() } } } @@ -135,28 +120,28 @@ class AppUpdateView : RelativeLayout { @CallbackProp fun click(onClickListener: OnClickListener?) { - B.layoutContent.setOnClickListener(onClickListener) + binding.layoutContent.setOnClickListener(onClickListener) } @CallbackProp fun positiveAction(onClickListener: OnClickListener?) { - B.btnAction.addPositiveOnClickListener(onClickListener) + binding.btnAction.addPositiveOnClickListener(onClickListener) } @CallbackProp fun negativeAction(onClickListener: OnClickListener?) { - B.btnAction.addNegativeOnClickListener(onClickListener) + binding.btnAction.addNegativeOnClickListener(onClickListener) } @CallbackProp fun longClick(onClickListener: OnLongClickListener?) { - B.layoutContent.setOnLongClickListener(onClickListener) + binding.layoutContent.setOnLongClickListener(onClickListener) } @OnViewRecycled fun clear() { - B.headerIndicator.removeCallbacks { } - B.progressDownload.progress = 0 - B.progressDownload.invisible() + binding.headerIndicator.removeCallbacks { } + binding.progressDownload.progress = 0 + binding.progressDownload.invisible() } } diff --git a/app/src/main/java/com/aurora/store/view/epoxy/views/app/AppView.kt b/app/src/main/java/com/aurora/store/view/epoxy/views/app/AppView.kt index ef1027c2b..af56e6dd4 100644 --- a/app/src/main/java/com/aurora/store/view/epoxy/views/app/AppView.kt +++ b/app/src/main/java/com/aurora/store/view/epoxy/views/app/AppView.kt @@ -21,7 +21,6 @@ package com.aurora.store.view.epoxy.views.app import android.content.Context import android.util.AttributeSet -import android.widget.RelativeLayout import coil.load import coil.transform.RoundedCornersTransformation import com.airbnb.epoxy.CallbackProp @@ -31,61 +30,42 @@ import com.aurora.gplayapi.data.models.App import com.aurora.store.R import com.aurora.store.databinding.ViewAppBinding import com.aurora.store.util.CommonUtil +import com.aurora.store.view.epoxy.views.BaseModel import com.aurora.store.view.epoxy.views.BaseView - @ModelView( autoLayout = ModelView.Size.WRAP_WIDTH_WRAP_HEIGHT, - baseModelClass = BaseView::class + baseModelClass = BaseModel::class ) -class AppView : RelativeLayout { - - private lateinit var B: ViewAppBinding - - constructor(context: Context?) : super(context) { - init(context) - } - - constructor(context: Context?, attrs: AttributeSet?) : super(context, attrs) { - init(context) - } - - constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int) : super( - context, - attrs, - defStyleAttr - ) { - init(context) - } - - private fun init(context: Context?) { - val view = inflate(context, R.layout.view_app, this) - B = ViewAppBinding.bind(view) - } +class AppView @JvmOverloads constructor( + context: Context?, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : BaseView(context, attrs, defStyleAttr) { @ModelProp fun app(app: App) { - B.txtName.text = app.displayName - B.imgIcon.load(app.iconArtwork.url) { + binding.txtName.text = app.displayName + binding.imgIcon.load(app.iconArtwork.url) { placeholder(R.drawable.bg_placeholder) transformations(RoundedCornersTransformation(32F)) } - B.txtSize.text = context + binding.txtSize.text = context .getString(R.string.app_view_rating) .format(app.downloadString, app.rating.abbreviatedLabel) if (app.size > 0) - B.txtSize.text = CommonUtil.addSiPrefix(app.size) + binding.txtSize.text = CommonUtil.addSiPrefix(app.size) } @CallbackProp fun click(onClickListener: OnClickListener?) { - B.root.setOnClickListener(onClickListener) + binding.root.setOnClickListener(onClickListener) } @CallbackProp fun longClick(onClickListener: OnLongClickListener?) { - B.root.setOnLongClickListener(onClickListener) + binding.root.setOnLongClickListener(onClickListener) } } diff --git a/app/src/main/java/com/aurora/store/view/epoxy/views/app/NoAppAltView.kt b/app/src/main/java/com/aurora/store/view/epoxy/views/app/NoAppAltView.kt index 1c5c2fa16..0575683a9 100644 --- a/app/src/main/java/com/aurora/store/view/epoxy/views/app/NoAppAltView.kt +++ b/app/src/main/java/com/aurora/store/view/epoxy/views/app/NoAppAltView.kt @@ -21,45 +21,25 @@ package com.aurora.store.view.epoxy.views.app import android.content.Context import android.util.AttributeSet -import android.widget.RelativeLayout import com.airbnb.epoxy.ModelProp import com.airbnb.epoxy.ModelView -import com.aurora.store.R import com.aurora.store.databinding.ViewNoAppAltBinding +import com.aurora.store.view.epoxy.views.BaseModel import com.aurora.store.view.epoxy.views.BaseView @ModelView( autoLayout = ModelView.Size.MATCH_WIDTH_WRAP_HEIGHT, - baseModelClass = BaseView::class + baseModelClass = BaseModel::class ) -class NoAppAltView : RelativeLayout { - - private lateinit var B: ViewNoAppAltBinding - - constructor(context: Context?) : super(context) { - init(context) - } - - constructor(context: Context?, attrs: AttributeSet?) : super(context, attrs) { - init(context) - } - - constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int) : super( - context, - attrs, - defStyleAttr - ) { - init(context) - } - - private fun init(context: Context?) { - val view = inflate(context, R.layout.view_no_app_alt, this) - B = ViewNoAppAltBinding.bind(view) - } +class NoAppAltView @JvmOverloads constructor( + context: Context?, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : BaseView(context, attrs, defStyleAttr) { @ModelProp fun message(message: String) { - B.txtMsg.text = message + binding.txtMsg.text = message } } diff --git a/app/src/main/java/com/aurora/store/view/epoxy/views/app/NoAppView.kt b/app/src/main/java/com/aurora/store/view/epoxy/views/app/NoAppView.kt index eda2018f6..1272a977e 100644 --- a/app/src/main/java/com/aurora/store/view/epoxy/views/app/NoAppView.kt +++ b/app/src/main/java/com/aurora/store/view/epoxy/views/app/NoAppView.kt @@ -21,53 +21,33 @@ package com.aurora.store.view.epoxy.views.app import android.content.Context import android.util.AttributeSet -import android.widget.RelativeLayout import androidx.core.content.ContextCompat import com.airbnb.epoxy.ModelProp import com.airbnb.epoxy.ModelView -import com.aurora.store.R import com.aurora.store.databinding.ViewNoAppBinding +import com.aurora.store.view.epoxy.views.BaseModel import com.aurora.store.view.epoxy.views.BaseView @ModelView( autoLayout = ModelView.Size.MATCH_WIDTH_MATCH_HEIGHT, - baseModelClass = BaseView::class + baseModelClass = BaseModel::class ) -class NoAppView : RelativeLayout { - - private lateinit var B: ViewNoAppBinding - - constructor(context: Context?) : super(context) { - init(context) - } - - constructor(context: Context?, attrs: AttributeSet?) : super(context, attrs) { - init(context) - } - - constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int) : super( - context, - attrs, - defStyleAttr - ) { - init(context) - } - - private fun init(context: Context?) { - val view = inflate(context, R.layout.view_no_app, this) - B = ViewNoAppBinding.bind(view) - } +class NoAppView @JvmOverloads constructor( + context: Context?, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : BaseView(context, attrs, defStyleAttr) { @ModelProp fun message(message: String) { - B.txt.text = message + binding.txt.text = message } @ModelProp fun icon(icon: Int?) { icon?.let { - B.img.setImageDrawable(ContextCompat.getDrawable(context, icon)) + binding.img.setImageDrawable(ContextCompat.getDrawable(context, icon)) } } } diff --git a/app/src/main/java/com/aurora/store/view/epoxy/views/details/AppDependentView.kt b/app/src/main/java/com/aurora/store/view/epoxy/views/details/AppDependentView.kt index a22e368e8..774da517a 100644 --- a/app/src/main/java/com/aurora/store/view/epoxy/views/details/AppDependentView.kt +++ b/app/src/main/java/com/aurora/store/view/epoxy/views/details/AppDependentView.kt @@ -21,7 +21,6 @@ package com.aurora.store.view.epoxy.views.details import android.content.Context import android.util.AttributeSet -import android.widget.RelativeLayout import coil.load import coil.transform.RoundedCornersTransformation import com.airbnb.epoxy.CallbackProp @@ -30,41 +29,23 @@ import com.airbnb.epoxy.ModelView import com.aurora.gplayapi.data.models.App import com.aurora.store.R import com.aurora.store.databinding.ViewAppDependentBinding +import com.aurora.store.view.epoxy.views.BaseModel import com.aurora.store.view.epoxy.views.BaseView @ModelView( autoLayout = ModelView.Size.WRAP_WIDTH_WRAP_HEIGHT, - baseModelClass = BaseView::class + baseModelClass = BaseModel::class ) -class AppDependentView : RelativeLayout { - - private lateinit var B: ViewAppDependentBinding - - constructor(context: Context?) : super(context) { - init(context) - } - - constructor(context: Context?, attrs: AttributeSet?) : super(context, attrs) { - init(context) - } - - constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int) : super( - context, - attrs, - defStyleAttr - ) { - init(context) - } - - private fun init(context: Context?) { - val view = inflate(context, R.layout.view_app_dependent, this) - B = ViewAppDependentBinding.bind(view) - } +class AppDependentView @JvmOverloads constructor( + context: Context?, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : BaseView(context, attrs, defStyleAttr) { @ModelProp fun app(app: App) { - B.txtName.text = app.displayName - B.imgIcon.load(app.iconArtwork.url) { + binding.txtName.text = app.displayName + binding.imgIcon.load(app.iconArtwork.url) { placeholder(R.drawable.bg_placeholder) transformations(RoundedCornersTransformation(32F)) } @@ -72,11 +53,11 @@ class AppDependentView : RelativeLayout { @CallbackProp fun click(onClickListener: OnClickListener?) { - B.root.setOnClickListener(onClickListener) + binding.root.setOnClickListener(onClickListener) } @CallbackProp fun longClick(onClickListener: OnLongClickListener?) { - B.root.setOnLongClickListener(onClickListener) + binding.root.setOnLongClickListener(onClickListener) } } diff --git a/app/src/main/java/com/aurora/store/view/epoxy/views/details/BadgeView.kt b/app/src/main/java/com/aurora/store/view/epoxy/views/details/BadgeView.kt index bed34cf73..af3a6ab9b 100644 --- a/app/src/main/java/com/aurora/store/view/epoxy/views/details/BadgeView.kt +++ b/app/src/main/java/com/aurora/store/view/epoxy/views/details/BadgeView.kt @@ -21,58 +21,38 @@ package com.aurora.store.view.epoxy.views.details import android.content.Context import android.util.AttributeSet -import android.widget.RelativeLayout import coil.load import com.airbnb.epoxy.ModelProp import com.airbnb.epoxy.ModelView import com.aurora.gplayapi.data.models.details.Badge -import com.aurora.store.R import com.aurora.store.databinding.ViewBadgeBinding +import com.aurora.store.view.epoxy.views.BaseModel import com.aurora.store.view.epoxy.views.BaseView @ModelView( autoLayout = ModelView.Size.WRAP_WIDTH_WRAP_HEIGHT, - baseModelClass = BaseView::class + baseModelClass = BaseModel::class ) -class BadgeView : RelativeLayout { - - private lateinit var B: ViewBadgeBinding - - constructor(context: Context?) : super(context) { - init(context) - } - - constructor(context: Context?, attrs: AttributeSet?) : super(context, attrs) { - init(context) - } - - constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int) : super( - context, - attrs, - defStyleAttr - ) { - init(context) - } - - private fun init(context: Context?) { - val view = inflate(context, R.layout.view_badge, this) - B = ViewBadgeBinding.bind(view) - } +class BadgeView @JvmOverloads constructor( + context: Context?, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : BaseView(context, attrs, defStyleAttr) { @ModelProp fun badge(badge: Badge) { if (badge.textMajor.isEmpty()) { if (badge.textMinor.isEmpty()) { - B.txt.text = badge.textDescription + binding.txt.text = badge.textDescription } else { - B.txt.text = badge.textMinor + binding.txt.text = badge.textMinor } } else { - B.txt.text = badge.textMajor + binding.txt.text = badge.textMajor } badge.artwork?.let { - B.img.load(it.url) + binding.img.load(it.url) } } } diff --git a/app/src/main/java/com/aurora/store/view/epoxy/views/details/ExodusView.kt b/app/src/main/java/com/aurora/store/view/epoxy/views/details/ExodusView.kt index a6ca6f92f..8bdc12182 100644 --- a/app/src/main/java/com/aurora/store/view/epoxy/views/details/ExodusView.kt +++ b/app/src/main/java/com/aurora/store/view/epoxy/views/details/ExodusView.kt @@ -21,55 +21,35 @@ package com.aurora.store.view.epoxy.views.details import android.content.Context import android.util.AttributeSet -import android.widget.RelativeLayout import com.airbnb.epoxy.CallbackProp import com.airbnb.epoxy.ModelProp import com.airbnb.epoxy.ModelView import com.airbnb.epoxy.OnViewRecycled -import com.aurora.store.R import com.aurora.store.data.model.ExodusTracker import com.aurora.store.databinding.ViewExodusBinding +import com.aurora.store.view.epoxy.views.BaseModel import com.aurora.store.view.epoxy.views.BaseView @ModelView( autoLayout = ModelView.Size.MATCH_WIDTH_WRAP_HEIGHT, - baseModelClass = BaseView::class + baseModelClass = BaseModel::class ) -class ExodusView : RelativeLayout { - - private lateinit var B: ViewExodusBinding - - constructor(context: Context?) : super(context) { - init(context) - } - - constructor(context: Context?, attrs: AttributeSet?) : super(context, attrs) { - init(context) - } - - constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int) : super( - context, - attrs, - defStyleAttr - ) { - init(context) - } - - private fun init(context: Context?) { - val view = inflate(context, R.layout.view_exodus, this) - B = ViewExodusBinding.bind(view) - } +class ExodusView @JvmOverloads constructor( + context: Context?, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : BaseView(context, attrs, defStyleAttr) { @ModelProp fun tracker(report: ExodusTracker) { - B.txtTitle.text = report.name - B.txtSubtitle.text = report.signature - B.txtDescription.text = report.date + binding.txtTitle.text = report.name + binding.txtSubtitle.text = report.signature + binding.txtDescription.text = report.date } @CallbackProp fun click(onClickListener: OnClickListener?) { - B.root.setOnClickListener(onClickListener) + binding.root.setOnClickListener(onClickListener) } @OnViewRecycled diff --git a/app/src/main/java/com/aurora/store/view/epoxy/views/details/FileView.kt b/app/src/main/java/com/aurora/store/view/epoxy/views/details/FileView.kt index a799eee36..5b23f8686 100644 --- a/app/src/main/java/com/aurora/store/view/epoxy/views/details/FileView.kt +++ b/app/src/main/java/com/aurora/store/view/epoxy/views/details/FileView.kt @@ -21,47 +21,27 @@ package com.aurora.store.view.epoxy.views.details import android.content.Context import android.util.AttributeSet -import android.widget.RelativeLayout import com.airbnb.epoxy.ModelProp import com.airbnb.epoxy.ModelView import com.aurora.gplayapi.data.models.File -import com.aurora.store.R import com.aurora.store.databinding.ViewFileBinding import com.aurora.store.util.CommonUtil +import com.aurora.store.view.epoxy.views.BaseModel import com.aurora.store.view.epoxy.views.BaseView @ModelView( autoLayout = ModelView.Size.WRAP_WIDTH_WRAP_HEIGHT, - baseModelClass = BaseView::class + baseModelClass = BaseModel::class ) -class FileView : RelativeLayout { - - private lateinit var B: ViewFileBinding - - constructor(context: Context?) : super(context) { - init(context) - } - - constructor(context: Context?, attrs: AttributeSet?) : super(context, attrs) { - init(context) - } - - constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int) : super( - context, - attrs, - defStyleAttr - ) { - init(context) - } - - private fun init(context: Context?) { - val view = inflate(context, R.layout.view_file, this) - B = ViewFileBinding.bind(view) - } +class FileView @JvmOverloads constructor( + context: Context?, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : BaseView(context, attrs, defStyleAttr) { @ModelProp fun file(file: File) { - B.line1.text = file.name - B.line2.text = CommonUtil.addSiPrefix(file.size) + binding.line1.text = file.name + binding.line2.text = CommonUtil.addSiPrefix(file.size) } } diff --git a/app/src/main/java/com/aurora/store/view/epoxy/views/details/InfoView.kt b/app/src/main/java/com/aurora/store/view/epoxy/views/details/InfoView.kt index 168842a02..13fa11e2d 100644 --- a/app/src/main/java/com/aurora/store/view/epoxy/views/details/InfoView.kt +++ b/app/src/main/java/com/aurora/store/view/epoxy/views/details/InfoView.kt @@ -21,47 +21,27 @@ package com.aurora.store.view.epoxy.views.details import android.content.Context import android.util.AttributeSet -import android.widget.RelativeLayout import com.airbnb.epoxy.ModelProp import com.airbnb.epoxy.ModelView import com.airbnb.epoxy.OnViewRecycled -import com.aurora.store.R import com.aurora.store.databinding.ViewInfoBinding +import com.aurora.store.view.epoxy.views.BaseModel import com.aurora.store.view.epoxy.views.BaseView import java.util.Locale @ModelView( autoLayout = ModelView.Size.MATCH_WIDTH_WRAP_HEIGHT, - baseModelClass = BaseView::class + baseModelClass = BaseModel::class ) -class InfoView : RelativeLayout { - - private lateinit var B: ViewInfoBinding - - constructor(context: Context?) : super(context) { - init(context) - } - - constructor(context: Context?, attrs: AttributeSet?) : super(context, attrs) { - init(context) - } - - constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int) : super( - context, - attrs, - defStyleAttr - ) { - init(context) - } - - private fun init(context: Context?) { - val view = inflate(context, R.layout.view_info, this) - B = ViewInfoBinding.bind(view) - } +class InfoView @JvmOverloads constructor( + context: Context?, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : BaseView(context, attrs, defStyleAttr) { @ModelProp(options = [ModelProp.Option.IgnoreRequireHashCode]) fun badge(info: Map.Entry) { - B.txtTitle.text = info.key + binding.txtTitle.text = info.key .replace("_", " ") .lowercase(Locale.getDefault()) .replaceFirstChar { @@ -71,10 +51,12 @@ class InfoView : RelativeLayout { it.toString() } } - B.txtSubtitle.text = info.value + binding.txtSubtitle.text = info.value } @OnViewRecycled fun clear() { + binding.txtTitle.text = null + binding.txtSubtitle.text = null } } diff --git a/app/src/main/java/com/aurora/store/view/epoxy/views/details/LargeScreenshotView.kt b/app/src/main/java/com/aurora/store/view/epoxy/views/details/LargeScreenshotView.kt index 98be75287..ba2e73fbc 100644 --- a/app/src/main/java/com/aurora/store/view/epoxy/views/details/LargeScreenshotView.kt +++ b/app/src/main/java/com/aurora/store/view/epoxy/views/details/LargeScreenshotView.kt @@ -22,48 +22,29 @@ package com.aurora.store.view.epoxy.views.details import android.content.Context import android.content.res.Resources import android.util.AttributeSet -import android.widget.RelativeLayout import coil.load import com.airbnb.epoxy.ModelProp import com.airbnb.epoxy.ModelView import com.aurora.gplayapi.data.models.Artwork import com.aurora.store.R import com.aurora.store.databinding.ViewScreenshotLargeBinding +import com.aurora.store.view.epoxy.views.BaseModel import com.aurora.store.view.epoxy.views.BaseView @ModelView( autoLayout = ModelView.Size.MATCH_WIDTH_MATCH_HEIGHT, - baseModelClass = BaseView::class + baseModelClass = BaseModel::class ) -class LargeScreenshotView : RelativeLayout { - - private lateinit var B: ViewScreenshotLargeBinding - - constructor(context: Context?) : super(context) { - init(context) - } - - constructor(context: Context?, attrs: AttributeSet?) : super(context, attrs) { - init(context) - } - - constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int) : super( - context, - attrs, - defStyleAttr - ) { - init(context) - } - - private fun init(context: Context?) { - val view = inflate(context, R.layout.view_screenshot_large, this) - B = ViewScreenshotLargeBinding.bind(view) - } +class LargeScreenshotView @JvmOverloads constructor( + context: Context?, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : BaseView(context, attrs, defStyleAttr) { @ModelProp fun artwork(artwork: Artwork) { val displayMetrics = Resources.getSystem().displayMetrics - B.img.load("${artwork.url}=rw-w${displayMetrics.widthPixels}-v1-e15") { + binding.img.load("${artwork.url}=rw-w${displayMetrics.widthPixels}-v1-e15") { placeholder(R.drawable.bg_placeholder) } } diff --git a/app/src/main/java/com/aurora/store/view/epoxy/views/details/MiniScreenshotView.kt b/app/src/main/java/com/aurora/store/view/epoxy/views/details/MiniScreenshotView.kt index 0d7b03232..5807b2c4f 100644 --- a/app/src/main/java/com/aurora/store/view/epoxy/views/details/MiniScreenshotView.kt +++ b/app/src/main/java/com/aurora/store/view/epoxy/views/details/MiniScreenshotView.kt @@ -21,7 +21,6 @@ package com.aurora.store.view.epoxy.views.details import android.content.Context import android.util.AttributeSet -import android.widget.RelativeLayout import coil.load import coil.transform.RoundedCornersTransformation import com.airbnb.epoxy.CallbackProp @@ -31,15 +30,18 @@ import com.aurora.extensions.px import com.aurora.gplayapi.data.models.Artwork import com.aurora.store.R import com.aurora.store.databinding.ViewScreenshotMiniBinding +import com.aurora.store.view.epoxy.views.BaseModel import com.aurora.store.view.epoxy.views.BaseView @ModelView( autoLayout = ModelView.Size.WRAP_WIDTH_WRAP_HEIGHT, - baseModelClass = BaseView::class + baseModelClass = BaseModel::class ) -class MiniScreenshotView : RelativeLayout { - - private lateinit var B: ViewScreenshotMiniBinding +class MiniScreenshotView @JvmOverloads constructor( + context: Context?, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : BaseView(context, attrs, defStyleAttr) { private var position: Int = 0 @@ -47,27 +49,6 @@ class MiniScreenshotView : RelativeLayout { fun onClick(position: Int = 0) } - constructor(context: Context?) : super(context) { - init(context) - } - - constructor(context: Context?, attrs: AttributeSet?) : super(context, attrs) { - init(context) - } - - constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int) : super( - context, - attrs, - defStyleAttr - ) { - init(context) - } - - private fun init(context: Context?) { - val view = inflate(context, R.layout.view_screenshot_mini, this) - B = ViewScreenshotMiniBinding.bind(view) - } - @ModelProp fun position(pos: Int) { position = pos @@ -76,7 +57,7 @@ class MiniScreenshotView : RelativeLayout { @ModelProp fun artwork(artwork: Artwork) { normalizeSize(artwork) - B.img.load("${artwork.url}=rw-w480-v1-e15") { + binding.img.load("${artwork.url}=rw-w480-v1-e15") { placeholder(R.drawable.bg_rounded) transformations(RoundedCornersTransformation(8.px.toFloat())) } @@ -96,6 +77,7 @@ class MiniScreenshotView : RelativeLayout { normalizedHeight = 120f normalizedWidth = 120f } + else -> { val factor = artworkHeight / 120f normalizedHeight = 120f @@ -103,15 +85,15 @@ class MiniScreenshotView : RelativeLayout { } } - B.img.layoutParams.height = normalizedHeight.px.toInt() - B.img.layoutParams.width = normalizedWidth.px.toInt() - B.img.requestLayout() + binding.img.layoutParams.height = normalizedHeight.px.toInt() + binding.img.layoutParams.width = normalizedWidth.px.toInt() + binding.img.requestLayout() } } @CallbackProp fun callback(screenshotCallback: ScreenshotCallback?) { - B.img.setOnClickListener { + binding.img.setOnClickListener { screenshotCallback?.onClick(position) } } diff --git a/app/src/main/java/com/aurora/store/view/epoxy/views/details/MoreBadgeView.kt b/app/src/main/java/com/aurora/store/view/epoxy/views/details/MoreBadgeView.kt index a886c32f0..c67491c79 100644 --- a/app/src/main/java/com/aurora/store/view/epoxy/views/details/MoreBadgeView.kt +++ b/app/src/main/java/com/aurora/store/view/epoxy/views/details/MoreBadgeView.kt @@ -21,7 +21,6 @@ package com.aurora.store.view.epoxy.views.details import android.content.Context import android.util.AttributeSet -import android.widget.RelativeLayout import androidx.core.text.HtmlCompat import coil.load import com.airbnb.epoxy.ModelProp @@ -29,57 +28,39 @@ import com.airbnb.epoxy.ModelView import com.aurora.gplayapi.data.models.details.Badge import com.aurora.store.R import com.aurora.store.databinding.ViewMoreBadgeBinding +import com.aurora.store.view.epoxy.views.BaseModel import com.aurora.store.view.epoxy.views.BaseView @ModelView( autoLayout = ModelView.Size.WRAP_WIDTH_WRAP_HEIGHT, - baseModelClass = BaseView::class + baseModelClass = BaseModel::class ) -class MoreBadgeView : RelativeLayout { - - private lateinit var B: ViewMoreBadgeBinding - - constructor(context: Context?) : super(context) { - init(context) - } - - constructor(context: Context?, attrs: AttributeSet?) : super(context, attrs) { - init(context) - } - - constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int) : super( - context, - attrs, - defStyleAttr - ) { - init(context) - } - - private fun init(context: Context?) { - val view = inflate(context, R.layout.view_more_badge, this) - B = ViewMoreBadgeBinding.bind(view) - } +class MoreBadgeView @JvmOverloads constructor( + context: Context?, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : BaseView(context, attrs, defStyleAttr) { @ModelProp fun badge(badge: Badge) { - B.line1.text = badge.textMajor + binding.line1.text = badge.textMajor badge.textMinorHtml?.let { if (it.isNotEmpty()) { - B.line2.text = HtmlCompat.fromHtml(it, HtmlCompat.FROM_HTML_MODE_COMPACT) + binding.line2.text = HtmlCompat.fromHtml(it, HtmlCompat.FROM_HTML_MODE_COMPACT) } else { - B.line2.text = badge.textMinor + binding.line2.text = badge.textMinor } } badge.textDescription?.let { if (it.isNotEmpty()) { - B.line2.text = it + binding.line2.text = it } } badge.artwork?.let { - B.img.load(it.url) { + binding.img.load(it.url) { placeholder(R.drawable.ic_arrow_right) } } diff --git a/app/src/main/java/com/aurora/store/view/epoxy/views/details/ReviewView.kt b/app/src/main/java/com/aurora/store/view/epoxy/views/details/ReviewView.kt index d5380d0ba..b3dc8b913 100644 --- a/app/src/main/java/com/aurora/store/view/epoxy/views/details/ReviewView.kt +++ b/app/src/main/java/com/aurora/store/view/epoxy/views/details/ReviewView.kt @@ -21,7 +21,6 @@ package com.aurora.store.view.epoxy.views.details import android.content.Context import android.util.AttributeSet -import android.widget.RelativeLayout import coil.load import coil.transform.RoundedCornersTransformation import com.airbnb.epoxy.CallbackProp @@ -31,61 +30,40 @@ import com.aurora.extensions.toDate import com.aurora.gplayapi.data.models.Review import com.aurora.store.R import com.aurora.store.databinding.ViewReviewBinding +import com.aurora.store.view.epoxy.views.BaseModel import com.aurora.store.view.epoxy.views.BaseView @ModelView( autoLayout = ModelView.Size.MATCH_WIDTH_WRAP_HEIGHT, - baseModelClass = BaseView::class + baseModelClass = BaseModel::class ) -class ReviewView : RelativeLayout { - - private lateinit var B: ViewReviewBinding - - constructor(context: Context?) : super(context) { - init(context) - } - - constructor(context: Context?, attrs: AttributeSet?) : super(context, attrs) { - init(context) - } - - constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int) : super( - context, - attrs, - defStyleAttr - ) { - init(context) - } - - private fun init(context: Context?) { - val view = inflate(context, R.layout.view_review, this) - B = ViewReviewBinding.bind(view) - } +class ReviewView @JvmOverloads constructor( + context: Context?, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : BaseView(context, attrs, defStyleAttr) { @ModelProp fun review(review: Review) { - B.txtAuthor.text = review.userName - B.txtTime.text = ("${review.timeStamp.toDate()} • v${review.appVersion}") - B.txtComment.text = review.comment + binding.txtAuthor.text = review.userName + binding.txtTime.text = ("${review.timeStamp.toDate()} • v${review.appVersion}") + binding.txtComment.text = review.comment - B.img.load(review.userPhotoUrl) { + binding.img.load(review.userPhotoUrl) { placeholder(R.drawable.bg_placeholder) transformations(RoundedCornersTransformation(32F)) } - B.rating.rating = review.rating.toFloat() - /*if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { - B.line2.justificationMode = Layout.JUSTIFICATION_MODE_INTER_WORD - }*/ + binding.rating.rating = review.rating.toFloat() } @CallbackProp fun click(onClickListener: OnClickListener?) { - B.root.setOnClickListener(onClickListener) + binding.root.setOnClickListener(onClickListener) } @CallbackProp fun longClick(onClickListener: OnLongClickListener?) { - B.root.setOnLongClickListener(onClickListener) + binding.root.setOnLongClickListener(onClickListener) } } diff --git a/app/src/main/java/com/aurora/store/view/epoxy/views/details/ScreenshotView.kt b/app/src/main/java/com/aurora/store/view/epoxy/views/details/ScreenshotView.kt index 52e944263..819b41550 100644 --- a/app/src/main/java/com/aurora/store/view/epoxy/views/details/ScreenshotView.kt +++ b/app/src/main/java/com/aurora/store/view/epoxy/views/details/ScreenshotView.kt @@ -21,7 +21,6 @@ package com.aurora.store.view.epoxy.views.details import android.content.Context import android.util.AttributeSet -import android.widget.RelativeLayout import coil.load import coil.transform.RoundedCornersTransformation import com.airbnb.epoxy.CallbackProp @@ -31,15 +30,18 @@ import com.aurora.extensions.px import com.aurora.gplayapi.data.models.Artwork import com.aurora.store.R import com.aurora.store.databinding.ViewScreenshotBinding +import com.aurora.store.view.epoxy.views.BaseModel import com.aurora.store.view.epoxy.views.BaseView @ModelView( autoLayout = ModelView.Size.WRAP_WIDTH_WRAP_HEIGHT, - baseModelClass = BaseView::class + baseModelClass = BaseModel::class ) -class ScreenshotView : RelativeLayout { - - private lateinit var B: ViewScreenshotBinding +class ScreenshotView @JvmOverloads constructor( + context: Context?, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : BaseView(context, attrs, defStyleAttr) { private var position: Int = 0 @@ -47,27 +49,6 @@ class ScreenshotView : RelativeLayout { fun onClick(position: Int = 0) } - constructor(context: Context?) : super(context) { - init(context) - } - - constructor(context: Context?, attrs: AttributeSet?) : super(context, attrs) { - init(context) - } - - constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int) : super( - context, - attrs, - defStyleAttr - ) { - init(context) - } - - private fun init(context: Context?) { - val view = inflate(context, R.layout.view_screenshot, this) - B = ViewScreenshotBinding.bind(view) - } - @ModelProp fun position(pos: Int) { position = pos @@ -76,7 +57,7 @@ class ScreenshotView : RelativeLayout { @ModelProp fun artwork(artwork: Artwork) { normalizeSize(artwork) - B.img.load("${artwork.url}=rw-w480-v1-e15") { + binding.img.load("${artwork.url}=rw-w480-v1-e15") { placeholder(R.drawable.bg_rounded) transformations(RoundedCornersTransformation(8.px.toFloat())) } @@ -96,6 +77,7 @@ class ScreenshotView : RelativeLayout { normalizedHeight = 192f normalizedWidth = 192f } + else -> { val factor = artworkHeight / 192f normalizedHeight = 192f @@ -103,15 +85,15 @@ class ScreenshotView : RelativeLayout { } } - B.img.layoutParams.height = normalizedHeight.px.toInt() - B.img.layoutParams.width = normalizedWidth.px.toInt() - B.img.requestLayout() + binding.img.layoutParams.height = normalizedHeight.px.toInt() + binding.img.layoutParams.width = normalizedWidth.px.toInt() + binding.img.requestLayout() } } @CallbackProp fun callback(screenshotCallback: ScreenshotCallback?) { - B.img.setOnClickListener { + binding.img.setOnClickListener { screenshotCallback?.onClick(position) } } diff --git a/app/src/main/java/com/aurora/store/view/epoxy/views/preference/DashView.kt b/app/src/main/java/com/aurora/store/view/epoxy/views/preference/DashView.kt index b4ae902a1..b49caa2fa 100644 --- a/app/src/main/java/com/aurora/store/view/epoxy/views/preference/DashView.kt +++ b/app/src/main/java/com/aurora/store/view/epoxy/views/preference/DashView.kt @@ -21,54 +21,34 @@ package com.aurora.store.view.epoxy.views.preference import android.content.Context import android.util.AttributeSet -import android.widget.RelativeLayout import androidx.core.content.ContextCompat import com.airbnb.epoxy.CallbackProp import com.airbnb.epoxy.ModelProp import com.airbnb.epoxy.ModelView -import com.aurora.store.R import com.aurora.store.data.model.Dash import com.aurora.store.databinding.ViewDashBinding +import com.aurora.store.view.epoxy.views.BaseModel import com.aurora.store.view.epoxy.views.BaseView @ModelView( autoLayout = ModelView.Size.MATCH_WIDTH_WRAP_HEIGHT, - baseModelClass = BaseView::class + baseModelClass = BaseModel::class ) -class DashView : RelativeLayout { - - private lateinit var B: ViewDashBinding - - constructor(context: Context?) : super(context) { - init(context) - } - - constructor(context: Context?, attrs: AttributeSet?) : super(context, attrs) { - init(context) - } - - constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int) : super( - context, - attrs, - defStyleAttr - ) { - init(context) - } - - private fun init(context: Context?) { - val view = inflate(context, R.layout.view_dash, this) - B = ViewDashBinding.bind(view) - } +class DashView @JvmOverloads constructor( + context: Context?, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : BaseView(context, attrs, defStyleAttr) { @ModelProp fun dash(dash: Dash) { - B.line1.text = dash.title - B.line2.text = dash.subtitle - B.img.setImageDrawable(ContextCompat.getDrawable(context, dash.icon)) + binding.line1.text = dash.title + binding.line2.text = dash.subtitle + binding.img.setImageDrawable(ContextCompat.getDrawable(context, dash.icon)) } @CallbackProp fun click(onClickListener: OnClickListener?) { - B.root.setOnClickListener(onClickListener) + binding.root.setOnClickListener(onClickListener) } } diff --git a/app/src/main/java/com/aurora/store/view/epoxy/views/preference/DeviceView.kt b/app/src/main/java/com/aurora/store/view/epoxy/views/preference/DeviceView.kt index 238dd3947..6d51d25dd 100644 --- a/app/src/main/java/com/aurora/store/view/epoxy/views/preference/DeviceView.kt +++ b/app/src/main/java/com/aurora/store/view/epoxy/views/preference/DeviceView.kt @@ -22,62 +22,43 @@ package com.aurora.store.view.epoxy.views.preference import android.content.Context import android.util.AttributeSet import android.widget.CompoundButton -import android.widget.RelativeLayout import com.airbnb.epoxy.CallbackProp import com.airbnb.epoxy.ModelProp import com.airbnb.epoxy.ModelView import com.aurora.store.R import com.aurora.store.databinding.ViewDeviceBinding +import com.aurora.store.view.epoxy.views.BaseModel import com.aurora.store.view.epoxy.views.BaseView import java.util.Properties @ModelView( autoLayout = ModelView.Size.MATCH_WIDTH_WRAP_HEIGHT, - baseModelClass = BaseView::class + baseModelClass = BaseModel::class ) -class DeviceView : RelativeLayout { - - private lateinit var B: ViewDeviceBinding - - constructor(context: Context?) : super(context) { - init(context) - } - - constructor(context: Context?, attrs: AttributeSet?) : super(context, attrs) { - init(context) - } - - constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int) : super( - context, - attrs, - defStyleAttr - ) { - init(context) - } - - private fun init(context: Context?) { - val view = inflate(context, R.layout.view_device, this) - B = ViewDeviceBinding.bind(view) - } +class DeviceView @JvmOverloads constructor( + context: Context?, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : BaseView(context, attrs, defStyleAttr) { @ModelProp fun properties(properties: Properties) { - B.line1.text = properties.getProperty("UserReadableName") - B.line2.text = resources.getString( + binding.line1.text = properties.getProperty("UserReadableName") + binding.line2.text = resources.getString( R.string.spoof_property, properties.getProperty("Build.MANUFACTURER"), properties.getProperty("Build.VERSION.SDK_INT") ) - B.line3.text = properties.getProperty("Platforms") + binding.line3.text = properties.getProperty("Platforms") } @ModelProp fun markChecked(isChecked: Boolean) { - B.checkbox.isChecked = isChecked + binding.checkbox.isChecked = isChecked } @CallbackProp fun checked(onCheckedChangeListener: CompoundButton.OnCheckedChangeListener?) { - B.checkbox.setOnCheckedChangeListener(onCheckedChangeListener) + binding.checkbox.setOnCheckedChangeListener(onCheckedChangeListener) } } diff --git a/app/src/main/java/com/aurora/store/view/epoxy/views/preference/InstallerView.kt b/app/src/main/java/com/aurora/store/view/epoxy/views/preference/InstallerView.kt index 0d59de621..ec5a6bc2c 100644 --- a/app/src/main/java/com/aurora/store/view/epoxy/views/preference/InstallerView.kt +++ b/app/src/main/java/com/aurora/store/view/epoxy/views/preference/InstallerView.kt @@ -22,63 +22,43 @@ package com.aurora.store.view.epoxy.views.preference import android.content.Context import android.util.AttributeSet import android.widget.CompoundButton -import android.widget.RelativeLayout import com.airbnb.epoxy.CallbackProp import com.airbnb.epoxy.ModelProp import com.airbnb.epoxy.ModelView -import com.aurora.store.R import com.aurora.store.data.model.InstallerInfo import com.aurora.store.databinding.ViewInstallerBinding +import com.aurora.store.view.epoxy.views.BaseModel import com.aurora.store.view.epoxy.views.BaseView @ModelView( autoLayout = ModelView.Size.MATCH_WIDTH_WRAP_HEIGHT, - baseModelClass = BaseView::class + baseModelClass = BaseModel::class ) -class InstallerView : RelativeLayout { - - private lateinit var B: ViewInstallerBinding - - constructor(context: Context?) : super(context) { - init(context) - } - - constructor(context: Context?, attrs: AttributeSet?) : super(context, attrs) { - init(context) - } - - constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int) : super( - context, - attrs, - defStyleAttr - ) { - init(context) - } - - private fun init(context: Context?) { - val view = inflate(context, R.layout.view_installer, this) - B = ViewInstallerBinding.bind(view) - } +class InstallerView @JvmOverloads constructor( + context: Context?, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : BaseView(context, attrs, defStyleAttr) { @ModelProp fun installer(installer: InstallerInfo) { - B.line1.text = installer.title - B.line2.text = installer.subtitle - B.line3.text = installer.description + binding.line1.text = installer.title + binding.line2.text = installer.subtitle + binding.line3.text = installer.description } @ModelProp fun markChecked(isChecked: Boolean) { - B.radiobutton.isChecked = isChecked + binding.radiobutton.isChecked = isChecked } @CallbackProp fun checked(onCheckedChangeListener: CompoundButton.OnCheckedChangeListener?) { - B.radiobutton.setOnCheckedChangeListener(onCheckedChangeListener) + binding.radiobutton.setOnCheckedChangeListener(onCheckedChangeListener) } @CallbackProp fun click(onClickListener: OnClickListener?) { - B.root.setOnClickListener(onClickListener) + binding.root.setOnClickListener(onClickListener) } } diff --git a/app/src/main/java/com/aurora/store/view/epoxy/views/preference/LinkView.kt b/app/src/main/java/com/aurora/store/view/epoxy/views/preference/LinkView.kt index 0f45056ee..bc5450b35 100644 --- a/app/src/main/java/com/aurora/store/view/epoxy/views/preference/LinkView.kt +++ b/app/src/main/java/com/aurora/store/view/epoxy/views/preference/LinkView.kt @@ -21,64 +21,44 @@ package com.aurora.store.view.epoxy.views.preference import android.content.Context import android.util.AttributeSet -import android.widget.RelativeLayout import coil.load import com.airbnb.epoxy.CallbackProp import com.airbnb.epoxy.ModelProp import com.airbnb.epoxy.ModelView import com.aurora.extensions.hide import com.aurora.extensions.show -import com.aurora.store.R import com.aurora.store.data.model.Link import com.aurora.store.databinding.ViewLinkBinding +import com.aurora.store.view.epoxy.views.BaseModel import com.aurora.store.view.epoxy.views.BaseView @ModelView( autoLayout = ModelView.Size.MATCH_WIDTH_WRAP_HEIGHT, - baseModelClass = BaseView::class + baseModelClass = BaseModel::class ) -class LinkView : RelativeLayout { - - private lateinit var B: ViewLinkBinding - - constructor(context: Context?) : super(context) { - init(context) - } - - constructor(context: Context?, attrs: AttributeSet?) : super(context, attrs) { - init(context) - } - - constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int) : super( - context, - attrs, - defStyleAttr - ) { - init(context) - } - - private fun init(context: Context?) { - val view = inflate(context, R.layout.view_link, this) - B = ViewLinkBinding.bind(view) - } +class LinkView @JvmOverloads constructor( + context: Context?, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : BaseView(context, attrs, defStyleAttr) { @ModelProp fun link(link: Link) { - B.line1.text = link.title - B.line2.text = link.subtitle + binding.line1.text = link.title + binding.line2.text = link.subtitle if (link.url.startsWith("http") || link.url.startsWith("upi")) { - B.line3.hide() + binding.line3.hide() } else { - B.line3.show() - B.line3.text = link.url + binding.line3.show() + binding.line3.text = link.url } - B.imgIcon.load(link.icon) + binding.imgIcon.load(link.icon) } @CallbackProp fun click(onClickListener: OnClickListener?) { - B.root.setOnClickListener(onClickListener) + binding.root.setOnClickListener(onClickListener) } } diff --git a/app/src/main/java/com/aurora/store/view/epoxy/views/preference/LocaleView.kt b/app/src/main/java/com/aurora/store/view/epoxy/views/preference/LocaleView.kt index cd1fd5620..0aa51ab3b 100644 --- a/app/src/main/java/com/aurora/store/view/epoxy/views/preference/LocaleView.kt +++ b/app/src/main/java/com/aurora/store/view/epoxy/views/preference/LocaleView.kt @@ -22,57 +22,37 @@ package com.aurora.store.view.epoxy.views.preference import android.content.Context import android.util.AttributeSet import android.widget.CompoundButton -import android.widget.RelativeLayout import com.airbnb.epoxy.CallbackProp import com.airbnb.epoxy.ModelProp import com.airbnb.epoxy.ModelView -import com.aurora.store.R import com.aurora.store.databinding.ViewLocaleBinding +import com.aurora.store.view.epoxy.views.BaseModel import com.aurora.store.view.epoxy.views.BaseView import java.util.Locale @ModelView( autoLayout = ModelView.Size.MATCH_WIDTH_WRAP_HEIGHT, - baseModelClass = BaseView::class + baseModelClass = BaseModel::class ) -class LocaleView : RelativeLayout { - - private lateinit var B: ViewLocaleBinding - - constructor(context: Context?) : super(context) { - init(context) - } - - constructor(context: Context?, attrs: AttributeSet?) : super(context, attrs) { - init(context) - } - - constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int) : super( - context, - attrs, - defStyleAttr - ) { - init(context) - } - - private fun init(context: Context?) { - val view = inflate(context, R.layout.view_locale, this) - B = ViewLocaleBinding.bind(view) - } +class LocaleView @JvmOverloads constructor( + context: Context?, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : BaseView(context, attrs, defStyleAttr) { @ModelProp fun locale(locale: Locale) { - B.line1.text = locale.displayName - B.line2.text = locale.getDisplayLanguage(locale) + binding.line1.text = locale.displayName + binding.line2.text = locale.getDisplayLanguage(locale) } @ModelProp fun markChecked(isChecked: Boolean) { - B.checkbox.isChecked = isChecked + binding.checkbox.isChecked = isChecked } @CallbackProp fun checked(onCheckedChangeListener: CompoundButton.OnCheckedChangeListener?) { - B.checkbox.setOnCheckedChangeListener(onCheckedChangeListener) + binding.checkbox.setOnCheckedChangeListener(onCheckedChangeListener) } } diff --git a/app/src/main/java/com/aurora/store/view/epoxy/views/preference/PermissionView.kt b/app/src/main/java/com/aurora/store/view/epoxy/views/preference/PermissionView.kt index a8f146f2e..6528c702c 100644 --- a/app/src/main/java/com/aurora/store/view/epoxy/views/preference/PermissionView.kt +++ b/app/src/main/java/com/aurora/store/view/epoxy/views/preference/PermissionView.kt @@ -21,7 +21,6 @@ package com.aurora.store.view.epoxy.views.preference import android.content.Context import android.util.AttributeSet -import android.widget.RelativeLayout import com.airbnb.epoxy.CallbackProp import com.airbnb.epoxy.ModelProp import com.airbnb.epoxy.ModelView @@ -29,56 +28,38 @@ import com.aurora.extensions.getString import com.aurora.store.R import com.aurora.store.data.model.Permission import com.aurora.store.databinding.ViewPermissionBinding +import com.aurora.store.view.epoxy.views.BaseModel import com.aurora.store.view.epoxy.views.BaseView @ModelView( autoLayout = ModelView.Size.MATCH_WIDTH_WRAP_HEIGHT, - baseModelClass = BaseView::class + baseModelClass = BaseModel::class ) -class PermissionView : RelativeLayout { - - private lateinit var B: ViewPermissionBinding - - constructor(context: Context?) : super(context) { - init(context) - } - - constructor(context: Context?, attrs: AttributeSet?) : super(context, attrs) { - init(context) - } - - constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int) : super( - context, - attrs, - defStyleAttr - ) { - init(context) - } - - private fun init(context: Context?) { - val view = inflate(context, R.layout.view_permission, this) - B = ViewPermissionBinding.bind(view) - } +class PermissionView @JvmOverloads constructor( + context: Context?, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : BaseView(context, attrs, defStyleAttr) { @ModelProp fun permission(installer: Permission) { - B.line1.text = installer.title - B.line2.text = installer.subtitle + binding.line1.text = installer.title + binding.line2.text = installer.subtitle } @ModelProp fun isGranted(granted: Boolean) { if (granted) { - B.btnAction.isEnabled = false - B.btnAction.text = getString(R.string.action_granted) + binding.btnAction.isEnabled = false + binding.btnAction.text = getString(R.string.action_granted) } else { - B.btnAction.isEnabled = true - B.btnAction.text = getString(R.string.action_grant) + binding.btnAction.isEnabled = true + binding.btnAction.text = getString(R.string.action_grant) } } @CallbackProp fun click(onClickListener: OnClickListener?) { - B.btnAction.setOnClickListener(onClickListener) + binding.btnAction.setOnClickListener(onClickListener) } } diff --git a/app/src/main/java/com/aurora/store/view/epoxy/views/shimmer/AppListViewShimmer.kt b/app/src/main/java/com/aurora/store/view/epoxy/views/shimmer/AppListViewShimmer.kt index e3c3a04a1..58baf31cf 100644 --- a/app/src/main/java/com/aurora/store/view/epoxy/views/shimmer/AppListViewShimmer.kt +++ b/app/src/main/java/com/aurora/store/view/epoxy/views/shimmer/AppListViewShimmer.kt @@ -22,37 +22,16 @@ package com.aurora.store.view.epoxy.views.shimmer import android.content.Context import android.util.AttributeSet import com.airbnb.epoxy.ModelView -import com.aurora.store.R import com.aurora.store.databinding.ViewAppListShimmerBinding +import com.aurora.store.view.epoxy.views.BaseModel import com.aurora.store.view.epoxy.views.BaseView -import com.facebook.shimmer.ShimmerFrameLayout @ModelView( autoLayout = ModelView.Size.WRAP_WIDTH_WRAP_HEIGHT, - baseModelClass = BaseView::class + baseModelClass = BaseModel::class ) -class AppListViewShimmer : ShimmerFrameLayout { - - private lateinit var B: ViewAppListShimmerBinding - - constructor(context: Context?) : super(context) { - init(context) - } - - constructor(context: Context?, attrs: AttributeSet?) : super(context, attrs) { - init(context) - } - - constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int) : super( - context, - attrs, - defStyleAttr - ) { - init(context) - } - - private fun init(context: Context?) { - val view = inflate(context, R.layout.view_app_list_shimmer, this) - B = ViewAppListShimmerBinding.bind(view) - } -} +class AppListViewShimmer @JvmOverloads constructor( + context: Context?, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : BaseView(context, attrs, defStyleAttr) diff --git a/app/src/main/java/com/aurora/store/view/epoxy/views/shimmer/AppViewShimmer.kt b/app/src/main/java/com/aurora/store/view/epoxy/views/shimmer/AppViewShimmer.kt index 43e19a038..79ad12368 100644 --- a/app/src/main/java/com/aurora/store/view/epoxy/views/shimmer/AppViewShimmer.kt +++ b/app/src/main/java/com/aurora/store/view/epoxy/views/shimmer/AppViewShimmer.kt @@ -22,37 +22,16 @@ package com.aurora.store.view.epoxy.views.shimmer import android.content.Context import android.util.AttributeSet import com.airbnb.epoxy.ModelView -import com.aurora.store.R import com.aurora.store.databinding.ViewAppShimmerBinding +import com.aurora.store.view.epoxy.views.BaseModel import com.aurora.store.view.epoxy.views.BaseView -import com.facebook.shimmer.ShimmerFrameLayout @ModelView( autoLayout = ModelView.Size.WRAP_WIDTH_WRAP_HEIGHT, - baseModelClass = BaseView::class + baseModelClass = BaseModel::class ) -class AppViewShimmer : ShimmerFrameLayout { - - private lateinit var B: ViewAppShimmerBinding - - constructor(context: Context?) : super(context) { - init(context) - } - - constructor(context: Context?, attrs: AttributeSet?) : super(context, attrs) { - init(context) - } - - constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int) : super( - context, - attrs, - defStyleAttr - ) { - init(context) - } - - private fun init(context: Context?) { - val view = inflate(context, R.layout.view_app_shimmer, this) - B = ViewAppShimmerBinding.bind(view) - } -} +class AppViewShimmer @JvmOverloads constructor( + context: Context?, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : BaseView(context, attrs, defStyleAttr) diff --git a/app/src/main/java/com/aurora/store/view/epoxy/views/shimmer/HeaderViewShimmer.kt b/app/src/main/java/com/aurora/store/view/epoxy/views/shimmer/HeaderViewShimmer.kt index 02ab7378f..ed8479d78 100644 --- a/app/src/main/java/com/aurora/store/view/epoxy/views/shimmer/HeaderViewShimmer.kt +++ b/app/src/main/java/com/aurora/store/view/epoxy/views/shimmer/HeaderViewShimmer.kt @@ -22,37 +22,16 @@ package com.aurora.store.view.epoxy.views.shimmer import android.content.Context import android.util.AttributeSet import com.airbnb.epoxy.ModelView -import com.aurora.store.R import com.aurora.store.databinding.ViewHeaderShimmerBinding +import com.aurora.store.view.epoxy.views.BaseModel import com.aurora.store.view.epoxy.views.BaseView -import com.facebook.shimmer.ShimmerFrameLayout @ModelView( autoLayout = ModelView.Size.WRAP_WIDTH_WRAP_HEIGHT, - baseModelClass = BaseView::class + baseModelClass = BaseModel::class ) -class HeaderViewShimmer : ShimmerFrameLayout { - - private lateinit var B: ViewHeaderShimmerBinding - - constructor(context: Context?) : super(context) { - init(context) - } - - constructor(context: Context?, attrs: AttributeSet?) : super(context, attrs) { - init(context) - } - - constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int) : super( - context, - attrs, - defStyleAttr - ) { - init(context) - } - - private fun init(context: Context?) { - val view = inflate(context, R.layout.view_header_shimmer, this) - B = ViewHeaderShimmerBinding.bind(view) - } -} +class HeaderViewShimmer @JvmOverloads constructor( + context: Context?, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : BaseView(context, attrs, defStyleAttr) diff --git a/app/src/main/java/com/aurora/store/view/ui/all/AppsGamesFragment.kt b/app/src/main/java/com/aurora/store/view/ui/all/AppsGamesFragment.kt index c6db2050d..a4b118032 100644 --- a/app/src/main/java/com/aurora/store/view/ui/all/AppsGamesFragment.kt +++ b/app/src/main/java/com/aurora/store/view/ui/all/AppsGamesFragment.kt @@ -29,7 +29,7 @@ import androidx.navigation.fragment.findNavController import androidx.viewpager2.adapter.FragmentStateAdapter import com.aurora.store.R import com.aurora.store.data.providers.AuthProvider -import com.aurora.store.databinding.ActivityGenericPagerBinding +import com.aurora.store.databinding.FragmentGenericWithPagerBinding import com.aurora.store.view.ui.commons.BaseFragment import com.google.android.material.tabs.TabLayout import com.google.android.material.tabs.TabLayoutMediator @@ -37,7 +37,7 @@ import dagger.hilt.android.AndroidEntryPoint import javax.inject.Inject @AndroidEntryPoint -class AppsGamesFragment : BaseFragment() { +class AppsGamesFragment : BaseFragment() { @Inject lateinit var authProvider: AuthProvider diff --git a/app/src/main/java/com/aurora/store/view/ui/commons/BaseFragment.kt b/app/src/main/java/com/aurora/store/view/ui/commons/BaseFragment.kt index 9a459a7fb..454460917 100644 --- a/app/src/main/java/com/aurora/store/view/ui/commons/BaseFragment.kt +++ b/app/src/main/java/com/aurora/store/view/ui/commons/BaseFragment.kt @@ -40,6 +40,7 @@ abstract class BaseFragment : Fragment() { private var _binding: ViewBindingType? = null protected val binding get() = _binding!! + @Suppress("UNCHECKED_CAST") override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? diff --git a/app/src/main/java/com/aurora/store/view/ui/commons/BlacklistFragment.kt b/app/src/main/java/com/aurora/store/view/ui/commons/BlacklistFragment.kt index 792c53f68..4354117d5 100644 --- a/app/src/main/java/com/aurora/store/view/ui/commons/BlacklistFragment.kt +++ b/app/src/main/java/com/aurora/store/view/ui/commons/BlacklistFragment.kt @@ -27,7 +27,7 @@ import androidx.navigation.fragment.findNavController import com.aurora.gplayapi.data.models.App import com.aurora.store.R import com.aurora.store.data.providers.BlacklistProvider -import com.aurora.store.databinding.ActivityGenericRecyclerBinding +import com.aurora.store.databinding.FragmentGenericWithToolbarBinding import com.aurora.store.view.epoxy.views.BlackListViewModel_ import com.aurora.store.view.epoxy.views.shimmer.AppListViewShimmerModel_ import com.aurora.store.viewmodel.all.BlacklistViewModel @@ -35,7 +35,7 @@ import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.launch @AndroidEntryPoint -class BlacklistFragment : BaseFragment() { +class BlacklistFragment : BaseFragment() { private val viewModel: BlacklistViewModel by activityViewModels() private lateinit var blacklistProvider: BlacklistProvider diff --git a/app/src/main/java/com/aurora/store/view/ui/commons/CategoryBrowseFragment.kt b/app/src/main/java/com/aurora/store/view/ui/commons/CategoryBrowseFragment.kt index 3e12af5c1..d54f0baa9 100644 --- a/app/src/main/java/com/aurora/store/view/ui/commons/CategoryBrowseFragment.kt +++ b/app/src/main/java/com/aurora/store/view/ui/commons/CategoryBrowseFragment.kt @@ -30,7 +30,7 @@ import com.aurora.gplayapi.data.models.StreamCluster import com.aurora.gplayapi.helpers.contracts.StreamContract import com.aurora.store.data.model.ViewState import com.aurora.store.data.model.ViewState.Loading.getDataAs -import com.aurora.store.databinding.ActivityGenericRecyclerBinding +import com.aurora.store.databinding.FragmentGenericWithToolbarBinding import com.aurora.store.view.custom.recycler.EndlessRecyclerOnScrollListener import com.aurora.store.view.epoxy.controller.CategoryCarouselController import com.aurora.store.view.epoxy.controller.GenericCarouselController @@ -38,7 +38,7 @@ import com.aurora.store.viewmodel.subcategory.SubCategoryClusterViewModel import dagger.hilt.android.AndroidEntryPoint @AndroidEntryPoint -class CategoryBrowseFragment : BaseFragment(), +class CategoryBrowseFragment : BaseFragment(), GenericCarouselController.Callbacks { private val args: CategoryBrowseFragmentArgs by navArgs() private val viewModel: SubCategoryClusterViewModel by activityViewModels() diff --git a/app/src/main/java/com/aurora/store/view/ui/commons/EditorStreamBrowseFragment.kt b/app/src/main/java/com/aurora/store/view/ui/commons/EditorStreamBrowseFragment.kt index 6877950c7..5f1a4371a 100644 --- a/app/src/main/java/com/aurora/store/view/ui/commons/EditorStreamBrowseFragment.kt +++ b/app/src/main/java/com/aurora/store/view/ui/commons/EditorStreamBrowseFragment.kt @@ -26,7 +26,7 @@ import androidx.navigation.fragment.findNavController import androidx.navigation.fragment.navArgs import com.airbnb.epoxy.EpoxyModel import com.aurora.gplayapi.data.models.App -import com.aurora.store.databinding.ActivityGenericRecyclerBinding +import com.aurora.store.databinding.FragmentGenericWithToolbarBinding import com.aurora.store.view.epoxy.groups.CarouselHorizontalModel_ import com.aurora.store.view.epoxy.views.EditorHeadViewModel_ import com.aurora.store.view.epoxy.views.HorizontalDividerViewModel_ @@ -38,7 +38,7 @@ import com.aurora.store.viewmodel.editorschoice.EditorBrowseViewModel import dagger.hilt.android.AndroidEntryPoint @AndroidEntryPoint -class EditorStreamBrowseFragment : BaseFragment() { +class EditorStreamBrowseFragment : BaseFragment() { private val args: EditorStreamBrowseFragmentArgs by navArgs() private val viewModel: EditorBrowseViewModel by viewModels() diff --git a/app/src/main/java/com/aurora/store/view/ui/commons/ExpandedStreamBrowseFragment.kt b/app/src/main/java/com/aurora/store/view/ui/commons/ExpandedStreamBrowseFragment.kt index e5d60c9cb..c9dd317b4 100644 --- a/app/src/main/java/com/aurora/store/view/ui/commons/ExpandedStreamBrowseFragment.kt +++ b/app/src/main/java/com/aurora/store/view/ui/commons/ExpandedStreamBrowseFragment.kt @@ -26,7 +26,7 @@ import androidx.navigation.fragment.findNavController import androidx.navigation.fragment.navArgs import com.airbnb.epoxy.EpoxyModel import com.aurora.gplayapi.data.models.StreamCluster -import com.aurora.store.databinding.ActivityGenericRecyclerBinding +import com.aurora.store.databinding.FragmentGenericWithToolbarBinding import com.aurora.store.view.custom.recycler.EndlessRecyclerOnScrollListener import com.aurora.store.view.epoxy.groups.CarouselHorizontalModel_ import com.aurora.store.view.epoxy.views.AppProgressViewModel_ @@ -38,7 +38,7 @@ import com.aurora.store.viewmodel.browse.ExpandedStreamBrowseViewModel import dagger.hilt.android.AndroidEntryPoint @AndroidEntryPoint -class ExpandedStreamBrowseFragment : BaseFragment() { +class ExpandedStreamBrowseFragment : BaseFragment() { private val args: ExpandedStreamBrowseFragmentArgs by navArgs() private val viewModel: ExpandedStreamBrowseViewModel by viewModels() diff --git a/app/src/main/java/com/aurora/store/view/ui/commons/StreamBrowseFragment.kt b/app/src/main/java/com/aurora/store/view/ui/commons/StreamBrowseFragment.kt index d50409052..a42ee51dc 100644 --- a/app/src/main/java/com/aurora/store/view/ui/commons/StreamBrowseFragment.kt +++ b/app/src/main/java/com/aurora/store/view/ui/commons/StreamBrowseFragment.kt @@ -25,7 +25,7 @@ import androidx.fragment.app.viewModels import androidx.navigation.fragment.findNavController import androidx.navigation.fragment.navArgs import com.aurora.gplayapi.data.models.StreamCluster -import com.aurora.store.databinding.ActivityGenericRecyclerBinding +import com.aurora.store.databinding.FragmentGenericWithToolbarBinding import com.aurora.store.view.custom.recycler.EndlessRecyclerOnScrollListener import com.aurora.store.view.epoxy.views.AppProgressViewModel_ import com.aurora.store.view.epoxy.views.app.AppListViewModel_ @@ -34,7 +34,7 @@ import com.aurora.store.viewmodel.browse.StreamBrowseViewModel import dagger.hilt.android.AndroidEntryPoint @AndroidEntryPoint -class StreamBrowseFragment : BaseFragment() { +class StreamBrowseFragment : BaseFragment() { private val args: StreamBrowseFragmentArgs by navArgs() private val viewModel: StreamBrowseViewModel by viewModels() diff --git a/app/src/main/java/com/aurora/store/view/ui/details/DetailsExodusFragment.kt b/app/src/main/java/com/aurora/store/view/ui/details/DetailsExodusFragment.kt index 826b60ff4..d5cec2113 100644 --- a/app/src/main/java/com/aurora/store/view/ui/details/DetailsExodusFragment.kt +++ b/app/src/main/java/com/aurora/store/view/ui/details/DetailsExodusFragment.kt @@ -21,7 +21,6 @@ package com.aurora.store.view.ui.details import android.os.Bundle import android.view.View -import androidx.fragment.app.Fragment import androidx.navigation.fragment.findNavController import androidx.navigation.fragment.navArgs import com.aurora.Constants @@ -29,8 +28,7 @@ import com.aurora.extensions.browse import com.aurora.store.R import com.aurora.store.data.model.ExodusTracker import com.aurora.store.data.model.Report -import com.aurora.store.databinding.ActivityGenericPagerBinding -import com.aurora.store.databinding.ActivityGenericRecyclerBinding +import com.aurora.store.databinding.FragmentGenericWithToolbarBinding import com.aurora.store.view.epoxy.views.HeaderViewModel_ import com.aurora.store.view.epoxy.views.details.ExodusViewModel_ import com.aurora.store.view.ui.commons.BaseFragment @@ -39,7 +37,7 @@ import org.json.JSONObject import javax.inject.Inject @AndroidEntryPoint -class DetailsExodusFragment : BaseFragment() { +class DetailsExodusFragment : BaseFragment() { private val args: DetailsExodusFragmentArgs by navArgs() diff --git a/app/src/main/java/com/aurora/store/view/ui/details/DevAppsFragment.kt b/app/src/main/java/com/aurora/store/view/ui/details/DevAppsFragment.kt index 26d9b9914..1773d32d8 100644 --- a/app/src/main/java/com/aurora/store/view/ui/details/DevAppsFragment.kt +++ b/app/src/main/java/com/aurora/store/view/ui/details/DevAppsFragment.kt @@ -25,8 +25,7 @@ import androidx.fragment.app.viewModels import androidx.navigation.fragment.findNavController import androidx.navigation.fragment.navArgs import com.aurora.gplayapi.data.models.SearchBundle -import com.aurora.store.R -import com.aurora.store.databinding.ActivityGenericRecyclerBinding +import com.aurora.store.databinding.FragmentGenericWithToolbarBinding import com.aurora.store.view.custom.recycler.EndlessRecyclerOnScrollListener import com.aurora.store.view.epoxy.views.AppProgressViewModel_ import com.aurora.store.view.epoxy.views.app.AppListViewModel_ @@ -35,7 +34,7 @@ import com.aurora.store.viewmodel.search.SearchResultViewModel import dagger.hilt.android.AndroidEntryPoint @AndroidEntryPoint -class DevAppsFragment : BaseFragment() { +class DevAppsFragment : BaseFragment() { private val args: DevAppsFragmentArgs by navArgs() private val viewModel: SearchResultViewModel by viewModels() @@ -73,15 +72,15 @@ class DevAppsFragment : BaseFragment() { searchBundle.appList .filter { it.displayName.isNotEmpty() } .forEach { app -> - add( - AppListViewModel_() - .id(app.id) - .app(app) - .click(View.OnClickListener { - openDetailsFragment(app.packageName, app) - }) - ) - } + add( + AppListViewModel_() + .id(app.id) + .app(app) + .click(View.OnClickListener { + openDetailsFragment(app.packageName, app) + }) + ) + } if (searchBundle.subBundles.isNotEmpty()) { add( diff --git a/app/src/main/java/com/aurora/store/view/ui/sale/AppSalesFragment.kt b/app/src/main/java/com/aurora/store/view/ui/sale/AppSalesFragment.kt index 0f0619ba6..dc03a3316 100644 --- a/app/src/main/java/com/aurora/store/view/ui/sale/AppSalesFragment.kt +++ b/app/src/main/java/com/aurora/store/view/ui/sale/AppSalesFragment.kt @@ -24,7 +24,7 @@ import android.view.View import androidx.fragment.app.viewModels import androidx.navigation.fragment.findNavController import com.aurora.store.R -import com.aurora.store.databinding.ActivityGenericRecyclerBinding +import com.aurora.store.databinding.FragmentGenericWithToolbarBinding import com.aurora.store.view.custom.recycler.EndlessRecyclerOnScrollListener import com.aurora.store.view.epoxy.views.AppProgressViewModel_ import com.aurora.store.view.epoxy.views.HeaderViewModel_ @@ -37,7 +37,7 @@ import com.aurora.store.viewmodel.sale.AppSalesViewModel import dagger.hilt.android.AndroidEntryPoint @AndroidEntryPoint -class AppSalesFragment : BaseFragment() { +class AppSalesFragment : BaseFragment() { private val viewModel: AppSalesViewModel by viewModels() diff --git a/app/src/main/java/com/aurora/store/view/ui/sheets/BaseDialogSheet.kt b/app/src/main/java/com/aurora/store/view/ui/sheets/BaseDialogSheet.kt index dd2b5bc23..6ae4c8bbd 100644 --- a/app/src/main/java/com/aurora/store/view/ui/sheets/BaseDialogSheet.kt +++ b/app/src/main/java/com/aurora/store/view/ui/sheets/BaseDialogSheet.kt @@ -33,6 +33,7 @@ abstract class BaseDialogSheet : BottomSheetDialo private var _binding: ViewBindingType? = null protected val binding get() = _binding!! + @Suppress("UNCHECKED_CAST") override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, diff --git a/app/src/main/java/com/aurora/store/view/ui/sheets/PermissionBottomSheet.kt b/app/src/main/java/com/aurora/store/view/ui/sheets/PermissionBottomSheet.kt index 06bdb5976..75b447800 100644 --- a/app/src/main/java/com/aurora/store/view/ui/sheets/PermissionBottomSheet.kt +++ b/app/src/main/java/com/aurora/store/view/ui/sheets/PermissionBottomSheet.kt @@ -23,7 +23,6 @@ import android.content.pm.PackageManager import android.content.pm.PermissionInfo import android.os.Bundle import android.view.View -import android.widget.LinearLayout import androidx.navigation.fragment.navArgs import com.aurora.extensions.hide import com.aurora.extensions.show @@ -53,8 +52,7 @@ class PermissionBottomSheet : BaseDialogSheet() { emptyList() } - val permissionGroupWidgets: MutableMap = - HashMap() + val permissionGroupWidgets: MutableMap = mutableMapOf() for (permissionName in args.app.permissions) { val permissionInfo = getPermissionInfo(permissionName) ?: continue @@ -64,12 +62,7 @@ class PermissionBottomSheet : BaseDialogSheet() { if (permissionGroupWidgets.containsKey(permissionGroupInfo.name)) { permissionGroup = permissionGroupWidgets[permissionGroupInfo.name] } else { - permissionGroup = PermissionGroup(context) - permissionGroup.setPermissionGroupInfo(permissionGroupInfo) - permissionGroup.layoutParams = LinearLayout.LayoutParams( - LinearLayout.LayoutParams.WRAP_CONTENT, - LinearLayout.LayoutParams.WRAP_CONTENT - ) + permissionGroup = PermissionGroup(context, permissionGroupInfo) permissionGroupWidgets[permissionGroupInfo.name] = permissionGroup } diff --git a/app/src/main/java/com/aurora/store/view/ui/spoof/SpoofFragment.kt b/app/src/main/java/com/aurora/store/view/ui/spoof/SpoofFragment.kt index 09544b79e..805418f8a 100644 --- a/app/src/main/java/com/aurora/store/view/ui/spoof/SpoofFragment.kt +++ b/app/src/main/java/com/aurora/store/view/ui/spoof/SpoofFragment.kt @@ -34,7 +34,7 @@ import androidx.viewpager2.adapter.FragmentStateAdapter import com.aurora.extensions.toast import com.aurora.store.R import com.aurora.store.data.providers.NativeDeviceInfoProvider -import com.aurora.store.databinding.ActivityGenericPagerBinding +import com.aurora.store.databinding.FragmentGenericWithPagerBinding import com.aurora.store.util.PathUtil import com.aurora.store.view.ui.commons.BaseFragment import com.google.android.material.tabs.TabLayout @@ -42,7 +42,7 @@ import com.google.android.material.tabs.TabLayoutMediator import dagger.hilt.android.AndroidEntryPoint @AndroidEntryPoint -class SpoofFragment : BaseFragment() { +class SpoofFragment : BaseFragment() { private val TAG = SpoofFragment::class.java.simpleName // Android is weird, even if export device config with proper mime type, it will refuse to open diff --git a/app/src/main/res/layout/activity_generic_pager.xml b/app/src/main/res/layout/fragment_generic_with_pager.xml similarity index 100% rename from app/src/main/res/layout/activity_generic_pager.xml rename to app/src/main/res/layout/fragment_generic_with_pager.xml diff --git a/app/src/main/res/layout/activity_generic_recycler.xml b/app/src/main/res/layout/fragment_generic_with_toolbar.xml similarity index 100% rename from app/src/main/res/layout/activity_generic_recycler.xml rename to app/src/main/res/layout/fragment_generic_with_toolbar.xml diff --git a/app/src/main/res/navigation/mobile_navigation.xml b/app/src/main/res/navigation/mobile_navigation.xml index 3a50e356f..e3621f9fa 100644 --- a/app/src/main/res/navigation/mobile_navigation.xml +++ b/app/src/main/res/navigation/mobile_navigation.xml @@ -77,27 +77,27 @@ android:id="@+id/appsGamesFragment" android:name="com.aurora.store.view.ui.all.AppsGamesFragment" android:label="@string/title_apps_games" - tools:layout="@layout/activity_generic_pager" /> + tools:layout="@layout/fragment_generic_with_pager" /> + tools:layout="@layout/fragment_generic_with_toolbar" /> + tools:layout="@layout/fragment_generic_with_pager" /> + tools:layout="@layout/fragment_generic_with_toolbar" /> + tools:layout="@layout/fragment_generic_with_toolbar" /> + tools:layout="@layout/fragment_generic_with_toolbar" > @@ -223,7 +223,7 @@ + tools:layout="@layout/fragment_generic_with_toolbar" > + tools:layout="@layout/fragment_generic_with_toolbar" > + tools:layout="@layout/fragment_generic_with_toolbar" > @@ -282,7 +282,7 @@ + tools:layout="@layout/fragment_generic_with_toolbar" > @@ -308,7 +308,7 @@ + tools:layout="@layout/fragment_generic_with_toolbar" >