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.R
import com.aurora.store.databinding.ViewRatingBinding 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 number = 0
var max = 0 var max = 0
var rating = 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.number = number
this.max = max this.max = max
this.rating = rating this.rating = rating
init(context) 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) { private fun init(context: Context) {
val view = inflate(context, R.layout.view_rating, this) val view = inflate(context, R.layout.view_rating, this)
B = ViewRatingBinding.bind(view) binding = ViewRatingBinding.bind(view)
B.avgNum.text = number.toString() binding.avgNum.text = number.toString()
B.avgRating.max = max binding.avgRating.max = max
B.avgRating.progress = rating binding.avgRating.progress = rating
} }
} }

View File

@@ -28,7 +28,7 @@ import com.aurora.store.databinding.ViewActionHeaderBinding
class ActionHeaderLayout : RelativeLayout { class ActionHeaderLayout : RelativeLayout {
private lateinit var B: ViewActionHeaderBinding private lateinit var binding: ViewActionHeaderBinding
constructor(context: Context) : super(context) { constructor(context: Context) : super(context) {
init(context, null) init(context, null)
@@ -48,22 +48,24 @@ class ActionHeaderLayout : RelativeLayout {
private fun init(context: Context, attrs: AttributeSet?) { private fun init(context: Context, attrs: AttributeSet?) {
val view = inflate(context, R.layout.view_action_header, this) 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 typedArray = context.obtainStyledAttributes(attrs, R.styleable.ActionHeaderLayout)
val textPrimary = typedArray.getString(R.styleable.ActionHeaderLayout_headerTitle) val textPrimary = typedArray.getString(R.styleable.ActionHeaderLayout_headerTitle)
typedArray.recycle()
textPrimary?.let { textPrimary?.let {
B.txtTitle.text = it binding.txtTitle.text = it
} }
} }
fun setHeader(header: String?) { fun setHeader(header: String?) {
B.txtTitle.text = header binding.txtTitle.text = header
} }
fun addClickListener(onclickListener: OnClickListener?) { fun addClickListener(onclickListener: OnClickListener?) {
B.imgAction.visibility = View.VISIBLE binding.imgAction.visibility = View.VISIBLE
B.imgAction.setOnClickListener(onclickListener) binding.imgAction.setOnClickListener(onclickListener)
} }
} }

View File

@@ -27,7 +27,7 @@ import com.aurora.store.databinding.ViewDevInfoBinding
class DevInfoLayout : RelativeLayout { class DevInfoLayout : RelativeLayout {
private lateinit var B: ViewDevInfoBinding private lateinit var binding: ViewDevInfoBinding
constructor(context: Context) : super(context) { constructor(context: Context) : super(context) {
init(context, null) init(context, null)
@@ -45,18 +45,9 @@ class DevInfoLayout : RelativeLayout {
init(context, attrs) 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?) { private fun init(context: Context, attrs: AttributeSet?) {
val view = inflate(context, R.layout.view_dev_info, this) 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 typedArray = context.obtainStyledAttributes(attrs, R.styleable.DevInfoLayout)
val icon = typedArray.getResourceId( val icon = typedArray.getResourceId(
@@ -67,14 +58,14 @@ class DevInfoLayout : RelativeLayout {
val textPrimary = typedArray.getString(R.styleable.DevInfoLayout_txtTitle) val textPrimary = typedArray.getString(R.styleable.DevInfoLayout_txtTitle)
val textSecondary = typedArray.getString(R.styleable.DevInfoLayout_txtSubtitle) val textSecondary = typedArray.getString(R.styleable.DevInfoLayout_txtSubtitle)
B.img.setImageResource(icon) binding.img.setImageResource(icon)
B.txtTitle.text = textPrimary binding.txtTitle.text = textPrimary
B.txtSubtitle.text = textSecondary binding.txtSubtitle.text = textSecondary
typedArray.recycle() typedArray.recycle()
} }
fun setTxtSubtitle(text: String?) { fun setTxtSubtitle(text: String?) {
B.txtSubtitle.text = text binding.txtSubtitle.text = text
invalidate() invalidate()
} }
} }

View File

@@ -33,48 +33,32 @@ import com.aurora.store.R
import com.aurora.store.data.model.PermissionGroupInfo import com.aurora.store.data.model.PermissionGroupInfo
import java.util.Locale 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 permissionGroupInfo: PermissionGroupInfo
private lateinit var packageManager: PackageManager private lateinit var packageManager: PackageManager
private val permissionMap: MutableMap<String, String> = HashMap() private val permissionMap: MutableMap<String, String> = HashMap()
constructor(context: Context?) : super(context) { constructor(context: Context?, permissionGroupInfo: PermissionGroupInfo) : this(context) {
init() if (context != null) {
} inflate(context, R.layout.layout_permission, this)
constructor(context: Context?, attrs: AttributeSet?) : super(context, attrs) { layoutParams = LayoutParams(
init() LayoutParams.WRAP_CONTENT,
} LayoutParams.WRAP_CONTENT
)
constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int) : super( this.packageManager = context.packageManager
context, this.permissionGroupInfo = permissionGroupInfo
attrs,
defStyleAttr
) {
init()
}
constructor( val imageView = findViewById<ImageView>(R.id.img)
context: Context?, imageView.setImageDrawable(getPermissionGroupIcon(permissionGroupInfo))
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));
} }
fun addPermission(permissionInfo: PermissionInfo, currentPerms: List<String> = emptyList()) { fun addPermission(permissionInfo: PermissionInfo, currentPerms: List<String> = emptyList()) {
@@ -166,11 +150,7 @@ class PermissionGroup : LinearLayout {
} }
return label.replaceFirstChar { return label.replaceFirstChar {
if (it.isLowerCase()) { it.titlecase(Locale.getDefault())
it.titlecase(Locale.getDefault())
} else {
it.toString()
}
} }
} }
} }

View File

@@ -32,7 +32,7 @@ import com.aurora.store.databinding.ViewActionButtonBinding
class ActionButton : RelativeLayout { class ActionButton : RelativeLayout {
private lateinit var B: ViewActionButtonBinding private lateinit var binding: ViewActionButtonBinding
constructor(context: Context) : super(context) { constructor(context: Context) : super(context) {
init(context, null) init(context, null)
@@ -50,18 +50,9 @@ class ActionButton : RelativeLayout {
init(context, attrs) 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?) { private fun init(context: Context, attrs: AttributeSet?) {
val view = inflate(context, R.layout.view_action_button, this) 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 typedArray = context.obtainStyledAttributes(attrs, R.styleable.ActionButton)
val btnTxt = typedArray.getString(R.styleable.ActionButton_btnActionText) val btnTxt = typedArray.getString(R.styleable.ActionButton_btnActionText)
@@ -87,27 +78,27 @@ class ActionButton : RelativeLayout {
} }
stateBackground?.let { stateBackground?.let {
B.root.background = ContextCompat.getDrawable(context, it) binding.root.background = ContextCompat.getDrawable(context, it)
} }
val stateColor = ContextCompat.getColor(context, btnTxtColor) val stateColor = ContextCompat.getColor(context, btnTxtColor)
B.btn.text = btnTxt binding.btn.text = btnTxt
B.btn.setTextColor(stateColor) binding.btn.setTextColor(stateColor)
B.img.setImageDrawable(ContextCompat.getDrawable(context, stateIcon)) binding.img.setImageDrawable(ContextCompat.getDrawable(context, stateIcon))
B.img.imageTintList = ColorStateList.valueOf(stateColor) binding.img.imageTintList = ColorStateList.valueOf(stateColor)
typedArray.recycle() typedArray.recycle()
} }
fun setText(text: String) { fun setText(text: String) {
B.viewFlipper.displayedChild = 0 binding.viewFlipper.displayedChild = 0
B.btn.text = text binding.btn.text = text
} }
fun setText(text: Int) { fun setText(text: Int) {
B.viewFlipper.displayedChild = 0 binding.viewFlipper.displayedChild = 0
B.btn.text = getString(text) binding.btn.text = getString(text)
} }
fun updateState(state: State) { fun updateState(state: State) {
@@ -118,15 +109,15 @@ class ActionButton : RelativeLayout {
else -> 0 else -> 0
} }
if (B.viewFlipper.displayedChild != displayChild) { if (binding.viewFlipper.displayedChild != displayChild) {
runOnUiThread { runOnUiThread {
B.viewFlipper.displayedChild = displayChild binding.viewFlipper.displayedChild = displayChild
if (displayChild == 2) updateState(State.IDLE) if (displayChild == 2) updateState(State.IDLE)
} }
} }
} }
fun addOnClickListener(onClickListener: OnClickListener?) { 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 { class StateButton : RelativeLayout {
private lateinit var B: ViewStateButtonBinding private lateinit var binding: ViewStateButtonBinding
constructor(context: Context) : super(context) { constructor(context: Context) : super(context) {
init(context, null) init(context, null)
@@ -47,18 +47,9 @@ class StateButton : RelativeLayout {
init(context, attrs) 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?) { private fun init(context: Context, attrs: AttributeSet?) {
val view = inflate(context, R.layout.view_state_button, this) 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 typedArray = context.obtainStyledAttributes(attrs, R.styleable.StateButton)
val btnTxt = typedArray.getString(R.styleable.StateButton_btnStateText) val btnTxt = typedArray.getString(R.styleable.StateButton_btnStateText)
@@ -67,20 +58,20 @@ class StateButton : RelativeLayout {
R.drawable.ic_arrow_right R.drawable.ic_arrow_right
) )
B.btn.text = btnTxt binding.btn.text = btnTxt
B.btn.icon = ContextCompat.getDrawable(context, btnIcon) binding.btn.icon = ContextCompat.getDrawable(context, btnIcon)
typedArray.recycle() typedArray.recycle()
} }
fun updateProgress(isVisible: Boolean) { fun updateProgress(isVisible: Boolean) {
if (isVisible) if (isVisible)
B.progress.visibility = View.VISIBLE binding.progress.visibility = View.VISIBLE
else else
B.progress.visibility = View.INVISIBLE binding.progress.visibility = View.INVISIBLE
} }
fun addOnClickListener(onClickListener: OnClickListener) { 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 { class UpdateButton : RelativeLayout {
private lateinit var B: ViewUpdateButtonBinding private lateinit var binding: ViewUpdateButtonBinding
constructor(context: Context) : super(context) { constructor(context: Context) : super(context) {
init(context) init(context)
@@ -48,49 +48,41 @@ class UpdateButton : RelativeLayout {
init(context) init(context)
} }
constructor(
context: Context,
attrs: AttributeSet?,
defStyleAttr: Int,
defStyleRes: Int
) : super(context, attrs, defStyleAttr, defStyleRes) {
init(context)
}
private fun init(context: Context) { private fun init(context: Context) {
val view = inflate(context, R.layout.view_update_button, this) val view = inflate(context, R.layout.view_update_button, this)
B = ViewUpdateButtonBinding.bind(view) binding = ViewUpdateButtonBinding.bind(view)
} }
fun setText(text: String) { fun setText(text: String) {
B.viewFlipper.displayedChild = 0 binding.viewFlipper.displayedChild = 0
B.btnPositive.text = text binding.btnPositive.text = text
} }
fun setText(text: Int) { fun setText(text: Int) {
B.viewFlipper.displayedChild = 0 binding.viewFlipper.displayedChild = 0
B.btnPositive.text = getString(text) binding.btnPositive.text = getString(text)
} }
fun updateState(downloadStatus: DownloadStatus) { fun updateState(downloadStatus: DownloadStatus) {
val displayChild = when (downloadStatus) { val displayChild = when (downloadStatus) {
DownloadStatus.QUEUED, DownloadStatus.QUEUED,
DownloadStatus.DOWNLOADING -> 2 DownloadStatus.DOWNLOADING -> 2
else -> 0 else -> 0
} }
if (B.viewFlipper.displayedChild != displayChild) { if (binding.viewFlipper.displayedChild != displayChild) {
runOnUiThread { runOnUiThread {
B.viewFlipper.displayedChild = displayChild binding.viewFlipper.displayedChild = displayChild
} }
} }
} }
fun addPositiveOnClickListener(onClickListener: OnClickListener?) { fun addPositiveOnClickListener(onClickListener: OnClickListener?) {
B.btnPositive.setOnClickListener(onClickListener) binding.btnPositive.setOnClickListener(onClickListener)
} }
fun addNegativeOnClickListener(onClickListener: 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 com.aurora.store.view.epoxy.views.shimmer.HeaderViewShimmerModel_
import java.util.UUID import java.util.UUID
class CarouselShimmerGroup() : class CarouselShimmerGroup :
EpoxyModelGroup( EpoxyModelGroup(
R.layout.model_carousel_group, buildModels() 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.content.Context
import android.util.AttributeSet import android.util.AttributeSet
import android.widget.RelativeLayout
import com.airbnb.epoxy.ModelView import com.airbnb.epoxy.ModelView
import com.aurora.store.R
import com.aurora.store.databinding.ViewAppProgressBinding import com.aurora.store.databinding.ViewAppProgressBinding
@ModelView(autoLayout = ModelView.Size.WRAP_WIDTH_WRAP_HEIGHT) @ModelView(autoLayout = ModelView.Size.WRAP_WIDTH_WRAP_HEIGHT)
class AppProgressView : RelativeLayout { class AppProgressView @JvmOverloads constructor(
context: Context?,
private lateinit var B: ViewAppProgressBinding attrs: AttributeSet? = null,
defStyleAttr: Int = 0
constructor(context: Context?) : super(context) { ) : BaseView<ViewAppProgressBinding>(context, attrs, defStyleAttr)
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)
}
}

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 package com.aurora.store.view.epoxy.views
import android.view.View import android.content.Context
import android.view.animation.AnimationUtils import android.util.AttributeSet
import com.airbnb.epoxy.EpoxyModel import android.view.LayoutInflater
import com.aurora.store.view.epoxy.views.app.AppListView 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) { private lateinit var _binding: ViewBindingType
super.bind(view) protected val binding get() = _binding
when (view) {
is AppListView -> { constructor(context: Context?) : super(context) {
view.startAnimation( init(context)
AnimationUtils.loadAnimation( }
view.context,
android.R.anim.fade_in 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) { @Suppress("UNCHECKED_CAST")
when (view) { private fun inflateViewBinding(inflater: LayoutInflater): ViewBindingType {
is AppListView -> { val type =
view.clearAnimation() (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.content.Context
import android.util.AttributeSet import android.util.AttributeSet
import android.widget.CompoundButton import android.widget.CompoundButton
import android.widget.RelativeLayout
import coil.load import coil.load
import coil.transform.RoundedCornersTransformation import coil.transform.RoundedCornersTransformation
import com.airbnb.epoxy.CallbackProp import com.airbnb.epoxy.CallbackProp
@@ -34,62 +33,43 @@ import com.aurora.store.databinding.ViewBlackBinding
@ModelView( @ModelView(
autoLayout = ModelView.Size.MATCH_WIDTH_WRAP_HEIGHT, autoLayout = ModelView.Size.MATCH_WIDTH_WRAP_HEIGHT,
baseModelClass = BaseView::class baseModelClass = BaseModel::class
) )
class BlackListView : RelativeLayout { class BlackListView @JvmOverloads constructor(
context: Context?,
private lateinit var B: ViewBlackBinding attrs: AttributeSet? = null,
defStyleAttr: Int = 0
constructor(context: Context?) : super(context) { ) : BaseView<ViewBlackBinding>(context, attrs, defStyleAttr) {
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)
}
@ModelProp @ModelProp
fun app(app: App) { fun app(app: App) {
B.imgIcon.load(app.iconArtwork.url) { binding.imgIcon.load(app.iconArtwork.url) {
placeholder(R.drawable.bg_placeholder) placeholder(R.drawable.bg_placeholder)
transformations(RoundedCornersTransformation(25F)) transformations(RoundedCornersTransformation(25F))
} }
B.txtLine1.text = app.displayName binding.txtLine1.text = app.displayName
B.txtLine2.text = app.packageName binding.txtLine2.text = app.packageName
B.txtLine3.text = ("${app.versionName}.${app.versionCode}") binding.txtLine3.text = ("${app.versionName}.${app.versionCode}")
} }
@ModelProp @ModelProp
fun markChecked(isChecked: Boolean) { fun markChecked(isChecked: Boolean) {
B.checkbox.isChecked = isChecked binding.checkbox.isChecked = isChecked
} }
@CallbackProp @CallbackProp
fun checked(onCheckedChangeListener: CompoundButton.OnCheckedChangeListener?) { fun checked(onCheckedChangeListener: CompoundButton.OnCheckedChangeListener?) {
B.checkbox.setOnCheckedChangeListener(onCheckedChangeListener) binding.checkbox.setOnCheckedChangeListener(onCheckedChangeListener)
} }
@CallbackProp @CallbackProp
fun click(onClickListener: OnClickListener?) { fun click(onClickListener: OnClickListener?) {
B.root.setOnClickListener(onClickListener) binding.root.setOnClickListener(onClickListener)
} }
@CallbackProp @CallbackProp
fun longClick(onClickListener: OnLongClickListener?) { 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.content.Context
import android.util.AttributeSet import android.util.AttributeSet
import android.widget.RelativeLayout
import coil.load import coil.load
import com.airbnb.epoxy.CallbackProp import com.airbnb.epoxy.CallbackProp
import com.airbnb.epoxy.ModelProp import com.airbnb.epoxy.ModelProp
import com.airbnb.epoxy.ModelView import com.airbnb.epoxy.ModelView
import com.aurora.gplayapi.data.models.Category import com.aurora.gplayapi.data.models.Category
import com.aurora.store.R
import com.aurora.store.databinding.ViewCategoryBinding import com.aurora.store.databinding.ViewCategoryBinding
@ModelView( @ModelView(
autoLayout = ModelView.Size.MATCH_WIDTH_WRAP_HEIGHT, autoLayout = ModelView.Size.MATCH_WIDTH_WRAP_HEIGHT,
baseModelClass = BaseView::class baseModelClass = BaseModel::class
) )
class CategoryView : RelativeLayout { class CategoryView @JvmOverloads constructor(
context: Context?,
private lateinit var B: ViewCategoryBinding attrs: AttributeSet? = null,
defStyleAttr: Int = 0
constructor(context: Context?) : super(context) { ) : BaseView<ViewCategoryBinding>(context, attrs, defStyleAttr) {
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)
}
@ModelProp @ModelProp
fun category(category: Category) { fun category(category: Category) {
B.txtName.text = category.title binding.txtName.text = category.title
B.imgBackground.load(category.imageUrl) binding.imgBackground.load(category.imageUrl)
} }
@CallbackProp @CallbackProp
fun click(onClickListener: OnClickListener?) { 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.content.Context
import android.util.AttributeSet import android.util.AttributeSet
import android.widget.RelativeLayout
import com.airbnb.epoxy.CallbackProp import com.airbnb.epoxy.CallbackProp
import com.airbnb.epoxy.ModelProp import com.airbnb.epoxy.ModelProp
import com.airbnb.epoxy.ModelView import com.airbnb.epoxy.ModelView
import com.aurora.store.R
import com.aurora.store.databinding.ViewDispenserBinding import com.aurora.store.databinding.ViewDispenserBinding
@ModelView( @ModelView(
autoLayout = ModelView.Size.MATCH_WIDTH_WRAP_HEIGHT, autoLayout = ModelView.Size.MATCH_WIDTH_WRAP_HEIGHT,
baseModelClass = BaseView::class baseModelClass = BaseModel::class
) )
class DispenserView : RelativeLayout { class DispenserView @JvmOverloads constructor(
context: Context?,
private lateinit var binding: ViewDispenserBinding attrs: AttributeSet? = null,
defStyleAttr: Int = 0
constructor(context: Context?) : super(context) { ) : BaseView<ViewDispenserBinding>(context, attrs, defStyleAttr) {
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)
}
@ModelProp @ModelProp
fun url(url: String) { fun url(url: String) {

View File

@@ -21,7 +21,6 @@ package com.aurora.store.view.epoxy.views
import android.content.Context import android.content.Context
import android.util.AttributeSet import android.util.AttributeSet
import android.widget.RelativeLayout
import coil.load import coil.load
import coil.transform.RoundedCornersTransformation import coil.transform.RoundedCornersTransformation
import com.airbnb.epoxy.CallbackProp import com.airbnb.epoxy.CallbackProp
@@ -37,42 +36,23 @@ import java.util.Locale
@ModelView( @ModelView(
autoLayout = ModelView.Size.MATCH_WIDTH_WRAP_HEIGHT, autoLayout = ModelView.Size.MATCH_WIDTH_WRAP_HEIGHT,
baseModelClass = BaseView::class baseModelClass = BaseModel::class
) )
class DownloadView : RelativeLayout { class DownloadView @JvmOverloads constructor(
context: Context?,
private lateinit var B: ViewDownloadBinding attrs: AttributeSet? = null,
defStyleAttr: Int = 0
constructor(context: Context?) : super(context) { ) : BaseView<ViewDownloadBinding>(context, attrs, defStyleAttr) {
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)
}
@ModelProp @ModelProp
fun download(download: Download) { fun download(download: Download) {
B.imgDownload.load(download.iconURL) { binding.imgDownload.load(download.iconURL) {
placeholder(R.drawable.bg_placeholder) placeholder(R.drawable.bg_placeholder)
transformations(RoundedCornersTransformation(32F)) 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()) .lowercase(Locale.getDefault())
.replaceFirstChar { .replaceFirstChar {
if (it.isLowerCase()) { if (it.isLowerCase()) {
@@ -82,38 +62,38 @@ class DownloadView : RelativeLayout {
} }
} }
B.progressDownload.apply { binding.progressDownload.apply {
progress = download.progress progress = download.progress
isIndeterminate = download.progress <= 0 && !download.isFinished isIndeterminate = download.progress <= 0 && !download.isFinished
} }
B.txtProgress.text = ("${download.progress}%") binding.txtProgress.text = ("${download.progress}%")
B.txtEta.text = getETAString(context, download.timeRemaining) binding.txtEta.text = getETAString(context, download.timeRemaining)
B.txtSpeed.text = getDownloadSpeedString( binding.txtSpeed.text = getDownloadSpeedString(
context, context,
download.speed download.speed
) )
when (download.downloadStatus) { when (download.downloadStatus) {
DownloadStatus.DOWNLOADING, DownloadStatus.QUEUED -> { DownloadStatus.DOWNLOADING, DownloadStatus.QUEUED -> {
B.txtSpeed.visibility = VISIBLE binding.txtSpeed.visibility = VISIBLE
B.txtEta.visibility = VISIBLE binding.txtEta.visibility = VISIBLE
} }
else -> { else -> {
B.txtSpeed.visibility = INVISIBLE binding.txtSpeed.visibility = INVISIBLE
B.txtEta.visibility = INVISIBLE binding.txtEta.visibility = INVISIBLE
} }
} }
} }
@CallbackProp @CallbackProp
fun click(onClickListener: OnClickListener?) { fun click(onClickListener: OnClickListener?) {
B.root.setOnClickListener(onClickListener) binding.root.setOnClickListener(onClickListener)
} }
@CallbackProp @CallbackProp
fun longClick(onClickListener: OnLongClickListener?) { 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.content.Context
import android.util.AttributeSet import android.util.AttributeSet
import android.widget.RelativeLayout
import com.airbnb.epoxy.CallbackProp import com.airbnb.epoxy.CallbackProp
import com.airbnb.epoxy.ModelProp import com.airbnb.epoxy.ModelProp
import com.airbnb.epoxy.ModelView import com.airbnb.epoxy.ModelView
import com.aurora.store.R
import com.aurora.store.databinding.ViewEditorHeadBinding import com.aurora.store.databinding.ViewEditorHeadBinding
@ModelView( @ModelView(
autoLayout = ModelView.Size.MATCH_WIDTH_WRAP_HEIGHT, autoLayout = ModelView.Size.MATCH_WIDTH_WRAP_HEIGHT,
baseModelClass = BaseView::class baseModelClass = BaseModel::class
) )
class EditorHeadView : RelativeLayout { class EditorHeadView @JvmOverloads constructor(
context: Context?,
private lateinit var B: ViewEditorHeadBinding attrs: AttributeSet? = null,
defStyleAttr: Int = 0
constructor(context: Context?) : super(context) { ) : BaseView<ViewEditorHeadBinding>(context, attrs, defStyleAttr) {
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)
}
@CallbackProp @CallbackProp
fun click(onClickListener: OnClickListener?) { fun click(onClickListener: OnClickListener?) {
B.root.setOnClickListener(onClickListener) binding.root.setOnClickListener(onClickListener)
} }
@ModelProp @ModelProp
fun title(title: String) { 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.content.Context
import android.util.AttributeSet import android.util.AttributeSet
import android.widget.RelativeLayout
import coil.load import coil.load
import coil.transform.RoundedCornersTransformation import coil.transform.RoundedCornersTransformation
import com.airbnb.epoxy.CallbackProp import com.airbnb.epoxy.CallbackProp
@@ -29,55 +28,36 @@ import com.airbnb.epoxy.ModelProp
import com.airbnb.epoxy.ModelView import com.airbnb.epoxy.ModelView
import com.aurora.extensions.px import com.aurora.extensions.px
import com.aurora.gplayapi.data.models.Artwork import com.aurora.gplayapi.data.models.Artwork
import com.aurora.store.R
import com.aurora.store.databinding.ViewEditorImageBinding import com.aurora.store.databinding.ViewEditorImageBinding
@ModelView( @ModelView(
autoLayout = ModelView.Size.WRAP_WIDTH_WRAP_HEIGHT, autoLayout = ModelView.Size.WRAP_WIDTH_WRAP_HEIGHT,
baseModelClass = BaseView::class baseModelClass = BaseModel::class
) )
class EditorImageView : RelativeLayout { class EditorImageView @JvmOverloads constructor(
context: Context?,
private lateinit var B: ViewEditorImageBinding attrs: AttributeSet? = null,
defStyleAttr: Int = 0
constructor(context: Context?) : super(context) { ) : BaseView<ViewEditorImageBinding>(context, attrs, defStyleAttr) {
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)
}
@ModelProp @ModelProp
fun artwork(artwork: Artwork) { fun artwork(artwork: Artwork) {
when (artwork.type) { when (artwork.type) {
14 -> { 14 -> {
B.img.layoutParams.height = 108.px.toInt() binding.img.layoutParams.height = 108.px.toInt()
B.img.layoutParams.width = 192.px.toInt() binding.img.layoutParams.width = 192.px.toInt()
B.img.requestLayout() binding.img.requestLayout()
B.img.load(artwork.url) { binding.img.load(artwork.url) {
transformations(RoundedCornersTransformation(8.px.toFloat())) transformations(RoundedCornersTransformation(8.px.toFloat()))
} }
} }
else -> { else -> {
B.img.layoutParams.width = 24.px.toInt() binding.img.layoutParams.width = 24.px.toInt()
B.img.layoutParams.height = 24.px.toInt() binding.img.layoutParams.height = 24.px.toInt()
B.img.requestLayout() binding.img.requestLayout()
B.img.load(artwork.url) { binding.img.load(artwork.url) {
transformations(RoundedCornersTransformation(4.px.toFloat())) transformations(RoundedCornersTransformation(4.px.toFloat()))
} }
} }
@@ -86,6 +66,6 @@ class EditorImageView : RelativeLayout {
@CallbackProp @CallbackProp
fun click(onClickListener: OnClickListener?) { 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.content.Context
import android.util.AttributeSet import android.util.AttributeSet
import android.widget.RelativeLayout
import coil.load import coil.load
import coil.transform.RoundedCornersTransformation import coil.transform.RoundedCornersTransformation
import com.airbnb.epoxy.CallbackProp import com.airbnb.epoxy.CallbackProp
@@ -33,32 +32,13 @@ import com.aurora.store.databinding.ViewFavBinding
@ModelView( @ModelView(
autoLayout = ModelView.Size.MATCH_WIDTH_WRAP_HEIGHT, autoLayout = ModelView.Size.MATCH_WIDTH_WRAP_HEIGHT,
baseModelClass = BaseView::class baseModelClass = BaseModel::class
) )
class FavouriteView : RelativeLayout { class FavouriteView @JvmOverloads constructor(
context: Context?,
private lateinit var binding: ViewFavBinding attrs: AttributeSet? = null,
defStyleAttr: Int = 0
constructor(context: Context?) : super(context) { ) : BaseView<ViewFavBinding>(context, attrs, defStyleAttr) {
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)
}
@ModelProp @ModelProp
fun favourite(favourite: Favourite) { fun favourite(favourite: Favourite) {

View File

@@ -21,63 +21,41 @@ package com.aurora.store.view.epoxy.views
import android.content.Context import android.content.Context
import android.util.AttributeSet import android.util.AttributeSet
import android.widget.RelativeLayout
import com.airbnb.epoxy.CallbackProp import com.airbnb.epoxy.CallbackProp
import com.airbnb.epoxy.ModelProp import com.airbnb.epoxy.ModelProp
import com.airbnb.epoxy.ModelView import com.airbnb.epoxy.ModelView
import com.airbnb.epoxy.OnViewRecycled import com.airbnb.epoxy.OnViewRecycled
import com.aurora.store.R
import com.aurora.store.databinding.ViewHeaderBinding import com.aurora.store.databinding.ViewHeaderBinding
@ModelView( @ModelView(
autoLayout = ModelView.Size.MATCH_WIDTH_WRAP_HEIGHT, autoLayout = ModelView.Size.MATCH_WIDTH_WRAP_HEIGHT,
baseModelClass = BaseView::class baseModelClass = BaseModel::class
) )
class HeaderView : RelativeLayout { class HeaderView @JvmOverloads constructor(
context: Context?,
private lateinit var B: ViewHeaderBinding attrs: AttributeSet? = null,
defStyleAttr: Int = 0
constructor(context: Context?) : super(context) { ) : BaseView<ViewHeaderBinding>(context, attrs, defStyleAttr) {
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)
}
@ModelProp @ModelProp
fun title(title: String) { fun title(title: String) {
B.txtTitle.text = title binding.txtTitle.text = title
} }
@JvmOverloads @JvmOverloads
@ModelProp @ModelProp
fun browseUrl(browseUrl: String? = String()) { fun browseUrl(browseUrl: String? = String()) {
if (browseUrl.isNullOrEmpty()) if (browseUrl.isNullOrEmpty())
B.imgAction.visibility = INVISIBLE binding.imgAction.visibility = INVISIBLE
} }
@CallbackProp @CallbackProp
fun click(onClickListener: OnClickListener?) { fun click(onClickListener: OnClickListener?) {
B.root.setOnClickListener(onClickListener) binding.root.setOnClickListener(onClickListener)
} }
@OnViewRecycled @OnViewRecycled
fun clear() { 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.content.Context
import android.util.AttributeSet import android.util.AttributeSet
import android.widget.RelativeLayout
import com.airbnb.epoxy.ModelView import com.airbnb.epoxy.ModelView
import com.aurora.store.R
import com.aurora.store.databinding.ViewDividerBinding import com.aurora.store.databinding.ViewDividerBinding
@ModelView( @ModelView(
autoLayout = ModelView.Size.MATCH_WIDTH_WRAP_HEIGHT, autoLayout = ModelView.Size.MATCH_WIDTH_WRAP_HEIGHT,
baseModelClass = BaseView::class baseModelClass = BaseModel::class
) )
class HorizontalDividerView : RelativeLayout { class HorizontalDividerView @JvmOverloads constructor(
context: Context?,
private lateinit var B: ViewDividerBinding attrs: AttributeSet? = null,
defStyleAttr: Int = 0
constructor(context: Context?) : super(context) { ) : BaseView<ViewDividerBinding>(context, attrs, defStyleAttr)
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)
}
}

View File

@@ -21,56 +21,34 @@ package com.aurora.store.view.epoxy.views
import android.content.Context import android.content.Context
import android.util.AttributeSet import android.util.AttributeSet
import android.widget.RelativeLayout
import com.airbnb.epoxy.CallbackProp import com.airbnb.epoxy.CallbackProp
import com.airbnb.epoxy.ModelProp import com.airbnb.epoxy.ModelProp
import com.airbnb.epoxy.ModelView import com.airbnb.epoxy.ModelView
import com.airbnb.epoxy.OnViewRecycled import com.airbnb.epoxy.OnViewRecycled
import com.aurora.store.R
import com.aurora.store.databinding.ViewActionHeaderBinding import com.aurora.store.databinding.ViewActionHeaderBinding
@ModelView( @ModelView(
autoLayout = ModelView.Size.MATCH_WIDTH_WRAP_HEIGHT, autoLayout = ModelView.Size.MATCH_WIDTH_WRAP_HEIGHT,
baseModelClass = BaseView::class baseModelClass = BaseModel::class
) )
class MinimalHeaderView : RelativeLayout { class MinimalHeaderView @JvmOverloads constructor(
context: Context?,
private lateinit var B: ViewActionHeaderBinding attrs: AttributeSet? = null,
defStyleAttr: Int = 0
constructor(context: Context?) : super(context) { ) : BaseView<ViewActionHeaderBinding>(context, attrs, defStyleAttr) {
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)
}
@ModelProp @ModelProp
fun title(title: String) { fun title(title: String) {
B.txtTitle.text = title binding.txtTitle.text = title
} }
@CallbackProp @CallbackProp
fun click(onClickListener: OnClickListener?) { fun click(onClickListener: OnClickListener?) {
B.imgAction.setOnClickListener(onClickListener) binding.imgAction.setOnClickListener(onClickListener)
} }
@OnViewRecycled @OnViewRecycled
fun clear() { 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.content.Context
import android.util.AttributeSet import android.util.AttributeSet
import android.widget.RelativeLayout
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
import coil.load import coil.load
import coil.transform.RoundedCornersTransformation import coil.transform.RoundedCornersTransformation
@@ -34,41 +33,22 @@ import com.aurora.store.databinding.ViewSearchSuggestionBinding
@ModelView( @ModelView(
autoLayout = ModelView.Size.MATCH_WIDTH_WRAP_HEIGHT, autoLayout = ModelView.Size.MATCH_WIDTH_WRAP_HEIGHT,
baseModelClass = BaseView::class baseModelClass = BaseModel::class
) )
class SearchSuggestionView : RelativeLayout { class SearchSuggestionView @JvmOverloads constructor(
context: Context?,
private lateinit var B: ViewSearchSuggestionBinding attrs: AttributeSet? = null,
defStyleAttr: Int = 0
constructor(context: Context?) : super(context) { ) : BaseView<ViewSearchSuggestionBinding>(context, attrs, defStyleAttr) {
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)
}
@ModelProp @ModelProp
fun entry(searchSuggestEntry: SearchSuggestEntry) { fun entry(searchSuggestEntry: SearchSuggestEntry) {
if (searchSuggestEntry.hasImageContainer()) { if (searchSuggestEntry.hasImageContainer()) {
B.img.load(searchSuggestEntry.imageContainer.imageUrl) { binding.img.load(searchSuggestEntry.imageContainer.imageUrl) {
transformations(RoundedCornersTransformation(8F)) transformations(RoundedCornersTransformation(8F))
} }
} else { } else {
B.img.setImageDrawable( binding.img.setImageDrawable(
ContextCompat.getDrawable( ContextCompat.getDrawable(
context, context,
R.drawable.ic_search_suggestion R.drawable.ic_search_suggestion
@@ -76,16 +56,16 @@ class SearchSuggestionView : RelativeLayout {
) )
} }
B.txtTitle.text = searchSuggestEntry.title binding.txtTitle.text = searchSuggestEntry.title
} }
@CallbackProp @CallbackProp
fun click(onClickListener: OnClickListener?) { fun click(onClickListener: OnClickListener?) {
B.root.setOnClickListener(onClickListener) binding.root.setOnClickListener(onClickListener)
} }
@CallbackProp @CallbackProp
fun action(onClickListener: OnClickListener?) { 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.content.Context
import android.util.AttributeSet import android.util.AttributeSet
import android.widget.RelativeLayout
import com.airbnb.epoxy.CallbackProp import com.airbnb.epoxy.CallbackProp
import com.airbnb.epoxy.ModelProp import com.airbnb.epoxy.ModelProp
import com.airbnb.epoxy.ModelView import com.airbnb.epoxy.ModelView
import com.airbnb.epoxy.OnViewRecycled import com.airbnb.epoxy.OnViewRecycled
import com.aurora.store.R
import com.aurora.store.databinding.ViewHeaderUpdateBinding import com.aurora.store.databinding.ViewHeaderUpdateBinding
@ModelView( @ModelView(
autoLayout = ModelView.Size.MATCH_WIDTH_WRAP_HEIGHT, autoLayout = ModelView.Size.MATCH_WIDTH_WRAP_HEIGHT,
baseModelClass = BaseView::class baseModelClass = BaseModel::class
) )
class UpdateHeaderView : RelativeLayout { class UpdateHeaderView @JvmOverloads constructor(
context: Context?,
private lateinit var B: ViewHeaderUpdateBinding attrs: AttributeSet? = null,
defStyleAttr: Int = 0
constructor(context: Context?) : super(context) { ) : BaseView<ViewHeaderUpdateBinding>(context, attrs, defStyleAttr) {
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)
}
@ModelProp @ModelProp
fun title(title: String) { fun title(title: String) {
B.txtTitle.text = title binding.txtTitle.text = title
} }
@ModelProp @ModelProp
fun action(action: String) { fun action(action: String) {
B.btnAction.text = action binding.btnAction.text = action
} }
@CallbackProp @CallbackProp
fun click(onClickListener: OnClickListener?) { fun click(onClickListener: OnClickListener?) {
B.btnAction.setOnClickListener(onClickListener) binding.btnAction.setOnClickListener(onClickListener)
} }
@OnViewRecycled @OnViewRecycled
fun clear() { 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.content.Context
import android.util.AttributeSet import android.util.AttributeSet
import android.widget.RelativeLayout
import coil.load import coil.load
import coil.transform.RoundedCornersTransformation import coil.transform.RoundedCornersTransformation
import com.airbnb.epoxy.CallbackProp import com.airbnb.epoxy.CallbackProp
@@ -31,46 +30,28 @@ import com.aurora.extensions.getString
import com.aurora.gplayapi.data.models.App import com.aurora.gplayapi.data.models.App
import com.aurora.store.R import com.aurora.store.R
import com.aurora.store.databinding.ViewAppListBinding import com.aurora.store.databinding.ViewAppListBinding
import com.aurora.store.view.epoxy.views.BaseModel
import com.aurora.store.view.epoxy.views.BaseView import com.aurora.store.view.epoxy.views.BaseView
@ModelView( @ModelView(
autoLayout = ModelView.Size.MATCH_WIDTH_WRAP_HEIGHT, autoLayout = ModelView.Size.MATCH_WIDTH_WRAP_HEIGHT,
baseModelClass = BaseView::class baseModelClass = BaseModel::class
) )
class AppListView : RelativeLayout { class AppListView @JvmOverloads constructor(
context: Context?,
private lateinit var B: ViewAppListBinding attrs: AttributeSet? = null,
defStyleAttr: Int = 0
constructor(context: Context?) : super(context) { ) : BaseView<ViewAppListBinding>(context, attrs, defStyleAttr) {
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)
}
@ModelProp @ModelProp
fun app(app: App) { fun app(app: App) {
B.imgIcon.load(app.iconArtwork.url) { binding.imgIcon.load(app.iconArtwork.url) {
placeholder(R.drawable.bg_placeholder) placeholder(R.drawable.bg_placeholder)
transformations(RoundedCornersTransformation(25F)) transformations(RoundedCornersTransformation(25F))
} }
B.txtLine1.text = app.displayName binding.txtLine1.text = app.displayName
B.txtLine2.text = app.developerName binding.txtLine2.text = app.developerName
val extras: MutableList<String> = mutableListOf() val extras: MutableList<String> = mutableListOf()
extras.add(app.downloadString) extras.add(app.downloadString)
@@ -88,16 +69,16 @@ class AppListView : RelativeLayout {
if (app.dependencies.dependentPackages.isNotEmpty()) if (app.dependencies.dependentPackages.isNotEmpty())
extras.add(getString(R.string.details_gsf_dependent)) extras.add(getString(R.string.details_gsf_dependent))
B.txtLine3.text = extras.joinToString(separator = "") binding.txtLine3.text = extras.joinToString(separator = "")
} }
@CallbackProp @CallbackProp
fun click(onClickListener: OnClickListener?) { fun click(onClickListener: OnClickListener?) {
B.root.setOnClickListener(onClickListener) binding.root.setOnClickListener(onClickListener)
} }
@CallbackProp @CallbackProp
fun longClick(onClickListener: OnLongClickListener?) { 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.content.Context
import android.util.AttributeSet import android.util.AttributeSet
import android.view.View import android.view.View
import android.widget.RelativeLayout
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
import androidx.core.text.HtmlCompat import androidx.core.text.HtmlCompat
import androidx.core.view.isVisible 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.data.room.download.Download
import com.aurora.store.databinding.ViewAppUpdateBinding import com.aurora.store.databinding.ViewAppUpdateBinding
import com.aurora.store.util.CommonUtil import com.aurora.store.util.CommonUtil
import com.aurora.store.view.epoxy.views.BaseModel
import com.aurora.store.view.epoxy.views.BaseView import com.aurora.store.view.epoxy.views.BaseView
@ModelView( @ModelView(
autoLayout = ModelView.Size.MATCH_WIDTH_WRAP_HEIGHT, autoLayout = ModelView.Size.MATCH_WIDTH_WRAP_HEIGHT,
baseModelClass = BaseView::class baseModelClass = BaseModel::class
) )
class AppUpdateView : RelativeLayout { class AppUpdateView @JvmOverloads constructor(
context: Context?,
private lateinit var B: ViewAppUpdateBinding attrs: AttributeSet? = null,
defStyleAttr: Int = 0
constructor(context: Context?) : super(context) { ) : BaseView<ViewAppUpdateBinding>(context, attrs, defStyleAttr) {
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)
}
@ModelProp @ModelProp
fun app(app: App) { fun app(app: App) {
/*Inflate App details*/ /*Inflate App details*/
with(app) { with(app) {
B.txtLine1.text = displayName binding.txtLine1.text = displayName
B.imgIcon.load(iconArtwork.url) { binding.imgIcon.load(iconArtwork.url) {
placeholder(R.drawable.bg_placeholder) placeholder(R.drawable.bg_placeholder)
transformations(RoundedCornersTransformation(8.px.toFloat())) transformations(RoundedCornersTransformation(8.px.toFloat()))
} }
B.txtLine2.text = developerName binding.txtLine2.text = developerName
B.txtLine3.text = ("${CommonUtil.addSiPrefix(size)}$updatedOn") binding.txtLine3.text = ("${CommonUtil.addSiPrefix(size)}$updatedOn")
B.txtLine4.text = ("$versionName (${versionCode})") binding.txtLine4.text = ("$versionName (${versionCode})")
B.txtChangelog.text = if (changes.isNotEmpty()) binding.txtChangelog.text = if (changes.isNotEmpty())
HtmlCompat.fromHtml( HtmlCompat.fromHtml(
changes, changes,
HtmlCompat.FROM_HTML_OPTION_USE_CSS_COLORS HtmlCompat.FROM_HTML_OPTION_USE_CSS_COLORS
@@ -92,13 +73,15 @@ class AppUpdateView : RelativeLayout {
else else
context.getString(R.string.details_changelog_unavailable) context.getString(R.string.details_changelog_unavailable)
B.headerIndicator.setOnClickListener { binding.headerIndicator.setOnClickListener {
if (B.txtChangelog.isVisible) { if (binding.txtChangelog.isVisible) {
B.headerIndicator.icon = ContextCompat.getDrawable(context, R.drawable.ic_arrow_down) binding.headerIndicator.icon =
B.txtChangelog.visibility = View.GONE ContextCompat.getDrawable(context, R.drawable.ic_arrow_down)
binding.txtChangelog.visibility = View.GONE
} else { } else {
B.headerIndicator.icon = ContextCompat.getDrawable(context, R.drawable.ic_arrow_up) binding.headerIndicator.icon =
B.txtChangelog.visibility = View.VISIBLE ContextCompat.getDrawable(context, R.drawable.ic_arrow_up)
binding.txtChangelog.visibility = View.VISIBLE
} }
} }
} }
@@ -108,26 +91,28 @@ class AppUpdateView : RelativeLayout {
fun download(download: Download?) { fun download(download: Download?) {
if (download != null) { if (download != null) {
/*Inflate Download details*/ /*Inflate Download details*/
B.btnAction.updateState(download.downloadStatus) binding.btnAction.updateState(download.downloadStatus)
B.progressDownload.isIndeterminate = download.progress < 1 binding.progressDownload.isIndeterminate = download.progress < 1
when (download.downloadStatus) { when (download.downloadStatus) {
DownloadStatus.QUEUED -> { DownloadStatus.QUEUED -> {
B.progressDownload.progress = 0 binding.progressDownload.progress = 0
B.progressDownload.show() binding.progressDownload.show()
} }
DownloadStatus.DOWNLOADING -> { DownloadStatus.DOWNLOADING -> {
if (download.progress > 0) { if (download.progress > 0) {
if (download.progress == 100) { if (download.progress == 100) {
B.progressDownload.invisible() binding.progressDownload.invisible()
} else { } else {
B.progressDownload.progress = download.progress binding.progressDownload.progress = download.progress
B.progressDownload.show() binding.progressDownload.show()
} }
} }
} }
else -> { else -> {
B.progressDownload.progress = 0 binding.progressDownload.progress = 0
B.progressDownload.invisible() binding.progressDownload.invisible()
} }
} }
} }
@@ -135,28 +120,28 @@ class AppUpdateView : RelativeLayout {
@CallbackProp @CallbackProp
fun click(onClickListener: OnClickListener?) { fun click(onClickListener: OnClickListener?) {
B.layoutContent.setOnClickListener(onClickListener) binding.layoutContent.setOnClickListener(onClickListener)
} }
@CallbackProp @CallbackProp
fun positiveAction(onClickListener: OnClickListener?) { fun positiveAction(onClickListener: OnClickListener?) {
B.btnAction.addPositiveOnClickListener(onClickListener) binding.btnAction.addPositiveOnClickListener(onClickListener)
} }
@CallbackProp @CallbackProp
fun negativeAction(onClickListener: OnClickListener?) { fun negativeAction(onClickListener: OnClickListener?) {
B.btnAction.addNegativeOnClickListener(onClickListener) binding.btnAction.addNegativeOnClickListener(onClickListener)
} }
@CallbackProp @CallbackProp
fun longClick(onClickListener: OnLongClickListener?) { fun longClick(onClickListener: OnLongClickListener?) {
B.layoutContent.setOnLongClickListener(onClickListener) binding.layoutContent.setOnLongClickListener(onClickListener)
} }
@OnViewRecycled @OnViewRecycled
fun clear() { fun clear() {
B.headerIndicator.removeCallbacks { } binding.headerIndicator.removeCallbacks { }
B.progressDownload.progress = 0 binding.progressDownload.progress = 0
B.progressDownload.invisible() binding.progressDownload.invisible()
} }
} }

View File

@@ -21,7 +21,6 @@ package com.aurora.store.view.epoxy.views.app
import android.content.Context import android.content.Context
import android.util.AttributeSet import android.util.AttributeSet
import android.widget.RelativeLayout
import coil.load import coil.load
import coil.transform.RoundedCornersTransformation import coil.transform.RoundedCornersTransformation
import com.airbnb.epoxy.CallbackProp 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.R
import com.aurora.store.databinding.ViewAppBinding import com.aurora.store.databinding.ViewAppBinding
import com.aurora.store.util.CommonUtil import com.aurora.store.util.CommonUtil
import com.aurora.store.view.epoxy.views.BaseModel
import com.aurora.store.view.epoxy.views.BaseView import com.aurora.store.view.epoxy.views.BaseView
@ModelView( @ModelView(
autoLayout = ModelView.Size.WRAP_WIDTH_WRAP_HEIGHT, autoLayout = ModelView.Size.WRAP_WIDTH_WRAP_HEIGHT,
baseModelClass = BaseView::class baseModelClass = BaseModel::class
) )
class AppView : RelativeLayout { class AppView @JvmOverloads constructor(
context: Context?,
private lateinit var B: ViewAppBinding attrs: AttributeSet? = null,
defStyleAttr: Int = 0
constructor(context: Context?) : super(context) { ) : BaseView<ViewAppBinding>(context, attrs, defStyleAttr) {
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)
}
@ModelProp @ModelProp
fun app(app: App) { fun app(app: App) {
B.txtName.text = app.displayName binding.txtName.text = app.displayName
B.imgIcon.load(app.iconArtwork.url) { binding.imgIcon.load(app.iconArtwork.url) {
placeholder(R.drawable.bg_placeholder) placeholder(R.drawable.bg_placeholder)
transformations(RoundedCornersTransformation(32F)) transformations(RoundedCornersTransformation(32F))
} }
B.txtSize.text = context binding.txtSize.text = context
.getString(R.string.app_view_rating) .getString(R.string.app_view_rating)
.format(app.downloadString, app.rating.abbreviatedLabel) .format(app.downloadString, app.rating.abbreviatedLabel)
if (app.size > 0) if (app.size > 0)
B.txtSize.text = CommonUtil.addSiPrefix(app.size) binding.txtSize.text = CommonUtil.addSiPrefix(app.size)
} }
@CallbackProp @CallbackProp
fun click(onClickListener: OnClickListener?) { fun click(onClickListener: OnClickListener?) {
B.root.setOnClickListener(onClickListener) binding.root.setOnClickListener(onClickListener)
} }
@CallbackProp @CallbackProp
fun longClick(onClickListener: OnLongClickListener?) { 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.content.Context
import android.util.AttributeSet import android.util.AttributeSet
import android.widget.RelativeLayout
import com.airbnb.epoxy.ModelProp import com.airbnb.epoxy.ModelProp
import com.airbnb.epoxy.ModelView import com.airbnb.epoxy.ModelView
import com.aurora.store.R
import com.aurora.store.databinding.ViewNoAppAltBinding import com.aurora.store.databinding.ViewNoAppAltBinding
import com.aurora.store.view.epoxy.views.BaseModel
import com.aurora.store.view.epoxy.views.BaseView import com.aurora.store.view.epoxy.views.BaseView
@ModelView( @ModelView(
autoLayout = ModelView.Size.MATCH_WIDTH_WRAP_HEIGHT, autoLayout = ModelView.Size.MATCH_WIDTH_WRAP_HEIGHT,
baseModelClass = BaseView::class baseModelClass = BaseModel::class
) )
class NoAppAltView : RelativeLayout { class NoAppAltView @JvmOverloads constructor(
context: Context?,
private lateinit var B: ViewNoAppAltBinding attrs: AttributeSet? = null,
defStyleAttr: Int = 0
constructor(context: Context?) : super(context) { ) : BaseView<ViewNoAppAltBinding>(context, attrs, defStyleAttr) {
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)
}
@ModelProp @ModelProp
fun message(message: String) { 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.content.Context
import android.util.AttributeSet import android.util.AttributeSet
import android.widget.RelativeLayout
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
import com.airbnb.epoxy.ModelProp import com.airbnb.epoxy.ModelProp
import com.airbnb.epoxy.ModelView import com.airbnb.epoxy.ModelView
import com.aurora.store.R
import com.aurora.store.databinding.ViewNoAppBinding import com.aurora.store.databinding.ViewNoAppBinding
import com.aurora.store.view.epoxy.views.BaseModel
import com.aurora.store.view.epoxy.views.BaseView import com.aurora.store.view.epoxy.views.BaseView
@ModelView( @ModelView(
autoLayout = ModelView.Size.MATCH_WIDTH_MATCH_HEIGHT, autoLayout = ModelView.Size.MATCH_WIDTH_MATCH_HEIGHT,
baseModelClass = BaseView::class baseModelClass = BaseModel::class
) )
class NoAppView : RelativeLayout { class NoAppView @JvmOverloads constructor(
context: Context?,
private lateinit var B: ViewNoAppBinding attrs: AttributeSet? = null,
defStyleAttr: Int = 0
constructor(context: Context?) : super(context) { ) : BaseView<ViewNoAppBinding>(context, attrs, defStyleAttr) {
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)
}
@ModelProp @ModelProp
fun message(message: String) { fun message(message: String) {
B.txt.text = message binding.txt.text = message
} }
@ModelProp @ModelProp
fun icon(icon: Int?) { fun icon(icon: Int?) {
icon?.let { 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.content.Context
import android.util.AttributeSet import android.util.AttributeSet
import android.widget.RelativeLayout
import coil.load import coil.load
import coil.transform.RoundedCornersTransformation import coil.transform.RoundedCornersTransformation
import com.airbnb.epoxy.CallbackProp import com.airbnb.epoxy.CallbackProp
@@ -30,41 +29,23 @@ import com.airbnb.epoxy.ModelView
import com.aurora.gplayapi.data.models.App import com.aurora.gplayapi.data.models.App
import com.aurora.store.R import com.aurora.store.R
import com.aurora.store.databinding.ViewAppDependentBinding import com.aurora.store.databinding.ViewAppDependentBinding
import com.aurora.store.view.epoxy.views.BaseModel
import com.aurora.store.view.epoxy.views.BaseView import com.aurora.store.view.epoxy.views.BaseView
@ModelView( @ModelView(
autoLayout = ModelView.Size.WRAP_WIDTH_WRAP_HEIGHT, autoLayout = ModelView.Size.WRAP_WIDTH_WRAP_HEIGHT,
baseModelClass = BaseView::class baseModelClass = BaseModel::class
) )
class AppDependentView : RelativeLayout { class AppDependentView @JvmOverloads constructor(
context: Context?,
private lateinit var B: ViewAppDependentBinding attrs: AttributeSet? = null,
defStyleAttr: Int = 0
constructor(context: Context?) : super(context) { ) : BaseView<ViewAppDependentBinding>(context, attrs, defStyleAttr) {
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)
}
@ModelProp @ModelProp
fun app(app: App) { fun app(app: App) {
B.txtName.text = app.displayName binding.txtName.text = app.displayName
B.imgIcon.load(app.iconArtwork.url) { binding.imgIcon.load(app.iconArtwork.url) {
placeholder(R.drawable.bg_placeholder) placeholder(R.drawable.bg_placeholder)
transformations(RoundedCornersTransformation(32F)) transformations(RoundedCornersTransformation(32F))
} }
@@ -72,11 +53,11 @@ class AppDependentView : RelativeLayout {
@CallbackProp @CallbackProp
fun click(onClickListener: OnClickListener?) { fun click(onClickListener: OnClickListener?) {
B.root.setOnClickListener(onClickListener) binding.root.setOnClickListener(onClickListener)
} }
@CallbackProp @CallbackProp
fun longClick(onClickListener: OnLongClickListener?) { 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.content.Context
import android.util.AttributeSet import android.util.AttributeSet
import android.widget.RelativeLayout
import coil.load import coil.load
import com.airbnb.epoxy.ModelProp import com.airbnb.epoxy.ModelProp
import com.airbnb.epoxy.ModelView import com.airbnb.epoxy.ModelView
import com.aurora.gplayapi.data.models.details.Badge import com.aurora.gplayapi.data.models.details.Badge
import com.aurora.store.R
import com.aurora.store.databinding.ViewBadgeBinding import com.aurora.store.databinding.ViewBadgeBinding
import com.aurora.store.view.epoxy.views.BaseModel
import com.aurora.store.view.epoxy.views.BaseView import com.aurora.store.view.epoxy.views.BaseView
@ModelView( @ModelView(
autoLayout = ModelView.Size.WRAP_WIDTH_WRAP_HEIGHT, autoLayout = ModelView.Size.WRAP_WIDTH_WRAP_HEIGHT,
baseModelClass = BaseView::class baseModelClass = BaseModel::class
) )
class BadgeView : RelativeLayout { class BadgeView @JvmOverloads constructor(
context: Context?,
private lateinit var B: ViewBadgeBinding attrs: AttributeSet? = null,
defStyleAttr: Int = 0
constructor(context: Context?) : super(context) { ) : BaseView<ViewBadgeBinding>(context, attrs, defStyleAttr) {
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)
}
@ModelProp @ModelProp
fun badge(badge: Badge) { fun badge(badge: Badge) {
if (badge.textMajor.isEmpty()) { if (badge.textMajor.isEmpty()) {
if (badge.textMinor.isEmpty()) { if (badge.textMinor.isEmpty()) {
B.txt.text = badge.textDescription binding.txt.text = badge.textDescription
} else { } else {
B.txt.text = badge.textMinor binding.txt.text = badge.textMinor
} }
} else { } else {
B.txt.text = badge.textMajor binding.txt.text = badge.textMajor
} }
badge.artwork?.let { 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.content.Context
import android.util.AttributeSet import android.util.AttributeSet
import android.widget.RelativeLayout
import com.airbnb.epoxy.CallbackProp import com.airbnb.epoxy.CallbackProp
import com.airbnb.epoxy.ModelProp import com.airbnb.epoxy.ModelProp
import com.airbnb.epoxy.ModelView import com.airbnb.epoxy.ModelView
import com.airbnb.epoxy.OnViewRecycled import com.airbnb.epoxy.OnViewRecycled
import com.aurora.store.R
import com.aurora.store.data.model.ExodusTracker import com.aurora.store.data.model.ExodusTracker
import com.aurora.store.databinding.ViewExodusBinding import com.aurora.store.databinding.ViewExodusBinding
import com.aurora.store.view.epoxy.views.BaseModel
import com.aurora.store.view.epoxy.views.BaseView import com.aurora.store.view.epoxy.views.BaseView
@ModelView( @ModelView(
autoLayout = ModelView.Size.MATCH_WIDTH_WRAP_HEIGHT, autoLayout = ModelView.Size.MATCH_WIDTH_WRAP_HEIGHT,
baseModelClass = BaseView::class baseModelClass = BaseModel::class
) )
class ExodusView : RelativeLayout { class ExodusView @JvmOverloads constructor(
context: Context?,
private lateinit var B: ViewExodusBinding attrs: AttributeSet? = null,
defStyleAttr: Int = 0
constructor(context: Context?) : super(context) { ) : BaseView<ViewExodusBinding>(context, attrs, defStyleAttr) {
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)
}
@ModelProp @ModelProp
fun tracker(report: ExodusTracker) { fun tracker(report: ExodusTracker) {
B.txtTitle.text = report.name binding.txtTitle.text = report.name
B.txtSubtitle.text = report.signature binding.txtSubtitle.text = report.signature
B.txtDescription.text = report.date binding.txtDescription.text = report.date
} }
@CallbackProp @CallbackProp
fun click(onClickListener: OnClickListener?) { fun click(onClickListener: OnClickListener?) {
B.root.setOnClickListener(onClickListener) binding.root.setOnClickListener(onClickListener)
} }
@OnViewRecycled @OnViewRecycled

View File

@@ -21,47 +21,27 @@ package com.aurora.store.view.epoxy.views.details
import android.content.Context import android.content.Context
import android.util.AttributeSet import android.util.AttributeSet
import android.widget.RelativeLayout
import com.airbnb.epoxy.ModelProp import com.airbnb.epoxy.ModelProp
import com.airbnb.epoxy.ModelView import com.airbnb.epoxy.ModelView
import com.aurora.gplayapi.data.models.File import com.aurora.gplayapi.data.models.File
import com.aurora.store.R
import com.aurora.store.databinding.ViewFileBinding import com.aurora.store.databinding.ViewFileBinding
import com.aurora.store.util.CommonUtil import com.aurora.store.util.CommonUtil
import com.aurora.store.view.epoxy.views.BaseModel
import com.aurora.store.view.epoxy.views.BaseView import com.aurora.store.view.epoxy.views.BaseView
@ModelView( @ModelView(
autoLayout = ModelView.Size.WRAP_WIDTH_WRAP_HEIGHT, autoLayout = ModelView.Size.WRAP_WIDTH_WRAP_HEIGHT,
baseModelClass = BaseView::class baseModelClass = BaseModel::class
) )
class FileView : RelativeLayout { class FileView @JvmOverloads constructor(
context: Context?,
private lateinit var B: ViewFileBinding attrs: AttributeSet? = null,
defStyleAttr: Int = 0
constructor(context: Context?) : super(context) { ) : BaseView<ViewFileBinding>(context, attrs, defStyleAttr) {
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)
}
@ModelProp @ModelProp
fun file(file: File) { fun file(file: File) {
B.line1.text = file.name binding.line1.text = file.name
B.line2.text = CommonUtil.addSiPrefix(file.size) 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.content.Context
import android.util.AttributeSet import android.util.AttributeSet
import android.widget.RelativeLayout
import com.airbnb.epoxy.ModelProp import com.airbnb.epoxy.ModelProp
import com.airbnb.epoxy.ModelView import com.airbnb.epoxy.ModelView
import com.airbnb.epoxy.OnViewRecycled import com.airbnb.epoxy.OnViewRecycled
import com.aurora.store.R
import com.aurora.store.databinding.ViewInfoBinding import com.aurora.store.databinding.ViewInfoBinding
import com.aurora.store.view.epoxy.views.BaseModel
import com.aurora.store.view.epoxy.views.BaseView import com.aurora.store.view.epoxy.views.BaseView
import java.util.Locale import java.util.Locale
@ModelView( @ModelView(
autoLayout = ModelView.Size.MATCH_WIDTH_WRAP_HEIGHT, autoLayout = ModelView.Size.MATCH_WIDTH_WRAP_HEIGHT,
baseModelClass = BaseView::class baseModelClass = BaseModel::class
) )
class InfoView : RelativeLayout { class InfoView @JvmOverloads constructor(
context: Context?,
private lateinit var B: ViewInfoBinding attrs: AttributeSet? = null,
defStyleAttr: Int = 0
constructor(context: Context?) : super(context) { ) : BaseView<ViewInfoBinding>(context, attrs, defStyleAttr) {
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)
}
@ModelProp(options = [ModelProp.Option.IgnoreRequireHashCode]) @ModelProp(options = [ModelProp.Option.IgnoreRequireHashCode])
fun badge(info: Map.Entry<String, String>) { fun badge(info: Map.Entry<String, String>) {
B.txtTitle.text = info.key binding.txtTitle.text = info.key
.replace("_", " ") .replace("_", " ")
.lowercase(Locale.getDefault()) .lowercase(Locale.getDefault())
.replaceFirstChar { .replaceFirstChar {
@@ -71,10 +51,12 @@ class InfoView : RelativeLayout {
it.toString() it.toString()
} }
} }
B.txtSubtitle.text = info.value binding.txtSubtitle.text = info.value
} }
@OnViewRecycled @OnViewRecycled
fun clear() { 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.Context
import android.content.res.Resources import android.content.res.Resources
import android.util.AttributeSet import android.util.AttributeSet
import android.widget.RelativeLayout
import coil.load import coil.load
import com.airbnb.epoxy.ModelProp import com.airbnb.epoxy.ModelProp
import com.airbnb.epoxy.ModelView import com.airbnb.epoxy.ModelView
import com.aurora.gplayapi.data.models.Artwork import com.aurora.gplayapi.data.models.Artwork
import com.aurora.store.R import com.aurora.store.R
import com.aurora.store.databinding.ViewScreenshotLargeBinding import com.aurora.store.databinding.ViewScreenshotLargeBinding
import com.aurora.store.view.epoxy.views.BaseModel
import com.aurora.store.view.epoxy.views.BaseView import com.aurora.store.view.epoxy.views.BaseView
@ModelView( @ModelView(
autoLayout = ModelView.Size.MATCH_WIDTH_MATCH_HEIGHT, autoLayout = ModelView.Size.MATCH_WIDTH_MATCH_HEIGHT,
baseModelClass = BaseView::class baseModelClass = BaseModel::class
) )
class LargeScreenshotView : RelativeLayout { class LargeScreenshotView @JvmOverloads constructor(
context: Context?,
private lateinit var B: ViewScreenshotLargeBinding attrs: AttributeSet? = null,
defStyleAttr: Int = 0
constructor(context: Context?) : super(context) { ) : BaseView<ViewScreenshotLargeBinding>(context, attrs, defStyleAttr) {
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)
}
@ModelProp @ModelProp
fun artwork(artwork: Artwork) { fun artwork(artwork: Artwork) {
val displayMetrics = Resources.getSystem().displayMetrics 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) 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.content.Context
import android.util.AttributeSet import android.util.AttributeSet
import android.widget.RelativeLayout
import coil.load import coil.load
import coil.transform.RoundedCornersTransformation import coil.transform.RoundedCornersTransformation
import com.airbnb.epoxy.CallbackProp import com.airbnb.epoxy.CallbackProp
@@ -31,15 +30,18 @@ import com.aurora.extensions.px
import com.aurora.gplayapi.data.models.Artwork import com.aurora.gplayapi.data.models.Artwork
import com.aurora.store.R import com.aurora.store.R
import com.aurora.store.databinding.ViewScreenshotMiniBinding import com.aurora.store.databinding.ViewScreenshotMiniBinding
import com.aurora.store.view.epoxy.views.BaseModel
import com.aurora.store.view.epoxy.views.BaseView import com.aurora.store.view.epoxy.views.BaseView
@ModelView( @ModelView(
autoLayout = ModelView.Size.WRAP_WIDTH_WRAP_HEIGHT, autoLayout = ModelView.Size.WRAP_WIDTH_WRAP_HEIGHT,
baseModelClass = BaseView::class baseModelClass = BaseModel::class
) )
class MiniScreenshotView : RelativeLayout { class MiniScreenshotView @JvmOverloads constructor(
context: Context?,
private lateinit var B: ViewScreenshotMiniBinding attrs: AttributeSet? = null,
defStyleAttr: Int = 0
) : BaseView<ViewScreenshotMiniBinding>(context, attrs, defStyleAttr) {
private var position: Int = 0 private var position: Int = 0
@@ -47,27 +49,6 @@ class MiniScreenshotView : RelativeLayout {
fun onClick(position: Int = 0) 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 @ModelProp
fun position(pos: Int) { fun position(pos: Int) {
position = pos position = pos
@@ -76,7 +57,7 @@ class MiniScreenshotView : RelativeLayout {
@ModelProp @ModelProp
fun artwork(artwork: Artwork) { fun artwork(artwork: Artwork) {
normalizeSize(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) placeholder(R.drawable.bg_rounded)
transformations(RoundedCornersTransformation(8.px.toFloat())) transformations(RoundedCornersTransformation(8.px.toFloat()))
} }
@@ -96,6 +77,7 @@ class MiniScreenshotView : RelativeLayout {
normalizedHeight = 120f normalizedHeight = 120f
normalizedWidth = 120f normalizedWidth = 120f
} }
else -> { else -> {
val factor = artworkHeight / 120f val factor = artworkHeight / 120f
normalizedHeight = 120f normalizedHeight = 120f
@@ -103,15 +85,15 @@ class MiniScreenshotView : RelativeLayout {
} }
} }
B.img.layoutParams.height = normalizedHeight.px.toInt() binding.img.layoutParams.height = normalizedHeight.px.toInt()
B.img.layoutParams.width = normalizedWidth.px.toInt() binding.img.layoutParams.width = normalizedWidth.px.toInt()
B.img.requestLayout() binding.img.requestLayout()
} }
} }
@CallbackProp @CallbackProp
fun callback(screenshotCallback: ScreenshotCallback?) { fun callback(screenshotCallback: ScreenshotCallback?) {
B.img.setOnClickListener { binding.img.setOnClickListener {
screenshotCallback?.onClick(position) screenshotCallback?.onClick(position)
} }
} }

View File

@@ -21,7 +21,6 @@ package com.aurora.store.view.epoxy.views.details
import android.content.Context import android.content.Context
import android.util.AttributeSet import android.util.AttributeSet
import android.widget.RelativeLayout
import androidx.core.text.HtmlCompat import androidx.core.text.HtmlCompat
import coil.load import coil.load
import com.airbnb.epoxy.ModelProp 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.gplayapi.data.models.details.Badge
import com.aurora.store.R import com.aurora.store.R
import com.aurora.store.databinding.ViewMoreBadgeBinding import com.aurora.store.databinding.ViewMoreBadgeBinding
import com.aurora.store.view.epoxy.views.BaseModel
import com.aurora.store.view.epoxy.views.BaseView import com.aurora.store.view.epoxy.views.BaseView
@ModelView( @ModelView(
autoLayout = ModelView.Size.WRAP_WIDTH_WRAP_HEIGHT, autoLayout = ModelView.Size.WRAP_WIDTH_WRAP_HEIGHT,
baseModelClass = BaseView::class baseModelClass = BaseModel::class
) )
class MoreBadgeView : RelativeLayout { class MoreBadgeView @JvmOverloads constructor(
context: Context?,
private lateinit var B: ViewMoreBadgeBinding attrs: AttributeSet? = null,
defStyleAttr: Int = 0
constructor(context: Context?) : super(context) { ) : BaseView<ViewMoreBadgeBinding>(context, attrs, defStyleAttr) {
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)
}
@ModelProp @ModelProp
fun badge(badge: Badge) { fun badge(badge: Badge) {
B.line1.text = badge.textMajor binding.line1.text = badge.textMajor
badge.textMinorHtml?.let { badge.textMinorHtml?.let {
if (it.isNotEmpty()) { 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 { } else {
B.line2.text = badge.textMinor binding.line2.text = badge.textMinor
} }
} }
badge.textDescription?.let { badge.textDescription?.let {
if (it.isNotEmpty()) { if (it.isNotEmpty()) {
B.line2.text = it binding.line2.text = it
} }
} }
badge.artwork?.let { badge.artwork?.let {
B.img.load(it.url) { binding.img.load(it.url) {
placeholder(R.drawable.ic_arrow_right) 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.content.Context
import android.util.AttributeSet import android.util.AttributeSet
import android.widget.RelativeLayout
import coil.load import coil.load
import coil.transform.RoundedCornersTransformation import coil.transform.RoundedCornersTransformation
import com.airbnb.epoxy.CallbackProp import com.airbnb.epoxy.CallbackProp
@@ -31,61 +30,40 @@ import com.aurora.extensions.toDate
import com.aurora.gplayapi.data.models.Review import com.aurora.gplayapi.data.models.Review
import com.aurora.store.R import com.aurora.store.R
import com.aurora.store.databinding.ViewReviewBinding import com.aurora.store.databinding.ViewReviewBinding
import com.aurora.store.view.epoxy.views.BaseModel
import com.aurora.store.view.epoxy.views.BaseView import com.aurora.store.view.epoxy.views.BaseView
@ModelView( @ModelView(
autoLayout = ModelView.Size.MATCH_WIDTH_WRAP_HEIGHT, autoLayout = ModelView.Size.MATCH_WIDTH_WRAP_HEIGHT,
baseModelClass = BaseView::class baseModelClass = BaseModel::class
) )
class ReviewView : RelativeLayout { class ReviewView @JvmOverloads constructor(
context: Context?,
private lateinit var B: ViewReviewBinding attrs: AttributeSet? = null,
defStyleAttr: Int = 0
constructor(context: Context?) : super(context) { ) : BaseView<ViewReviewBinding>(context, attrs, defStyleAttr) {
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)
}
@ModelProp @ModelProp
fun review(review: Review) { fun review(review: Review) {
B.txtAuthor.text = review.userName binding.txtAuthor.text = review.userName
B.txtTime.text = ("${review.timeStamp.toDate()} • v${review.appVersion}") binding.txtTime.text = ("${review.timeStamp.toDate()} • v${review.appVersion}")
B.txtComment.text = review.comment binding.txtComment.text = review.comment
B.img.load(review.userPhotoUrl) { binding.img.load(review.userPhotoUrl) {
placeholder(R.drawable.bg_placeholder) placeholder(R.drawable.bg_placeholder)
transformations(RoundedCornersTransformation(32F)) transformations(RoundedCornersTransformation(32F))
} }
B.rating.rating = review.rating.toFloat() binding.rating.rating = review.rating.toFloat()
/*if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
B.line2.justificationMode = Layout.JUSTIFICATION_MODE_INTER_WORD
}*/
} }
@CallbackProp @CallbackProp
fun click(onClickListener: OnClickListener?) { fun click(onClickListener: OnClickListener?) {
B.root.setOnClickListener(onClickListener) binding.root.setOnClickListener(onClickListener)
} }
@CallbackProp @CallbackProp
fun longClick(onClickListener: OnLongClickListener?) { 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.content.Context
import android.util.AttributeSet import android.util.AttributeSet
import android.widget.RelativeLayout
import coil.load import coil.load
import coil.transform.RoundedCornersTransformation import coil.transform.RoundedCornersTransformation
import com.airbnb.epoxy.CallbackProp import com.airbnb.epoxy.CallbackProp
@@ -31,15 +30,18 @@ import com.aurora.extensions.px
import com.aurora.gplayapi.data.models.Artwork import com.aurora.gplayapi.data.models.Artwork
import com.aurora.store.R import com.aurora.store.R
import com.aurora.store.databinding.ViewScreenshotBinding import com.aurora.store.databinding.ViewScreenshotBinding
import com.aurora.store.view.epoxy.views.BaseModel
import com.aurora.store.view.epoxy.views.BaseView import com.aurora.store.view.epoxy.views.BaseView
@ModelView( @ModelView(
autoLayout = ModelView.Size.WRAP_WIDTH_WRAP_HEIGHT, autoLayout = ModelView.Size.WRAP_WIDTH_WRAP_HEIGHT,
baseModelClass = BaseView::class baseModelClass = BaseModel::class
) )
class ScreenshotView : RelativeLayout { class ScreenshotView @JvmOverloads constructor(
context: Context?,
private lateinit var B: ViewScreenshotBinding attrs: AttributeSet? = null,
defStyleAttr: Int = 0
) : BaseView<ViewScreenshotBinding>(context, attrs, defStyleAttr) {
private var position: Int = 0 private var position: Int = 0
@@ -47,27 +49,6 @@ class ScreenshotView : RelativeLayout {
fun onClick(position: Int = 0) 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 @ModelProp
fun position(pos: Int) { fun position(pos: Int) {
position = pos position = pos
@@ -76,7 +57,7 @@ class ScreenshotView : RelativeLayout {
@ModelProp @ModelProp
fun artwork(artwork: Artwork) { fun artwork(artwork: Artwork) {
normalizeSize(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) placeholder(R.drawable.bg_rounded)
transformations(RoundedCornersTransformation(8.px.toFloat())) transformations(RoundedCornersTransformation(8.px.toFloat()))
} }
@@ -96,6 +77,7 @@ class ScreenshotView : RelativeLayout {
normalizedHeight = 192f normalizedHeight = 192f
normalizedWidth = 192f normalizedWidth = 192f
} }
else -> { else -> {
val factor = artworkHeight / 192f val factor = artworkHeight / 192f
normalizedHeight = 192f normalizedHeight = 192f
@@ -103,15 +85,15 @@ class ScreenshotView : RelativeLayout {
} }
} }
B.img.layoutParams.height = normalizedHeight.px.toInt() binding.img.layoutParams.height = normalizedHeight.px.toInt()
B.img.layoutParams.width = normalizedWidth.px.toInt() binding.img.layoutParams.width = normalizedWidth.px.toInt()
B.img.requestLayout() binding.img.requestLayout()
} }
} }
@CallbackProp @CallbackProp
fun callback(screenshotCallback: ScreenshotCallback?) { fun callback(screenshotCallback: ScreenshotCallback?) {
B.img.setOnClickListener { binding.img.setOnClickListener {
screenshotCallback?.onClick(position) screenshotCallback?.onClick(position)
} }
} }

View File

@@ -21,54 +21,34 @@ package com.aurora.store.view.epoxy.views.preference
import android.content.Context import android.content.Context
import android.util.AttributeSet import android.util.AttributeSet
import android.widget.RelativeLayout
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
import com.airbnb.epoxy.CallbackProp import com.airbnb.epoxy.CallbackProp
import com.airbnb.epoxy.ModelProp import com.airbnb.epoxy.ModelProp
import com.airbnb.epoxy.ModelView import com.airbnb.epoxy.ModelView
import com.aurora.store.R
import com.aurora.store.data.model.Dash import com.aurora.store.data.model.Dash
import com.aurora.store.databinding.ViewDashBinding import com.aurora.store.databinding.ViewDashBinding
import com.aurora.store.view.epoxy.views.BaseModel
import com.aurora.store.view.epoxy.views.BaseView import com.aurora.store.view.epoxy.views.BaseView
@ModelView( @ModelView(
autoLayout = ModelView.Size.MATCH_WIDTH_WRAP_HEIGHT, autoLayout = ModelView.Size.MATCH_WIDTH_WRAP_HEIGHT,
baseModelClass = BaseView::class baseModelClass = BaseModel::class
) )
class DashView : RelativeLayout { class DashView @JvmOverloads constructor(
context: Context?,
private lateinit var B: ViewDashBinding attrs: AttributeSet? = null,
defStyleAttr: Int = 0
constructor(context: Context?) : super(context) { ) : BaseView<ViewDashBinding>(context, attrs, defStyleAttr) {
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)
}
@ModelProp @ModelProp
fun dash(dash: Dash) { fun dash(dash: Dash) {
B.line1.text = dash.title binding.line1.text = dash.title
B.line2.text = dash.subtitle binding.line2.text = dash.subtitle
B.img.setImageDrawable(ContextCompat.getDrawable(context, dash.icon)) binding.img.setImageDrawable(ContextCompat.getDrawable(context, dash.icon))
} }
@CallbackProp @CallbackProp
fun click(onClickListener: OnClickListener?) { 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.content.Context
import android.util.AttributeSet import android.util.AttributeSet
import android.widget.CompoundButton import android.widget.CompoundButton
import android.widget.RelativeLayout
import com.airbnb.epoxy.CallbackProp import com.airbnb.epoxy.CallbackProp
import com.airbnb.epoxy.ModelProp import com.airbnb.epoxy.ModelProp
import com.airbnb.epoxy.ModelView import com.airbnb.epoxy.ModelView
import com.aurora.store.R import com.aurora.store.R
import com.aurora.store.databinding.ViewDeviceBinding import com.aurora.store.databinding.ViewDeviceBinding
import com.aurora.store.view.epoxy.views.BaseModel
import com.aurora.store.view.epoxy.views.BaseView import com.aurora.store.view.epoxy.views.BaseView
import java.util.Properties import java.util.Properties
@ModelView( @ModelView(
autoLayout = ModelView.Size.MATCH_WIDTH_WRAP_HEIGHT, autoLayout = ModelView.Size.MATCH_WIDTH_WRAP_HEIGHT,
baseModelClass = BaseView::class baseModelClass = BaseModel::class
) )
class DeviceView : RelativeLayout { class DeviceView @JvmOverloads constructor(
context: Context?,
private lateinit var B: ViewDeviceBinding attrs: AttributeSet? = null,
defStyleAttr: Int = 0
constructor(context: Context?) : super(context) { ) : BaseView<ViewDeviceBinding>(context, attrs, defStyleAttr) {
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)
}
@ModelProp @ModelProp
fun properties(properties: Properties) { fun properties(properties: Properties) {
B.line1.text = properties.getProperty("UserReadableName") binding.line1.text = properties.getProperty("UserReadableName")
B.line2.text = resources.getString( binding.line2.text = resources.getString(
R.string.spoof_property, R.string.spoof_property,
properties.getProperty("Build.MANUFACTURER"), properties.getProperty("Build.MANUFACTURER"),
properties.getProperty("Build.VERSION.SDK_INT") properties.getProperty("Build.VERSION.SDK_INT")
) )
B.line3.text = properties.getProperty("Platforms") binding.line3.text = properties.getProperty("Platforms")
} }
@ModelProp @ModelProp
fun markChecked(isChecked: Boolean) { fun markChecked(isChecked: Boolean) {
B.checkbox.isChecked = isChecked binding.checkbox.isChecked = isChecked
} }
@CallbackProp @CallbackProp
fun checked(onCheckedChangeListener: CompoundButton.OnCheckedChangeListener?) { 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.content.Context
import android.util.AttributeSet import android.util.AttributeSet
import android.widget.CompoundButton import android.widget.CompoundButton
import android.widget.RelativeLayout
import com.airbnb.epoxy.CallbackProp import com.airbnb.epoxy.CallbackProp
import com.airbnb.epoxy.ModelProp import com.airbnb.epoxy.ModelProp
import com.airbnb.epoxy.ModelView import com.airbnb.epoxy.ModelView
import com.aurora.store.R
import com.aurora.store.data.model.InstallerInfo import com.aurora.store.data.model.InstallerInfo
import com.aurora.store.databinding.ViewInstallerBinding import com.aurora.store.databinding.ViewInstallerBinding
import com.aurora.store.view.epoxy.views.BaseModel
import com.aurora.store.view.epoxy.views.BaseView import com.aurora.store.view.epoxy.views.BaseView
@ModelView( @ModelView(
autoLayout = ModelView.Size.MATCH_WIDTH_WRAP_HEIGHT, autoLayout = ModelView.Size.MATCH_WIDTH_WRAP_HEIGHT,
baseModelClass = BaseView::class baseModelClass = BaseModel::class
) )
class InstallerView : RelativeLayout { class InstallerView @JvmOverloads constructor(
context: Context?,
private lateinit var B: ViewInstallerBinding attrs: AttributeSet? = null,
defStyleAttr: Int = 0
constructor(context: Context?) : super(context) { ) : BaseView<ViewInstallerBinding>(context, attrs, defStyleAttr) {
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)
}
@ModelProp @ModelProp
fun installer(installer: InstallerInfo) { fun installer(installer: InstallerInfo) {
B.line1.text = installer.title binding.line1.text = installer.title
B.line2.text = installer.subtitle binding.line2.text = installer.subtitle
B.line3.text = installer.description binding.line3.text = installer.description
} }
@ModelProp @ModelProp
fun markChecked(isChecked: Boolean) { fun markChecked(isChecked: Boolean) {
B.radiobutton.isChecked = isChecked binding.radiobutton.isChecked = isChecked
} }
@CallbackProp @CallbackProp
fun checked(onCheckedChangeListener: CompoundButton.OnCheckedChangeListener?) { fun checked(onCheckedChangeListener: CompoundButton.OnCheckedChangeListener?) {
B.radiobutton.setOnCheckedChangeListener(onCheckedChangeListener) binding.radiobutton.setOnCheckedChangeListener(onCheckedChangeListener)
} }
@CallbackProp @CallbackProp
fun click(onClickListener: OnClickListener?) { 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.content.Context
import android.util.AttributeSet import android.util.AttributeSet
import android.widget.RelativeLayout
import coil.load import coil.load
import com.airbnb.epoxy.CallbackProp import com.airbnb.epoxy.CallbackProp
import com.airbnb.epoxy.ModelProp import com.airbnb.epoxy.ModelProp
import com.airbnb.epoxy.ModelView import com.airbnb.epoxy.ModelView
import com.aurora.extensions.hide import com.aurora.extensions.hide
import com.aurora.extensions.show import com.aurora.extensions.show
import com.aurora.store.R
import com.aurora.store.data.model.Link import com.aurora.store.data.model.Link
import com.aurora.store.databinding.ViewLinkBinding import com.aurora.store.databinding.ViewLinkBinding
import com.aurora.store.view.epoxy.views.BaseModel
import com.aurora.store.view.epoxy.views.BaseView import com.aurora.store.view.epoxy.views.BaseView
@ModelView( @ModelView(
autoLayout = ModelView.Size.MATCH_WIDTH_WRAP_HEIGHT, autoLayout = ModelView.Size.MATCH_WIDTH_WRAP_HEIGHT,
baseModelClass = BaseView::class baseModelClass = BaseModel::class
) )
class LinkView : RelativeLayout { class LinkView @JvmOverloads constructor(
context: Context?,
private lateinit var B: ViewLinkBinding attrs: AttributeSet? = null,
defStyleAttr: Int = 0
constructor(context: Context?) : super(context) { ) : BaseView<ViewLinkBinding>(context, attrs, defStyleAttr) {
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)
}
@ModelProp @ModelProp
fun link(link: Link) { fun link(link: Link) {
B.line1.text = link.title binding.line1.text = link.title
B.line2.text = link.subtitle binding.line2.text = link.subtitle
if (link.url.startsWith("http") || link.url.startsWith("upi")) { if (link.url.startsWith("http") || link.url.startsWith("upi")) {
B.line3.hide() binding.line3.hide()
} else { } else {
B.line3.show() binding.line3.show()
B.line3.text = link.url binding.line3.text = link.url
} }
B.imgIcon.load(link.icon) binding.imgIcon.load(link.icon)
} }
@CallbackProp @CallbackProp
fun click(onClickListener: OnClickListener?) { 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.content.Context
import android.util.AttributeSet import android.util.AttributeSet
import android.widget.CompoundButton import android.widget.CompoundButton
import android.widget.RelativeLayout
import com.airbnb.epoxy.CallbackProp import com.airbnb.epoxy.CallbackProp
import com.airbnb.epoxy.ModelProp import com.airbnb.epoxy.ModelProp
import com.airbnb.epoxy.ModelView import com.airbnb.epoxy.ModelView
import com.aurora.store.R
import com.aurora.store.databinding.ViewLocaleBinding import com.aurora.store.databinding.ViewLocaleBinding
import com.aurora.store.view.epoxy.views.BaseModel
import com.aurora.store.view.epoxy.views.BaseView import com.aurora.store.view.epoxy.views.BaseView
import java.util.Locale import java.util.Locale
@ModelView( @ModelView(
autoLayout = ModelView.Size.MATCH_WIDTH_WRAP_HEIGHT, autoLayout = ModelView.Size.MATCH_WIDTH_WRAP_HEIGHT,
baseModelClass = BaseView::class baseModelClass = BaseModel::class
) )
class LocaleView : RelativeLayout { class LocaleView @JvmOverloads constructor(
context: Context?,
private lateinit var B: ViewLocaleBinding attrs: AttributeSet? = null,
defStyleAttr: Int = 0
constructor(context: Context?) : super(context) { ) : BaseView<ViewLocaleBinding>(context, attrs, defStyleAttr) {
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)
}
@ModelProp @ModelProp
fun locale(locale: Locale) { fun locale(locale: Locale) {
B.line1.text = locale.displayName binding.line1.text = locale.displayName
B.line2.text = locale.getDisplayLanguage(locale) binding.line2.text = locale.getDisplayLanguage(locale)
} }
@ModelProp @ModelProp
fun markChecked(isChecked: Boolean) { fun markChecked(isChecked: Boolean) {
B.checkbox.isChecked = isChecked binding.checkbox.isChecked = isChecked
} }
@CallbackProp @CallbackProp
fun checked(onCheckedChangeListener: CompoundButton.OnCheckedChangeListener?) { 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.content.Context
import android.util.AttributeSet import android.util.AttributeSet
import android.widget.RelativeLayout
import com.airbnb.epoxy.CallbackProp import com.airbnb.epoxy.CallbackProp
import com.airbnb.epoxy.ModelProp import com.airbnb.epoxy.ModelProp
import com.airbnb.epoxy.ModelView import com.airbnb.epoxy.ModelView
@@ -29,56 +28,38 @@ import com.aurora.extensions.getString
import com.aurora.store.R import com.aurora.store.R
import com.aurora.store.data.model.Permission import com.aurora.store.data.model.Permission
import com.aurora.store.databinding.ViewPermissionBinding import com.aurora.store.databinding.ViewPermissionBinding
import com.aurora.store.view.epoxy.views.BaseModel
import com.aurora.store.view.epoxy.views.BaseView import com.aurora.store.view.epoxy.views.BaseView
@ModelView( @ModelView(
autoLayout = ModelView.Size.MATCH_WIDTH_WRAP_HEIGHT, autoLayout = ModelView.Size.MATCH_WIDTH_WRAP_HEIGHT,
baseModelClass = BaseView::class baseModelClass = BaseModel::class
) )
class PermissionView : RelativeLayout { class PermissionView @JvmOverloads constructor(
context: Context?,
private lateinit var B: ViewPermissionBinding attrs: AttributeSet? = null,
defStyleAttr: Int = 0
constructor(context: Context?) : super(context) { ) : BaseView<ViewPermissionBinding>(context, attrs, defStyleAttr) {
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)
}
@ModelProp @ModelProp
fun permission(installer: Permission) { fun permission(installer: Permission) {
B.line1.text = installer.title binding.line1.text = installer.title
B.line2.text = installer.subtitle binding.line2.text = installer.subtitle
} }
@ModelProp @ModelProp
fun isGranted(granted: Boolean) { fun isGranted(granted: Boolean) {
if (granted) { if (granted) {
B.btnAction.isEnabled = false binding.btnAction.isEnabled = false
B.btnAction.text = getString(R.string.action_granted) binding.btnAction.text = getString(R.string.action_granted)
} else { } else {
B.btnAction.isEnabled = true binding.btnAction.isEnabled = true
B.btnAction.text = getString(R.string.action_grant) binding.btnAction.text = getString(R.string.action_grant)
} }
} }
@CallbackProp @CallbackProp
fun click(onClickListener: OnClickListener?) { 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.content.Context
import android.util.AttributeSet import android.util.AttributeSet
import com.airbnb.epoxy.ModelView import com.airbnb.epoxy.ModelView
import com.aurora.store.R
import com.aurora.store.databinding.ViewAppListShimmerBinding import com.aurora.store.databinding.ViewAppListShimmerBinding
import com.aurora.store.view.epoxy.views.BaseModel
import com.aurora.store.view.epoxy.views.BaseView import com.aurora.store.view.epoxy.views.BaseView
import com.facebook.shimmer.ShimmerFrameLayout
@ModelView( @ModelView(
autoLayout = ModelView.Size.WRAP_WIDTH_WRAP_HEIGHT, autoLayout = ModelView.Size.WRAP_WIDTH_WRAP_HEIGHT,
baseModelClass = BaseView::class baseModelClass = BaseModel::class
) )
class AppListViewShimmer : ShimmerFrameLayout { class AppListViewShimmer @JvmOverloads constructor(
context: Context?,
private lateinit var B: ViewAppListShimmerBinding attrs: AttributeSet? = null,
defStyleAttr: Int = 0
constructor(context: Context?) : super(context) { ) : BaseView<ViewAppListShimmerBinding>(context, attrs, defStyleAttr)
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)
}
}

View File

@@ -22,37 +22,16 @@ package com.aurora.store.view.epoxy.views.shimmer
import android.content.Context import android.content.Context
import android.util.AttributeSet import android.util.AttributeSet
import com.airbnb.epoxy.ModelView import com.airbnb.epoxy.ModelView
import com.aurora.store.R
import com.aurora.store.databinding.ViewAppShimmerBinding import com.aurora.store.databinding.ViewAppShimmerBinding
import com.aurora.store.view.epoxy.views.BaseModel
import com.aurora.store.view.epoxy.views.BaseView import com.aurora.store.view.epoxy.views.BaseView
import com.facebook.shimmer.ShimmerFrameLayout
@ModelView( @ModelView(
autoLayout = ModelView.Size.WRAP_WIDTH_WRAP_HEIGHT, autoLayout = ModelView.Size.WRAP_WIDTH_WRAP_HEIGHT,
baseModelClass = BaseView::class baseModelClass = BaseModel::class
) )
class AppViewShimmer : ShimmerFrameLayout { class AppViewShimmer @JvmOverloads constructor(
context: Context?,
private lateinit var B: ViewAppShimmerBinding attrs: AttributeSet? = null,
defStyleAttr: Int = 0
constructor(context: Context?) : super(context) { ) : BaseView<ViewAppShimmerBinding>(context, attrs, defStyleAttr)
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)
}
}

View File

@@ -22,37 +22,16 @@ package com.aurora.store.view.epoxy.views.shimmer
import android.content.Context import android.content.Context
import android.util.AttributeSet import android.util.AttributeSet
import com.airbnb.epoxy.ModelView import com.airbnb.epoxy.ModelView
import com.aurora.store.R
import com.aurora.store.databinding.ViewHeaderShimmerBinding import com.aurora.store.databinding.ViewHeaderShimmerBinding
import com.aurora.store.view.epoxy.views.BaseModel
import com.aurora.store.view.epoxy.views.BaseView import com.aurora.store.view.epoxy.views.BaseView
import com.facebook.shimmer.ShimmerFrameLayout
@ModelView( @ModelView(
autoLayout = ModelView.Size.WRAP_WIDTH_WRAP_HEIGHT, autoLayout = ModelView.Size.WRAP_WIDTH_WRAP_HEIGHT,
baseModelClass = BaseView::class baseModelClass = BaseModel::class
) )
class HeaderViewShimmer : ShimmerFrameLayout { class HeaderViewShimmer @JvmOverloads constructor(
context: Context?,
private lateinit var B: ViewHeaderShimmerBinding attrs: AttributeSet? = null,
defStyleAttr: Int = 0
constructor(context: Context?) : super(context) { ) : BaseView<ViewHeaderShimmerBinding>(context, attrs, defStyleAttr)
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)
}
}

View File

@@ -29,7 +29,7 @@ import androidx.navigation.fragment.findNavController
import androidx.viewpager2.adapter.FragmentStateAdapter import androidx.viewpager2.adapter.FragmentStateAdapter
import com.aurora.store.R import com.aurora.store.R
import com.aurora.store.data.providers.AuthProvider 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.aurora.store.view.ui.commons.BaseFragment
import com.google.android.material.tabs.TabLayout import com.google.android.material.tabs.TabLayout
import com.google.android.material.tabs.TabLayoutMediator import com.google.android.material.tabs.TabLayoutMediator
@@ -37,7 +37,7 @@ import dagger.hilt.android.AndroidEntryPoint
import javax.inject.Inject import javax.inject.Inject
@AndroidEntryPoint @AndroidEntryPoint
class AppsGamesFragment : BaseFragment<ActivityGenericPagerBinding>() { class AppsGamesFragment : BaseFragment<FragmentGenericWithPagerBinding>() {
@Inject @Inject
lateinit var authProvider: AuthProvider lateinit var authProvider: AuthProvider

View File

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

View File

@@ -27,7 +27,7 @@ import androidx.navigation.fragment.findNavController
import com.aurora.gplayapi.data.models.App import com.aurora.gplayapi.data.models.App
import com.aurora.store.R import com.aurora.store.R
import com.aurora.store.data.providers.BlacklistProvider 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.BlackListViewModel_
import com.aurora.store.view.epoxy.views.shimmer.AppListViewShimmerModel_ import com.aurora.store.view.epoxy.views.shimmer.AppListViewShimmerModel_
import com.aurora.store.viewmodel.all.BlacklistViewModel import com.aurora.store.viewmodel.all.BlacklistViewModel
@@ -35,7 +35,7 @@ import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
@AndroidEntryPoint @AndroidEntryPoint
class BlacklistFragment : BaseFragment<ActivityGenericRecyclerBinding>() { class BlacklistFragment : BaseFragment<FragmentGenericWithToolbarBinding>() {
private val viewModel: BlacklistViewModel by activityViewModels() private val viewModel: BlacklistViewModel by activityViewModels()
private lateinit var blacklistProvider: BlacklistProvider 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.gplayapi.helpers.contracts.StreamContract
import com.aurora.store.data.model.ViewState import com.aurora.store.data.model.ViewState
import com.aurora.store.data.model.ViewState.Loading.getDataAs 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.custom.recycler.EndlessRecyclerOnScrollListener
import com.aurora.store.view.epoxy.controller.CategoryCarouselController import com.aurora.store.view.epoxy.controller.CategoryCarouselController
import com.aurora.store.view.epoxy.controller.GenericCarouselController import com.aurora.store.view.epoxy.controller.GenericCarouselController
@@ -38,7 +38,7 @@ import com.aurora.store.viewmodel.subcategory.SubCategoryClusterViewModel
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
@AndroidEntryPoint @AndroidEntryPoint
class CategoryBrowseFragment : BaseFragment<ActivityGenericRecyclerBinding>(), class CategoryBrowseFragment : BaseFragment<FragmentGenericWithToolbarBinding>(),
GenericCarouselController.Callbacks { GenericCarouselController.Callbacks {
private val args: CategoryBrowseFragmentArgs by navArgs() private val args: CategoryBrowseFragmentArgs by navArgs()
private val viewModel: SubCategoryClusterViewModel by activityViewModels() private val viewModel: SubCategoryClusterViewModel by activityViewModels()

View File

@@ -26,7 +26,7 @@ import androidx.navigation.fragment.findNavController
import androidx.navigation.fragment.navArgs import androidx.navigation.fragment.navArgs
import com.airbnb.epoxy.EpoxyModel import com.airbnb.epoxy.EpoxyModel
import com.aurora.gplayapi.data.models.App 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.groups.CarouselHorizontalModel_
import com.aurora.store.view.epoxy.views.EditorHeadViewModel_ import com.aurora.store.view.epoxy.views.EditorHeadViewModel_
import com.aurora.store.view.epoxy.views.HorizontalDividerViewModel_ import com.aurora.store.view.epoxy.views.HorizontalDividerViewModel_
@@ -38,7 +38,7 @@ import com.aurora.store.viewmodel.editorschoice.EditorBrowseViewModel
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
@AndroidEntryPoint @AndroidEntryPoint
class EditorStreamBrowseFragment : BaseFragment<ActivityGenericRecyclerBinding>() { class EditorStreamBrowseFragment : BaseFragment<FragmentGenericWithToolbarBinding>() {
private val args: EditorStreamBrowseFragmentArgs by navArgs() private val args: EditorStreamBrowseFragmentArgs by navArgs()
private val viewModel: EditorBrowseViewModel by viewModels() private val viewModel: EditorBrowseViewModel by viewModels()

View File

@@ -26,7 +26,7 @@ import androidx.navigation.fragment.findNavController
import androidx.navigation.fragment.navArgs import androidx.navigation.fragment.navArgs
import com.airbnb.epoxy.EpoxyModel import com.airbnb.epoxy.EpoxyModel
import com.aurora.gplayapi.data.models.StreamCluster 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.custom.recycler.EndlessRecyclerOnScrollListener
import com.aurora.store.view.epoxy.groups.CarouselHorizontalModel_ import com.aurora.store.view.epoxy.groups.CarouselHorizontalModel_
import com.aurora.store.view.epoxy.views.AppProgressViewModel_ import com.aurora.store.view.epoxy.views.AppProgressViewModel_
@@ -38,7 +38,7 @@ import com.aurora.store.viewmodel.browse.ExpandedStreamBrowseViewModel
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
@AndroidEntryPoint @AndroidEntryPoint
class ExpandedStreamBrowseFragment : BaseFragment<ActivityGenericRecyclerBinding>() { class ExpandedStreamBrowseFragment : BaseFragment<FragmentGenericWithToolbarBinding>() {
private val args: ExpandedStreamBrowseFragmentArgs by navArgs() private val args: ExpandedStreamBrowseFragmentArgs by navArgs()
private val viewModel: ExpandedStreamBrowseViewModel by viewModels() 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.findNavController
import androidx.navigation.fragment.navArgs import androidx.navigation.fragment.navArgs
import com.aurora.gplayapi.data.models.StreamCluster 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.custom.recycler.EndlessRecyclerOnScrollListener
import com.aurora.store.view.epoxy.views.AppProgressViewModel_ import com.aurora.store.view.epoxy.views.AppProgressViewModel_
import com.aurora.store.view.epoxy.views.app.AppListViewModel_ 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 import dagger.hilt.android.AndroidEntryPoint
@AndroidEntryPoint @AndroidEntryPoint
class StreamBrowseFragment : BaseFragment<ActivityGenericRecyclerBinding>() { class StreamBrowseFragment : BaseFragment<FragmentGenericWithToolbarBinding>() {
private val args: StreamBrowseFragmentArgs by navArgs() private val args: StreamBrowseFragmentArgs by navArgs()
private val viewModel: StreamBrowseViewModel by viewModels() 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.os.Bundle
import android.view.View import android.view.View
import androidx.fragment.app.Fragment
import androidx.navigation.fragment.findNavController import androidx.navigation.fragment.findNavController
import androidx.navigation.fragment.navArgs import androidx.navigation.fragment.navArgs
import com.aurora.Constants import com.aurora.Constants
@@ -29,8 +28,7 @@ import com.aurora.extensions.browse
import com.aurora.store.R import com.aurora.store.R
import com.aurora.store.data.model.ExodusTracker import com.aurora.store.data.model.ExodusTracker
import com.aurora.store.data.model.Report import com.aurora.store.data.model.Report
import com.aurora.store.databinding.ActivityGenericPagerBinding import com.aurora.store.databinding.FragmentGenericWithToolbarBinding
import com.aurora.store.databinding.ActivityGenericRecyclerBinding
import com.aurora.store.view.epoxy.views.HeaderViewModel_ import com.aurora.store.view.epoxy.views.HeaderViewModel_
import com.aurora.store.view.epoxy.views.details.ExodusViewModel_ import com.aurora.store.view.epoxy.views.details.ExodusViewModel_
import com.aurora.store.view.ui.commons.BaseFragment import com.aurora.store.view.ui.commons.BaseFragment
@@ -39,7 +37,7 @@ import org.json.JSONObject
import javax.inject.Inject import javax.inject.Inject
@AndroidEntryPoint @AndroidEntryPoint
class DetailsExodusFragment : BaseFragment<ActivityGenericRecyclerBinding>() { class DetailsExodusFragment : BaseFragment<FragmentGenericWithToolbarBinding>() {
private val args: DetailsExodusFragmentArgs by navArgs() 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.findNavController
import androidx.navigation.fragment.navArgs import androidx.navigation.fragment.navArgs
import com.aurora.gplayapi.data.models.SearchBundle import com.aurora.gplayapi.data.models.SearchBundle
import com.aurora.store.R import com.aurora.store.databinding.FragmentGenericWithToolbarBinding
import com.aurora.store.databinding.ActivityGenericRecyclerBinding
import com.aurora.store.view.custom.recycler.EndlessRecyclerOnScrollListener import com.aurora.store.view.custom.recycler.EndlessRecyclerOnScrollListener
import com.aurora.store.view.epoxy.views.AppProgressViewModel_ import com.aurora.store.view.epoxy.views.AppProgressViewModel_
import com.aurora.store.view.epoxy.views.app.AppListViewModel_ 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 import dagger.hilt.android.AndroidEntryPoint
@AndroidEntryPoint @AndroidEntryPoint
class DevAppsFragment : BaseFragment<ActivityGenericRecyclerBinding>() { class DevAppsFragment : BaseFragment<FragmentGenericWithToolbarBinding>() {
private val args: DevAppsFragmentArgs by navArgs() private val args: DevAppsFragmentArgs by navArgs()
private val viewModel: SearchResultViewModel by viewModels() private val viewModel: SearchResultViewModel by viewModels()
@@ -73,15 +72,15 @@ class DevAppsFragment : BaseFragment<ActivityGenericRecyclerBinding>() {
searchBundle.appList searchBundle.appList
.filter { it.displayName.isNotEmpty() } .filter { it.displayName.isNotEmpty() }
.forEach { app -> .forEach { app ->
add( add(
AppListViewModel_() AppListViewModel_()
.id(app.id) .id(app.id)
.app(app) .app(app)
.click(View.OnClickListener { .click(View.OnClickListener {
openDetailsFragment(app.packageName, app) openDetailsFragment(app.packageName, app)
}) })
) )
} }
if (searchBundle.subBundles.isNotEmpty()) { if (searchBundle.subBundles.isNotEmpty()) {
add( add(

View File

@@ -24,7 +24,7 @@ import android.view.View
import androidx.fragment.app.viewModels import androidx.fragment.app.viewModels
import androidx.navigation.fragment.findNavController import androidx.navigation.fragment.findNavController
import com.aurora.store.R 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.custom.recycler.EndlessRecyclerOnScrollListener
import com.aurora.store.view.epoxy.views.AppProgressViewModel_ import com.aurora.store.view.epoxy.views.AppProgressViewModel_
import com.aurora.store.view.epoxy.views.HeaderViewModel_ import com.aurora.store.view.epoxy.views.HeaderViewModel_
@@ -37,7 +37,7 @@ import com.aurora.store.viewmodel.sale.AppSalesViewModel
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
@AndroidEntryPoint @AndroidEntryPoint
class AppSalesFragment : BaseFragment<ActivityGenericRecyclerBinding>() { class AppSalesFragment : BaseFragment<FragmentGenericWithToolbarBinding>() {
private val viewModel: AppSalesViewModel by viewModels() private val viewModel: AppSalesViewModel by viewModels()

View File

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

View File

@@ -23,7 +23,6 @@ import android.content.pm.PackageManager
import android.content.pm.PermissionInfo import android.content.pm.PermissionInfo
import android.os.Bundle import android.os.Bundle
import android.view.View import android.view.View
import android.widget.LinearLayout
import androidx.navigation.fragment.navArgs import androidx.navigation.fragment.navArgs
import com.aurora.extensions.hide import com.aurora.extensions.hide
import com.aurora.extensions.show import com.aurora.extensions.show
@@ -53,8 +52,7 @@ class PermissionBottomSheet : BaseDialogSheet<SheetPermissionsBinding>() {
emptyList() emptyList()
} }
val permissionGroupWidgets: MutableMap<String, PermissionGroup?> = val permissionGroupWidgets: MutableMap<String, PermissionGroup?> = mutableMapOf()
HashMap<String, PermissionGroup?>()
for (permissionName in args.app.permissions) { for (permissionName in args.app.permissions) {
val permissionInfo = getPermissionInfo(permissionName) ?: continue val permissionInfo = getPermissionInfo(permissionName) ?: continue
@@ -64,12 +62,7 @@ class PermissionBottomSheet : BaseDialogSheet<SheetPermissionsBinding>() {
if (permissionGroupWidgets.containsKey(permissionGroupInfo.name)) { if (permissionGroupWidgets.containsKey(permissionGroupInfo.name)) {
permissionGroup = permissionGroupWidgets[permissionGroupInfo.name] permissionGroup = permissionGroupWidgets[permissionGroupInfo.name]
} else { } else {
permissionGroup = PermissionGroup(context) permissionGroup = PermissionGroup(context, permissionGroupInfo)
permissionGroup.setPermissionGroupInfo(permissionGroupInfo)
permissionGroup.layoutParams = LinearLayout.LayoutParams(
LinearLayout.LayoutParams.WRAP_CONTENT,
LinearLayout.LayoutParams.WRAP_CONTENT
)
permissionGroupWidgets[permissionGroupInfo.name] = permissionGroup permissionGroupWidgets[permissionGroupInfo.name] = permissionGroup
} }

View File

@@ -34,7 +34,7 @@ import androidx.viewpager2.adapter.FragmentStateAdapter
import com.aurora.extensions.toast import com.aurora.extensions.toast
import com.aurora.store.R import com.aurora.store.R
import com.aurora.store.data.providers.NativeDeviceInfoProvider 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.util.PathUtil
import com.aurora.store.view.ui.commons.BaseFragment import com.aurora.store.view.ui.commons.BaseFragment
import com.google.android.material.tabs.TabLayout import com.google.android.material.tabs.TabLayout
@@ -42,7 +42,7 @@ import com.google.android.material.tabs.TabLayoutMediator
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
@AndroidEntryPoint @AndroidEntryPoint
class SpoofFragment : BaseFragment<ActivityGenericPagerBinding>() { class SpoofFragment : BaseFragment<FragmentGenericWithPagerBinding>() {
private val TAG = SpoofFragment::class.java.simpleName private val TAG = SpoofFragment::class.java.simpleName
// Android is weird, even if export device config with proper mime type, it will refuse to open // Android is weird, even if export device config with proper mime type, it will refuse to open

View File

@@ -77,27 +77,27 @@
android:id="@+id/appsGamesFragment" android:id="@+id/appsGamesFragment"
android:name="com.aurora.store.view.ui.all.AppsGamesFragment" android:name="com.aurora.store.view.ui.all.AppsGamesFragment"
android:label="@string/title_apps_games" android:label="@string/title_apps_games"
tools:layout="@layout/activity_generic_pager" /> tools:layout="@layout/fragment_generic_with_pager" />
<fragment <fragment
android:id="@+id/appSalesFragment" android:id="@+id/appSalesFragment"
android:name="com.aurora.store.view.ui.sale.AppSalesFragment" android:name="com.aurora.store.view.ui.sale.AppSalesFragment"
android:label="@string/title_apps_sale" android:label="@string/title_apps_sale"
tools:layout="@layout/activity_generic_recycler" /> tools:layout="@layout/fragment_generic_with_toolbar" />
<fragment <fragment
android:id="@+id/spoofFragment" android:id="@+id/spoofFragment"
android:name="com.aurora.store.view.ui.spoof.SpoofFragment" android:name="com.aurora.store.view.ui.spoof.SpoofFragment"
android:label="@string/title_spoof_manager" android:label="@string/title_spoof_manager"
tools:layout="@layout/activity_generic_pager" /> tools:layout="@layout/fragment_generic_with_pager" />
<fragment <fragment
android:id="@+id/favouriteFragment" android:id="@+id/favouriteFragment"
android:name="com.aurora.store.view.ui.commons.FavouriteFragment" android:name="com.aurora.store.view.ui.commons.FavouriteFragment"
android:label="@string/title_favourites_manager" android:label="@string/title_favourites_manager"
tools:layout="@layout/activity_generic_recycler" /> tools:layout="@layout/fragment_generic_with_toolbar" />
<fragment <fragment
android:id="@+id/blacklistFragment" android:id="@+id/blacklistFragment"
android:name="com.aurora.store.view.ui.commons.BlacklistFragment" android:name="com.aurora.store.view.ui.commons.BlacklistFragment"
android:label="@string/title_blacklist_manager" android:label="@string/title_blacklist_manager"
tools:layout="@layout/activity_generic_recycler" /> tools:layout="@layout/fragment_generic_with_toolbar" />
<fragment <fragment
android:id="@+id/accountFragment" android:id="@+id/accountFragment"
android:name="com.aurora.store.view.ui.account.AccountFragment" android:name="com.aurora.store.view.ui.account.AccountFragment"
@@ -209,7 +209,7 @@
<fragment <fragment
android:id="@+id/categoryBrowseFragment" android:id="@+id/categoryBrowseFragment"
android:name="com.aurora.store.view.ui.commons.CategoryBrowseFragment" android:name="com.aurora.store.view.ui.commons.CategoryBrowseFragment"
tools:layout="@layout/activity_generic_recycler" > tools:layout="@layout/fragment_generic_with_toolbar" >
<argument <argument
android:name="title" android:name="title"
app:argType="string" /> app:argType="string" />
@@ -223,7 +223,7 @@
<fragment <fragment
android:id="@+id/editorStreamBrowseFragment" android:id="@+id/editorStreamBrowseFragment"
android:name="com.aurora.store.view.ui.commons.EditorStreamBrowseFragment" android:name="com.aurora.store.view.ui.commons.EditorStreamBrowseFragment"
tools:layout="@layout/activity_generic_recycler" > tools:layout="@layout/fragment_generic_with_toolbar" >
<argument android:name="title" <argument android:name="title"
app:argType="string" /> app:argType="string" />
<argument <argument
@@ -233,7 +233,7 @@
<fragment <fragment
android:id="@+id/expandedStreamBrowseFragment" android:id="@+id/expandedStreamBrowseFragment"
android:name="com.aurora.store.view.ui.commons.ExpandedStreamBrowseFragment" android:name="com.aurora.store.view.ui.commons.ExpandedStreamBrowseFragment"
tools:layout="@layout/activity_generic_recycler" > tools:layout="@layout/fragment_generic_with_toolbar" >
<argument android:name="title" <argument android:name="title"
app:argType="string" /> app:argType="string" />
<argument <argument
@@ -271,7 +271,7 @@
<fragment <fragment
android:id="@+id/streamBrowseFragment" android:id="@+id/streamBrowseFragment"
android:name="com.aurora.store.view.ui.commons.StreamBrowseFragment" android:name="com.aurora.store.view.ui.commons.StreamBrowseFragment"
tools:layout="@layout/activity_generic_recycler" > tools:layout="@layout/fragment_generic_with_toolbar" >
<argument <argument
android:name="browseUrl" android:name="browseUrl"
app:argType="string" /> app:argType="string" />
@@ -282,7 +282,7 @@
<fragment <fragment
android:id="@+id/devAppsFragment" android:id="@+id/devAppsFragment"
android:name="com.aurora.store.view.ui.details.DevAppsFragment" android:name="com.aurora.store.view.ui.details.DevAppsFragment"
tools:layout="@layout/activity_generic_recycler" > tools:layout="@layout/fragment_generic_with_toolbar" >
<argument <argument
android:name="developerName" android:name="developerName"
app:argType="string" /> app:argType="string" />
@@ -308,7 +308,7 @@
<fragment <fragment
android:id="@+id/detailsExodusFragment" android:id="@+id/detailsExodusFragment"
android:name="com.aurora.store.view.ui.details.DetailsExodusFragment" android:name="com.aurora.store.view.ui.details.DetailsExodusFragment"
tools:layout="@layout/activity_generic_recycler" > tools:layout="@layout/fragment_generic_with_toolbar" >
<argument <argument
android:name="displayName" android:name="displayName"
app:argType="string" /> app:argType="string" />