Improve viewbinding - [3/3]

This commit is contained in:
Rahul Patel
2024-07-11 02:18:42 +05:30
committed by Aayush Gupta
parent 4919fbd4db
commit 7110a4a77b
63 changed files with 633 additions and 1396 deletions

View File

@@ -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
}
}

View File

@@ -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)
}
}

View File

@@ -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()
}
}

View File

@@ -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<String, String> = 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<ImageView>(R.id.img)
imageView.setImageDrawable(getPermissionGroupIcon(permissionGroupInfo))
//imageView.setColorFilter(getContext().getStyledAttributeColor(imageView.getContext(), android.R.attr.colorAccent));
val imageView = findViewById<ImageView>(R.id.img)
imageView.setImageDrawable(getPermissionGroupIcon(permissionGroupInfo))
}
}
fun addPermission(permissionInfo: PermissionInfo, currentPerms: List<String> = 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())
}
}
}

View File

@@ -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)
}
}

View File

@@ -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)
}
}

View File

@@ -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)
}
}

View File

@@ -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()
) {

View File

@@ -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<ViewAppProgressBinding>(context, attrs, defStyleAttr)

View File

@@ -0,0 +1,50 @@
/*
* Aurora Store
* Copyright (C) 2021, Rahul Kumar Patel <whyorean@gmail.com>
*
* 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 <http://www.gnu.org/licenses/>.
*
*/
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<T : View> : EpoxyModel<T>() {
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()
}
}
}
}

View File

@@ -1,50 +1,51 @@
/*
* Aurora Store
* Copyright (C) 2021, Rahul Kumar Patel <whyorean@gmail.com>
*
* 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 <http://www.gnu.org/licenses/>.
*
*/
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<T : View> : EpoxyModel<T>() {
abstract class BaseView<ViewBindingType : ViewBinding> : 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<ViewBindingType>
val method = type.getMethod(
"inflate",
LayoutInflater::class.java,
ViewGroup::class.java,
Boolean::class.java
)
return method.invoke(null, inflater, this, false) as ViewBindingType
}
}
}

View File

@@ -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<ViewBlackBinding>(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)
}
}

View File

@@ -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<ViewCategoryBinding>(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)
}
}

View File

@@ -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<ViewDispenserBinding>(context, attrs, defStyleAttr) {
@ModelProp
fun url(url: String) {

View File

@@ -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<ViewDownloadBinding>(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)
}
}

View File

@@ -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<ViewEditorHeadBinding>(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
}
}

View File

@@ -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<ViewEditorImageBinding>(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)
}
}

View File

@@ -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<ViewFavBinding>(context, attrs, defStyleAttr) {
@ModelProp
fun favourite(favourite: Favourite) {

View File

@@ -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<ViewHeaderBinding>(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
}
}

View File

@@ -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<ViewDividerBinding>(context, attrs, defStyleAttr)

View File

@@ -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<ViewActionHeaderBinding>(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
}
}

View File

@@ -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<ViewSearchSuggestionBinding>(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)
}
}

View File

@@ -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<ViewHeaderUpdateBinding>(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
}
}

View File

@@ -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<ViewAppListBinding>(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<String> = 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)
}
}

View File

@@ -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<ViewAppUpdateBinding>(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()
}
}

View File

@@ -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<ViewAppBinding>(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)
}
}

View File

@@ -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<ViewNoAppAltBinding>(context, attrs, defStyleAttr) {
@ModelProp
fun message(message: String) {
B.txtMsg.text = message
binding.txtMsg.text = message
}
}

View File

@@ -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<ViewNoAppBinding>(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))
}
}
}

View File

@@ -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<ViewAppDependentBinding>(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)
}
}

View File

@@ -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<ViewBadgeBinding>(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)
}
}
}

View File

@@ -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<ViewExodusBinding>(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

View File

@@ -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<ViewFileBinding>(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)
}
}

View File

@@ -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<ViewInfoBinding>(context, attrs, defStyleAttr) {
@ModelProp(options = [ModelProp.Option.IgnoreRequireHashCode])
fun badge(info: Map.Entry<String, String>) {
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
}
}

View File

@@ -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<ViewScreenshotLargeBinding>(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)
}
}

View File

@@ -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<ViewScreenshotMiniBinding>(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)
}
}

View File

@@ -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<ViewMoreBadgeBinding>(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)
}
}

View File

@@ -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<ViewReviewBinding>(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)
}
}

View File

@@ -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<ViewScreenshotBinding>(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)
}
}

View File

@@ -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<ViewDashBinding>(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)
}
}

View File

@@ -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<ViewDeviceBinding>(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)
}
}

