diff --git a/app/src/main/java/com/aurora/store/view/epoxy/controller/EditorChoiceController.kt b/app/src/main/java/com/aurora/store/view/epoxy/controller/EditorChoiceController.kt index 094899f8a..9dd885e97 100644 --- a/app/src/main/java/com/aurora/store/view/epoxy/controller/EditorChoiceController.kt +++ b/app/src/main/java/com/aurora/store/view/epoxy/controller/EditorChoiceController.kt @@ -23,7 +23,6 @@ import com.airbnb.epoxy.TypedEpoxyController import com.aurora.gplayapi.data.models.editor.EditorChoiceBundle import com.aurora.gplayapi.data.models.editor.EditorChoiceCluster import com.aurora.store.view.epoxy.groups.EditorChoiceModelGroup -import com.aurora.store.view.epoxy.views.EditorHeadViewModel_ import com.aurora.store.view.epoxy.views.HeaderViewModel_ class EditorChoiceController(private val callbacks: Callbacks) : diff --git a/app/src/main/java/com/aurora/store/view/epoxy/groups/EditorChoiceModelGroup.kt b/app/src/main/java/com/aurora/store/view/epoxy/groups/EditorChoiceModelGroup.kt index 10596d044..7387be4b2 100644 --- a/app/src/main/java/com/aurora/store/view/epoxy/groups/EditorChoiceModelGroup.kt +++ b/app/src/main/java/com/aurora/store/view/epoxy/groups/EditorChoiceModelGroup.kt @@ -48,21 +48,32 @@ class EditorChoiceModelGroup( val idPrefix = editorChoiceCluster.id + + models.add( + EditorImageViewModel_() + .id("artwork_header_${idPrefix}") + .artwork(editorChoiceCluster.clusterArtwork[0]) + .click { _ -> callbacks.onClick(editorChoiceCluster) } + + ) + models.add( EditorHeadViewModel_() .id("header_${idPrefix}") .title(editorChoiceCluster.clusterTitle) ) - editorChoiceCluster.clusterArtwork.forEach { - clusterViewModels.add( - EditorImageViewModel_() - .id("artwork_${idPrefix}") - .artwork(it) - .click { _ -> callbacks.onClick(editorChoiceCluster) } + editorChoiceCluster.clusterArtwork + .drop(1) + .forEach { + clusterViewModels.add( + EditorImageViewModel_() + .id("artwork_${idPrefix}_${it.url}") + .artwork(it) + .click { _ -> callbacks.onClick(editorChoiceCluster) } - ) - } + ) + } models.add( CarouselHorizontalModel_() diff --git a/app/src/main/java/com/aurora/store/view/epoxy/views/EditorImageView.kt b/app/src/main/java/com/aurora/store/view/epoxy/views/EditorImageView.kt index 95f80d964..89e79eca9 100644 --- a/app/src/main/java/com/aurora/store/view/epoxy/views/EditorImageView.kt +++ b/app/src/main/java/com/aurora/store/view/epoxy/views/EditorImageView.kt @@ -20,6 +20,7 @@ package com.aurora.store.view.epoxy.views import android.content.Context +import android.content.res.Resources import android.util.AttributeSet import android.widget.RelativeLayout import com.airbnb.epoxy.CallbackProp @@ -31,6 +32,7 @@ import com.aurora.store.R import com.aurora.store.databinding.ViewEditorImageBinding import com.aurora.store.util.extensions.clear import com.aurora.store.util.extensions.load +import com.aurora.store.util.extensions.px import com.bumptech.glide.load.resource.bitmap.RoundedCorners import com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions @@ -67,18 +69,20 @@ class EditorImageView : RelativeLayout { fun artwork(artwork: Artwork) { when (artwork.type) { 14 -> { - B.img.layoutParams.width = - resources.getDimension(R.dimen.icon_size_large).toInt() * 2 + B.img.layoutParams.height = 108.px.toInt() + B.img.layoutParams.width = 192.px.toInt() B.img.requestLayout() + B.img.load(artwork.url, DrawableTransitionOptions.withCrossFade()) { - transform(RoundedCorners(16)) + transform(RoundedCorners(8.px.toInt())) } } else -> { - B.img.layoutParams.width = resources.getDimension(R.dimen.icon_size_large).toInt() + B.img.layoutParams.width = 24.px.toInt() + B.img.layoutParams.height = 24.px.toInt() B.img.requestLayout() B.img.load(artwork.url, DrawableTransitionOptions.withCrossFade()) { - transform(RoundedCorners(16)) + transform(RoundedCorners(4.px.toInt())) } } } diff --git a/app/src/main/java/com/aurora/store/view/epoxy/views/details/MiniScreenshotView.kt b/app/src/main/java/com/aurora/store/view/epoxy/views/details/MiniScreenshotView.kt new file mode 100644 index 000000000..205006f81 --- /dev/null +++ b/app/src/main/java/com/aurora/store/view/epoxy/views/details/MiniScreenshotView.kt @@ -0,0 +1,126 @@ +/* + * Aurora Store + * Copyright (C) 2021, Rahul Kumar Patel + * + * Aurora Store is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * Aurora Store is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Aurora Store. If not, see . + * + */ + +package com.aurora.store.view.epoxy.views.details + +import android.content.Context +import android.util.AttributeSet +import android.widget.RelativeLayout +import com.airbnb.epoxy.CallbackProp +import com.airbnb.epoxy.ModelProp +import com.airbnb.epoxy.ModelView +import com.airbnb.epoxy.OnViewRecycled +import com.aurora.gplayapi.data.models.Artwork +import com.aurora.store.R +import com.aurora.store.databinding.ViewScreenshotMiniBinding +import com.aurora.store.util.extensions.clear +import com.aurora.store.util.extensions.load +import com.aurora.store.util.extensions.px +import com.aurora.store.view.epoxy.views.BaseView +import com.bumptech.glide.load.resource.bitmap.RoundedCorners +import com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions + +@ModelView( + autoLayout = ModelView.Size.WRAP_WIDTH_WRAP_HEIGHT, + baseModelClass = BaseView::class +) +class MiniScreenshotView : RelativeLayout { + + private lateinit var B: ViewScreenshotMiniBinding + + private var position: Int = 0 + + interface ScreenshotCallback { + fun onClick(position: Int = 0) + } + + constructor(context: Context?) : super(context) { + init(context, null) + } + + constructor(context: Context?, attrs: AttributeSet?) : super(context, attrs) { + init(context, attrs) + } + + constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int) : super( + context, + attrs, + defStyleAttr + ) { + init(context, attrs) + } + + private fun init(context: Context?, attrs: AttributeSet?) { + val view = inflate(context, R.layout.view_screenshot_mini, this) + B = ViewScreenshotMiniBinding.bind(view) + } + + @ModelProp + fun position(pos: Int) { + position = pos + } + + @ModelProp + fun artwork(artwork: Artwork) { + normalizeSize(artwork) + B.img.load("${artwork.url}=rw-w480-v1-e15", DrawableTransitionOptions.withCrossFade()) { + placeholder(R.drawable.bg_rounded) + transform(RoundedCorners(8.px.toInt())) + } + } + + private fun normalizeSize(artwork: Artwork) { + if (artwork.height != 0 && artwork.width != 0) { + + val artworkHeight = artwork.height + val artworkWidth = artwork.width + + val normalizedHeight: Float + val normalizedWidth: Float + + when { + artworkHeight == artworkWidth -> { + normalizedHeight = 120f + normalizedWidth = 120f + } + else -> { + val factor = artworkHeight / 120f + normalizedHeight = 120f + normalizedWidth = (artworkWidth / factor) + } + } + + B.img.layoutParams.height = normalizedHeight.px.toInt() + B.img.layoutParams.width = normalizedWidth.px.toInt() + B.img.requestLayout() + } + } + + @CallbackProp + fun callback(screenshotCallback: ScreenshotCallback?) { + B.img.setOnClickListener { + screenshotCallback?.onClick(position) + } + } + + @OnViewRecycled + fun clear() { + B.img.clear() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/aurora/store/view/ui/commons/BaseActivity.kt b/app/src/main/java/com/aurora/store/view/ui/commons/BaseActivity.kt index 76410ac11..62e99c215 100644 --- a/app/src/main/java/com/aurora/store/view/ui/commons/BaseActivity.kt +++ b/app/src/main/java/com/aurora/store/view/ui/commons/BaseActivity.kt @@ -34,10 +34,7 @@ import com.aurora.store.util.Preferences.PREFERENCE_THEME_TYPE import com.aurora.store.util.ViewUtil import com.aurora.store.util.extensions.applyTheme import com.aurora.store.view.ui.account.GoogleActivity -import com.aurora.store.view.ui.details.AppDetailsActivity -import com.aurora.store.view.ui.details.DetailsMoreActivity -import com.aurora.store.view.ui.details.DetailsReviewActivity -import com.aurora.store.view.ui.details.DevProfileActivity +import com.aurora.store.view.ui.details.* import com.aurora.store.view.ui.sheets.NetworkDialogSheet import com.google.gson.Gson import com.google.gson.GsonBuilder @@ -115,6 +112,23 @@ abstract class BaseActivity : AppCompatActivity(), NetworkProvider.NetworkListen ) } + fun openScreenshotActivity(app: App, position: Int) { + val intent = Intent( + this, + ScreenshotActivity::class.java + ).apply { + putExtra(Constants.STRING_EXTRA, gson.toJson(app.screenshots)) + putExtra(Constants.INT_EXTRA, position) + } + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + val options = + ActivityOptions.makeSceneTransitionAnimation(this) + startActivity(intent, options.toBundle()) + } else { + startActivity(intent) + } + } + fun openGoogleActivity() { val intent = Intent(this, GoogleActivity::class.java) startActivity( diff --git a/app/src/main/java/com/aurora/store/view/ui/commons/EditorStreamBrowseActivity.kt b/app/src/main/java/com/aurora/store/view/ui/commons/EditorStreamBrowseActivity.kt index 3f39e2631..632f78821 100644 --- a/app/src/main/java/com/aurora/store/view/ui/commons/EditorStreamBrowseActivity.kt +++ b/app/src/main/java/com/aurora/store/view/ui/commons/EditorStreamBrowseActivity.kt @@ -21,11 +21,15 @@ package com.aurora.store.view.ui.commons import android.os.Bundle import androidx.lifecycle.ViewModelProvider +import com.airbnb.epoxy.EpoxyModel import com.aurora.Constants import com.aurora.gplayapi.data.models.App import com.aurora.store.databinding.ActivityGenericRecyclerBinding import com.aurora.store.util.extensions.close +import com.aurora.store.view.epoxy.groups.CarouselHorizontalModel_ import com.aurora.store.view.epoxy.views.app.AppListViewModel_ +import com.aurora.store.view.epoxy.views.details.MiniScreenshotView +import com.aurora.store.view.epoxy.views.details.MiniScreenshotViewModel_ import com.aurora.store.view.epoxy.views.shimmer.AppListViewShimmerModel_ import com.aurora.store.viewmodel.editorschoice.EditorBrowseViewModel @@ -92,6 +96,29 @@ class EditorStreamBrowseActivity : BaseActivity() { } } else { appList.forEach { + val screenshotsViewModels = mutableListOf>() + + for ((position, artwork) in it.screenshots.withIndex()) { + screenshotsViewModels.add( + MiniScreenshotViewModel_() + .id(artwork.url) + .position(position) + .artwork(artwork) + .callback(object : MiniScreenshotView.ScreenshotCallback { + override fun onClick(position: Int) { + openScreenshotActivity(it, position) + } + }) + ) + } + + if (screenshotsViewModels.isNotEmpty()) { + add( + CarouselHorizontalModel_() + .id("${it.id}_screenshots") + .models(screenshotsViewModels) + ) + } add( AppListViewModel_() diff --git a/app/src/main/java/com/aurora/store/view/ui/commons/ExpandedStreamBrowseActivity.kt b/app/src/main/java/com/aurora/store/view/ui/commons/ExpandedStreamBrowseActivity.kt index 48550f9f6..c03fa5a56 100644 --- a/app/src/main/java/com/aurora/store/view/ui/commons/ExpandedStreamBrowseActivity.kt +++ b/app/src/main/java/com/aurora/store/view/ui/commons/ExpandedStreamBrowseActivity.kt @@ -21,13 +21,17 @@ package com.aurora.store.view.ui.commons import android.os.Bundle import androidx.lifecycle.ViewModelProvider +import com.airbnb.epoxy.EpoxyModel import com.aurora.Constants import com.aurora.gplayapi.data.models.StreamCluster import com.aurora.store.databinding.ActivityGenericRecyclerBinding import com.aurora.store.util.extensions.close import com.aurora.store.view.custom.recycler.EndlessRecyclerOnScrollListener +import com.aurora.store.view.epoxy.groups.CarouselHorizontalModel_ import com.aurora.store.view.epoxy.views.AppProgressViewModel_ import com.aurora.store.view.epoxy.views.app.AppListViewModel_ +import com.aurora.store.view.epoxy.views.details.MiniScreenshotView +import com.aurora.store.view.epoxy.views.details.MiniScreenshotViewModel_ import com.aurora.store.view.epoxy.views.shimmer.AppListViewShimmerModel_ import com.aurora.store.viewmodel.browse.ExpandedStreamBrowseViewModel @@ -118,6 +122,29 @@ class ExpandedStreamBrowseActivity : BaseActivity() { } } else { streamCluster.clusterAppList.forEach { + val screenshotsViewModels = mutableListOf>() + + for ((position, artwork) in it.screenshots.withIndex()) { + screenshotsViewModels.add( + MiniScreenshotViewModel_() + .id(artwork.url) + .position(position) + .artwork(artwork) + .callback(object : MiniScreenshotView.ScreenshotCallback { + override fun onClick(position: Int) { + openScreenshotActivity(it, position) + } + }) + ) + } + + if (screenshotsViewModels.isNotEmpty()) { + add( + CarouselHorizontalModel_() + .id("${it.id}_screenshots") + .models(screenshotsViewModels) + ) + } add( AppListViewModel_() diff --git a/app/src/main/java/com/aurora/store/view/ui/details/BaseDetailsActivity.kt b/app/src/main/java/com/aurora/store/view/ui/details/BaseDetailsActivity.kt index 66081011f..5f16a1bb7 100644 --- a/app/src/main/java/com/aurora/store/view/ui/details/BaseDetailsActivity.kt +++ b/app/src/main/java/com/aurora/store/view/ui/details/BaseDetailsActivity.kt @@ -19,7 +19,6 @@ package com.aurora.store.view.ui.details -import android.app.ActivityOptions import android.content.Intent import android.os.Build import android.text.Html @@ -365,23 +364,6 @@ abstract class BaseDetailsActivity : BaseActivity() { return null } - private fun openScreenshotActivity(app: App, position: Int) { - val intent = Intent( - this, - ScreenshotActivity::class.java - ).apply { - putExtra(Constants.STRING_EXTRA, gson.toJson(app.screenshots)) - putExtra(Constants.INT_EXTRA, position) - } - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { - val options = - ActivityOptions.makeSceneTransitionAnimation(this) - startActivity(intent, options.toBundle()) - } else { - startActivity(intent) - } - } - private fun addAvgReviews(number: Int, max: Long, rating: Long): RelativeLayout { return RatingView(this, number, max.toInt(), rating.toInt()) } diff --git a/app/src/main/res/drawable/bg_section.xml b/app/src/main/res/drawable/bg_section.xml new file mode 100644 index 000000000..f2a3598a7 --- /dev/null +++ b/app/src/main/res/drawable/bg_section.xml @@ -0,0 +1,25 @@ + + + + + + + diff --git a/app/src/main/res/layout/model_editorchoice_group.xml b/app/src/main/res/layout/model_editorchoice_group.xml index 8f258ad49..a1319077f 100644 --- a/app/src/main/res/layout/model_editorchoice_group.xml +++ b/app/src/main/res/layout/model_editorchoice_group.xml @@ -17,18 +17,37 @@ ~ --> - - - + android:layout_gravity="start" + android:layout_marginStart="@dimen/margin_small" + android:layout_marginEnd="@dimen/margin_small" + android:orientation="horizontal"> - \ No newline at end of file + android:layout_centerVertical="true" + android:inflatedId="@+id/header_view" /> + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/view_editor_head.xml b/app/src/main/res/layout/view_editor_head.xml index 40d72a354..439887c87 100644 --- a/app/src/main/res/layout/view_editor_head.xml +++ b/app/src/main/res/layout/view_editor_head.xml @@ -21,21 +21,15 @@ xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="wrap_content" - android:paddingStart="@dimen/padding_large" - android:paddingTop="@dimen/padding_small" - android:paddingEnd="@dimen/padding_large" - android:paddingBottom="@dimen/padding_small"> + android:padding="@dimen/padding_small"> \ No newline at end of file diff --git a/app/src/main/res/layout/view_editor_image.xml b/app/src/main/res/layout/view_editor_image.xml index ba9d86d2c..cea3602c0 100644 --- a/app/src/main/res/layout/view_editor_image.xml +++ b/app/src/main/res/layout/view_editor_image.xml @@ -23,6 +23,6 @@ + android:layout_width="match_parent" + android:layout_height="match_parent" /> \ No newline at end of file diff --git a/app/src/main/res/layout/view_screenshot_mini.xml b/app/src/main/res/layout/view_screenshot_mini.xml new file mode 100644 index 000000000..96eca2c8f --- /dev/null +++ b/app/src/main/res/layout/view_screenshot_mini.xml @@ -0,0 +1,29 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index 09174f5ce..803b674e5 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -47,6 +47,10 @@ 192dp 108dp + + 120dp + 68dp + 64dp 128dp