Skip to content

Commit

Permalink
Add product fragment
Browse files Browse the repository at this point in the history
  • Loading branch information
andraantariksa committed Apr 19, 2022
1 parent 12c17e5 commit 19f6f78
Show file tree
Hide file tree
Showing 15 changed files with 158 additions and 78 deletions.
1 change: 1 addition & 0 deletions .idea/misc.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@
android:name=".ui.coupons.CouponsActivity"
android:exported="false" />
<activity
android:name=".ui.product.ProductActivity"
android:name=".ui.product.ProductFragment"
android:exported="false" />
</application>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ class VerifyFragment : Fragment() {
val binding get() = _binding!!

private val verifyViewModel by viewModels<VerifyViewModel>()
val args: VerifyFragmentArgs by navArgs()
val args by navArgs<VerifyFragmentArgs>()

override fun onCreateView(
inflater: LayoutInflater,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import androidx.fragment.app.viewModels
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.lifecycleScope
import androidx.lifecycle.repeatOnLifecycle
import androidx.navigation.fragment.findNavController
import androidx.navigation.fragment.navArgs
import androidx.recyclerview.widget.DividerItemDecoration
import com.google.android.gms.location.FusedLocationProviderClient
Expand Down Expand Up @@ -101,7 +102,12 @@ class StoreFragment : Fragment() {
is Resource.Loaded -> {
binding.shimmerFrameLayoutProducts.hideShimmer()
binding.recyclerViewProducts.adapter =
CategorizedProductAdapter(res.data, numberFormatter)
CategorizedProductAdapter(res.data, numberFormatter) { product ->
val navController = findNavController()
val action =
StoreFragmentDirections.actionNavigationHomeStoreToNavigationHomeProduct(product)
navController.navigate(action)
}
}
is Resource.Loading -> {
binding.recyclerViewProducts.adapter =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,14 @@ import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import id.shaderboi.koffie.core.domain.model.store.products.CategorizedProduct
import id.shaderboi.koffie.core.domain.model.store.products.Product
import id.shaderboi.koffie.databinding.ItemCategorizedProductBinding
import java.text.DecimalFormat

class CategorizedProductAdapter(
private val categorizedProducts: List<CategorizedProduct>,
private val numberFormatter: DecimalFormat
private val numberFormatter: DecimalFormat,
private val onProductClick: (product: Product) -> Unit
) :
RecyclerView.Adapter<CategorizedProductAdapter.ViewHolder>() {
class ViewHolder(val binding: ItemCategorizedProductBinding) :
Expand All @@ -34,7 +36,7 @@ class CategorizedProductAdapter(
holder.binding.apply {
textViewCategoryName.text = categorizedProduct.categoryName
recyclerViewProducts.adapter =
ProductsAdapter(categorizedProduct.products, numberFormatter)
ProductsAdapter(categorizedProduct.products, numberFormatter, onProductClick)
}
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,20 +1,18 @@
package id.shaderboi.koffie.ui.main.store.adapter

import IntentExtra
import android.content.Intent
import android.graphics.Paint
import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import com.squareup.picasso.Picasso
import id.shaderboi.koffie.core.domain.model.store.products.Product
import id.shaderboi.koffie.databinding.ItemProductBinding
import id.shaderboi.koffie.ui.product.ProductActivity
import java.text.DecimalFormat

class ProductsAdapter(
private val products: List<Product>,
private val numberFormatter: DecimalFormat
private val numberFormatter: DecimalFormat,
private val onProductClick: (product: Product) -> Unit
) :
RecyclerView.Adapter<ProductsAdapter.ViewHolder>() {
class ViewHolder(val binding: ItemProductBinding) :
Expand Down Expand Up @@ -50,11 +48,7 @@ class ProductsAdapter(
.into(imageViewProduct)

root.setOnClickListener {
val context = root.context
val intent = Intent(context, ProductActivity::class.java).apply {
putExtra(IntentExtra.PRODUCT_ID, product.id)
}
context.startActivity(intent)
onProductClick(product)
}
}
}
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
package id.shaderboi.koffie.ui.product

import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.navigation.fragment.navArgs
import com.google.android.material.bottomsheet.BottomSheetBehavior
import com.google.android.material.bottomsheet.BottomSheetDialog
import com.google.android.material.bottomsheet.BottomSheetDialogFragment
import com.squareup.picasso.Picasso
import dagger.hilt.android.AndroidEntryPoint
import id.shaderboi.koffie.databinding.FragmentProductBinding
import java.text.DecimalFormat
import javax.inject.Inject

@AndroidEntryPoint
class ProductFragment : BottomSheetDialogFragment() {
private var _binding: FragmentProductBinding? = null
val binding get() = _binding!!

val args by navArgs<ProductFragmentArgs>()

@Inject
lateinit var numberFormatter: DecimalFormat

override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
_binding = FragmentProductBinding.inflate(inflater, container, false)

setupView()

return binding.root
}

private fun setupView() {
binding.apply {
(dialog as BottomSheetDialog?)?.let { bottomSheetDialog ->
bottomSheetDialog.behavior.state = BottomSheetBehavior.STATE_EXPANDED
bottomSheetDialog.behavior.skipCollapsed = true
}

textViewName.text = args.product.name
textViewPrice.text = numberFormatter.format(args.product.price)

Picasso
.get()
.load(args.product.imageUrl)
.into(imageViewProduct)
}
}
}
47 changes: 0 additions & 47 deletions app/src/main/res/layout/activity_product.xml

This file was deleted.

60 changes: 60 additions & 0 deletions app/src/main/res/layout/fragment_product.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http:https://schemas.android.com/apk/res/android"
xmlns:app="http:https://schemas.android.com/apk/res-auto"
xmlns:tools="http:https://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:divider="@drawable/divider16dp"
android:orientation="vertical"
android:paddingStart="10dp"
android:paddingTop="5dp"
android:paddingEnd="10dp"
android:paddingBottom="5dp"
android:showDividers="middle">

<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">

<ImageView
android:id="@+id/imageViewProduct"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintDimensionRatio="H,1:1"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:srcCompat="@tools:sample/backgrounds/scenic" />

</androidx.constraintlayout.widget.ConstraintLayout>

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:divider="@drawable/divider8dp"
android:gravity="center_vertical"
android:orientation="vertical"
android:showDividers="middle">

<TextView
android:id="@+id/textViewName"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="24sp"
android:textStyle="bold"
tools:text="Kopi Susu" />

<TextView
android:id="@+id/textViewPrice"
android:layout_width="match_parent"
android:layout_height="wrap_content"
tools:text="1.000.000" />
</LinearLayout>

<Button
android:id="@+id/buttonAddToCart"
style="@style/Theme.Koffie.Button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/add_to_cart" />
</LinearLayout>
15 changes: 13 additions & 2 deletions app/src/main/res/navigation/navigation_main.xml
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,10 @@
tools:layout="@layout/fragment_stores" >
<action
android:id="@+id/action_navigation_home_stores_to_navigation_home_main"
app:destination="@id/navigation_home_main" />
app:destination="@id/navigation_home_store" />
</fragment>
<fragment
android:id="@+id/navigation_home_main"
android:id="@+id/navigation_home_store"
android:name="id.shaderboi.koffie.ui.main.store.StoreFragment"
tools:layout="@layout/fragment_store" >
<argument
Expand All @@ -28,7 +28,18 @@
android:name="storeWithDistance"
app:argType="id.shaderboi.koffie.core.domain.model.store.StoreWithDistance"
app:nullable="true" />
<action
android:id="@+id/action_navigation_home_store_to_navigation_home_product"
app:destination="@id/navigation_home_product" />
</fragment>
<dialog
android:id="@+id/navigation_home_product"
android:name="id.shaderboi.koffie.ui.product.ProductFragment"
tools:layout="@layout/fragment_product" >
<argument
android:name="product"
app:argType="id.shaderboi.koffie.core.domain.model.store.products.Product" />
</dialog>
</navigation>
<navigation
android:id="@+id/navigation_history"
Expand Down
1 change: 1 addition & 0 deletions app/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -55,4 +55,5 @@
<string name="error_credential_already_in_use">Credential is already in use</string>
<string name="total_item">Total Item:</string>
<string name="distance">Distance</string>
<string name="add_to_cart">Add to cart</string>
</resources>
6 changes: 5 additions & 1 deletion app/src/main/res/values/themes.xml
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,10 @@
<item name="colorOnSecondary">@color/onBackground</item>
<!-- Status bar color. -->
<item name="android:statusBarColor" tools:targetApi="l">?attr/colorPrimaryVariant</item>
<!-- Customize your theme here. -->
</style>

<style name="Theme.Koffie.Button" parent="Widget.MaterialComponents.Button">
<item name="background">@color/primary</item>
<item name="android:textColor">@color/onPrimary</item>
</style>
</resources>
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ class FakeStoreRepository : StoreRepository {
"Some description",
12000,
0,
"http:https://i.epvpimg.com/avEeeab.png",
"https:https://i.epvpimg.com/avEeeab.png",
2000
),
Product(
Expand All @@ -68,7 +68,7 @@ class FakeStoreRepository : StoreRepository {
"Some description",
22000,
0,
"http:https://i.epvpimg.com/avEeeab.png",
"https:https://i.epvpimg.com/avEeeab.png",
7000
)
)
Expand All @@ -82,7 +82,7 @@ class FakeStoreRepository : StoreRepository {
"Some description",
12000,
1,
"http:https://i.epvpimg.com/avEeeab.png",
"https:https://i.epvpimg.com/avEeeab.png",
null
)
)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,12 @@
package id.shaderboi.koffie.core.domain.model.store.products

import android.os.Parcelable
import com.squareup.moshi.Json
import com.squareup.moshi.JsonClass
import kotlinx.parcelize.Parcelize

@JsonClass(generateAdapter = true)
@Parcelize
data class Product(
val id: Int,
val name: String,
Expand All @@ -14,4 +17,4 @@ data class Product(
@Json(name = "image_url")
val imageUrl: String,
val discount: Int?
)
): Parcelable

0 comments on commit 19f6f78

Please sign in to comment.