View File

@@ -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<ViewInstallerBinding>(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)
}
}

View File

@@ -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<ViewLinkBinding>(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)
}
}

View File

@@ -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<ViewLocaleBinding>(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)
}
}

View File

@@ -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<ViewPermissionBinding>(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)
}
}

View File

@@ -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<ViewAppListShimmerBinding>(context, attrs, defStyleAttr)

View File

@@ -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<ViewAppShimmerBinding>(context, attrs, defStyleAttr)

View File

@@ -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<ViewHeaderShimmerBinding>(context, attrs, defStyleAttr)

View File

@@ -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<ActivityGenericPagerBinding>() {
class AppsGamesFragment : BaseFragment<FragmentGenericWithPagerBinding>() {
@Inject
lateinit var authProvider: AuthProvider

View File

@@ -40,6 +40,7 @@ abstract class BaseFragment<ViewBindingType : ViewBinding> : Fragment() {
private var _binding: ViewBindingType? = null
protected val binding get() = _binding!!
@Suppress("UNCHECKED_CAST")
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?

View File

@@ -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<ActivityGenericRecyclerBinding>() {
class BlacklistFragment : BaseFragment<FragmentGenericWithToolbarBinding>() {
private val viewModel: BlacklistViewModel by activityViewModels()
private lateinit var blacklistProvider: BlacklistProvider

View File

@@ -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<ActivityGenericRecyclerBinding>(),
class CategoryBrowseFragment : BaseFragment<FragmentGenericWithToolbarBinding>(),
GenericCarouselController.Callbacks {
private val args: CategoryBrowseFragmentArgs by navArgs()
private val viewModel: SubCategoryClusterViewModel by activityViewModels()

View File

@@ -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<ActivityGenericRecyclerBinding>() {
class EditorStreamBrowseFragment : BaseFragment<FragmentGenericWithToolbarBinding>() {
private val args: EditorStreamBrowseFragmentArgs by navArgs()
private val viewModel: EditorBrowseViewModel by viewModels()

View File

@@ -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<ActivityGenericRecyclerBinding>() {
class ExpandedStreamBrowseFragment : BaseFragment<FragmentGenericWithToolbarBinding>() {
private val args: ExpandedStreamBrowseFragmentArgs by navArgs()
private val viewModel: ExpandedStreamBrowseViewModel by viewModels()

View File

@@ -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<ActivityGenericRecyclerBinding>() {
class StreamBrowseFragment : BaseFragment<FragmentGenericWithToolbarBinding>() {
private val args: StreamBrowseFragmentArgs by navArgs()
private val viewModel: StreamBrowseViewModel by viewModels()

View File

@@ -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<ActivityGenericRecyclerBinding>() {
class DetailsExodusFragment : BaseFragment<FragmentGenericWithToolbarBinding>() {
private val args: DetailsExodusFragmentArgs by navArgs()

View File

@@ -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<ActivityGenericRecyclerBinding>() {
class DevAppsFragment : BaseFragment<FragmentGenericWithToolbarBinding>() {
private val args: DevAppsFragmentArgs by navArgs()
private val viewModel: SearchResultViewModel by viewModels()
@@ -73,15 +72,15 @@ class DevAppsFragment : BaseFragment<ActivityGenericRecyclerBinding>() {
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(

View File

@@ -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<ActivityGenericRecyclerBinding>() {
class AppSalesFragment : BaseFragment<FragmentGenericWithToolbarBinding>() {
private val viewModel: AppSalesViewModel by viewModels()

View File

@@ -33,6 +33,7 @@ abstract class BaseDialogSheet<ViewBindingType : ViewBinding> : BottomSheetDialo
private var _binding: ViewBindingType? = null
protected val binding get() = _binding!!
@Suppress("UNCHECKED_CAST")
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,

View File

@@ -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<SheetPermissionsBinding>() {
emptyList()
}
val permissionGroupWidgets: MutableMap<String, PermissionGroup?> =
HashMap<String, PermissionGroup?>()
val permissionGroupWidgets: MutableMap<String, PermissionGroup?> = mutableMapOf()
for (permissionName in args.app.permissions) {
val permissionInfo = getPermissionInfo(permissionName) ?: continue
@@ -64,12 +62,7 @@ class PermissionBottomSheet : BaseDialogSheet<SheetPermissionsBinding>() {
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
}

View File

@@ -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<ActivityGenericPagerBinding>() {
class SpoofFragment : BaseFragment<FragmentGenericWithPagerBinding>() {
private val TAG = SpoofFragment::class.java.simpleName
// Android is weird, even if export device config with proper mime type, it will refuse to open