diff --git a/app/src/main/java/com/woka/home/fragments/MyListFragment.kt b/app/src/main/java/com/woka/home/fragments/MyListFragment.kt index b7b3946..ae31d7b 100644 --- a/app/src/main/java/com/woka/home/fragments/MyListFragment.kt +++ b/app/src/main/java/com/woka/home/fragments/MyListFragment.kt @@ -51,6 +51,7 @@ import com.woka.players.views.PlayerActivity import com.woka.userPreference.UserType import com.woka.utils.hide import com.woka.utils.isNetworkConnected +import com.woka.utils.setVisibility import com.woka.utils.show import com.woka.utils.toast import com.woka.webseries.models.ShowData @@ -255,6 +256,8 @@ class MyListFragment : Fragment() { webSeriesEnglishView.show() dataLoaded = true webSeriesEAdapter.submitList(engList.reversed()) + + webSeriesEngViewAll.setVisibility(engList.size >= 3) }else{ webSeriesEnglishView.hide() } @@ -263,6 +266,8 @@ class MyListFragment : Fragment() { webSeriesHindiView.show() dataLoaded = true webSeriesHAdapter.submitList(hinList.reversed()) + + webSeriesHinViewAll.setVisibility(hinList.size >= 3) }else{ webSeriesHindiView.hide() } @@ -280,6 +285,8 @@ class MyListFragment : Fragment() { dataLoaded = true audioBooksAdapter.submitList(audioData.reversed()) + + audioBooksViewAll.setVisibility(audioData.size >= 3) }else{ audioBooksView.hide() } @@ -292,6 +299,7 @@ class MyListFragment : Fragment() { dataLoaded = true karaokeAdapter.submitList(singKaraokeData.reversed()) + karaokeViewAll.setVisibility(singKaraokeData.size >= 3) }else{ karaokeView.hide() } @@ -303,6 +311,7 @@ class MyListFragment : Fragment() { dataLoaded = true gamesAdapter.submitList(gamesData.reversed()) + gamesViewAll.setVisibility(gamesData.size >= 3) }else{ gamesView.hide() } diff --git a/app/src/main/java/com/woka/karaoke/views/KaraokeActivity.kt b/app/src/main/java/com/woka/karaoke/views/KaraokeActivity.kt index b48e42d..169229d 100644 --- a/app/src/main/java/com/woka/karaoke/views/KaraokeActivity.kt +++ b/app/src/main/java/com/woka/karaoke/views/KaraokeActivity.kt @@ -263,7 +263,7 @@ class KaraokeActivity : WokaBaseActivity() { } like.setOnClickListener { - if (isNetworkConnected()){ + if (!isNetworkConnected()){ toast(getString(R.string.no_internet)) return@setOnClickListener } @@ -299,7 +299,7 @@ class KaraokeActivity : WokaBaseActivity() { } fav.setOnClickListener { - if (isNetworkConnected()){ + if (!isNetworkConnected()){ toast(getString(R.string.no_internet)) return@setOnClickListener } diff --git a/app/src/main/java/com/woka/shop/adapters/OrderScanAdapter.kt b/app/src/main/java/com/woka/shop/adapters/OrderScanAdapter.kt new file mode 100644 index 0000000..a2b63d7 --- /dev/null +++ b/app/src/main/java/com/woka/shop/adapters/OrderScanAdapter.kt @@ -0,0 +1,61 @@ +package com.woka.shop.adapters + +import android.annotation.SuppressLint +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.recyclerview.widget.RecyclerView +import androidx.recyclerview.widget.RecyclerView.ViewHolder +import com.woka.databinding.OrderTrackViewHolderBinding +import com.woka.shop.models.ordertrack.ScanDetail +import com.woka.utils.convertTimeFormat +import com.woka.utils.setVisibility + +class OrderScanAdapter: RecyclerView.Adapter(){ + + private val orderTrackList = mutableListOf() + + @SuppressLint("NotifyDataSetChanged") + fun submitOrderTrack(list: List){ + orderTrackList.clear() + orderTrackList.addAll(list) + + notifyDataSetChanged() + } + + @SuppressLint("NotifyDataSetChanged") + fun clearCurrentData(){ + orderTrackList.clear() + + notifyDataSetChanged() + } + + inner class OrderTrackViewHolder(val binding: OrderTrackViewHolderBinding): ViewHolder(binding.root) + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): OrderTrackViewHolder { + return OrderTrackViewHolder( + OrderTrackViewHolderBinding.inflate( + LayoutInflater.from(parent.context), + parent, + false + ) + ) + } + + override fun getItemCount(): Int = orderTrackList.size + + override fun onBindViewHolder(holder: OrderTrackViewHolder, position: Int) { + val scanDetail = orderTrackList[holder.absoluteAdapterPosition] + + holder.binding.apply { + date.text = scanDetail.updated_date?.convertTimeFormat("yyyy-MM-dd HH:mm:ss", "dd/MM")?:"NA" + time.text = scanDetail.updated_date?.convertTimeFormat("yyyy-MM-dd HH:mm:ss", "hh:mm a")?:"NA" + + statusTitle.text = if (scanDetail.remarks != null) "Order ${scanDetail.remarks}" else "NA" + scanDetail.location?.let {location -> + "Arrived at $location".also { statusSubtitle.text = it } + } + + lineView.setVisibility(holder.absoluteAdapterPosition != orderTrackList.size -1) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/woka/shop/adapters/OrdersAdapter.kt b/app/src/main/java/com/woka/shop/adapters/OrdersAdapter.kt index 0973d7d..1f3585e 100644 --- a/app/src/main/java/com/woka/shop/adapters/OrdersAdapter.kt +++ b/app/src/main/java/com/woka/shop/adapters/OrdersAdapter.kt @@ -8,6 +8,7 @@ import androidx.recyclerview.widget.ListAdapter import androidx.recyclerview.widget.RecyclerView.ViewHolder import com.woka.databinding.OrdersViewHolderBinding import com.woka.shop.models.orders.OrderData +import com.woka.utils.convertTimeFormat import java.util.concurrent.Executors class OrdersAdapter: ListAdapter(ASYNC_DIFF_UTIL){ @@ -25,6 +26,8 @@ class OrdersAdapter: ListAdapter(ASYNC inner class OrderViewHolder(val binding: OrdersViewHolderBinding): ViewHolder(binding.root) + var orderTrackClickListener: ((OrderData) -> Unit)? = null + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): OrderViewHolder { return OrderViewHolder( OrdersViewHolderBinding.inflate( @@ -41,20 +44,21 @@ class OrdersAdapter: ListAdapter(ASYNC holder.binding.apply { orderId.text = "${order.order_id}" - val priceVal = "INR ${order.grand_total}" + val priceVal = "INR ${order.grand_total?:"NA"}" price.text = priceVal - val orderedDate = try { - order.order_booked_date_time?.split(" ")?.first() - }catch (e: Exception){ - order.order_booked_date_time + + placedOn.text = order.order_booked_date_time?.convertTimeFormat("yyyy-MM-dd hh:mm:ss", "dd/MM/yyyy")?:"NA" + + airwayBillNo.text = "${order.airwaybilno?:"NA"}" + + courier.text = "${order.courier?:"NA"}" + + trackBtn.setOnClickListener { + order?.let { + orderTrackClickListener?.invoke(it) + } } - - placedOn.text = "$orderedDate" - - airwayBillNo.text = "${order.airwaybilno}" - - courier.text = "${order.courier}" } } } \ No newline at end of file diff --git a/app/src/main/java/com/woka/shop/viewmodels/OrdersViewModel.kt b/app/src/main/java/com/woka/shop/viewmodels/OrdersViewModel.kt index 4b2af43..9ff9b0a 100644 --- a/app/src/main/java/com/woka/shop/viewmodels/OrdersViewModel.kt +++ b/app/src/main/java/com/woka/shop/viewmodels/OrdersViewModel.kt @@ -61,15 +61,13 @@ class OrdersViewModel: ViewModel() { } } - private val _orderTrackingLiveData = MutableLiveData>>() - val orderTrackingLiveData: LiveData>> - get() = _orderTrackingLiveData - - private val orderTrackingMap = HashMap() - - suspend fun trackOrder(orderId: String): ApiResult.Success { - if (orderTrackingMap.containsKey(orderId)){ - return ApiResult.Success(orderTrackingMap[orderId]) + suspend fun trackOrder(orderId: String): ApiResult { + return when (val response = repository.orderTracking(orderId)){ + is ApiResult.Error -> {ApiResult.Error(response.errorMessage, response.error)} + is ApiResult.Loading -> {ApiResult.Loading()} + is ApiResult.Success -> { + ApiResult.Success(response.data?.result?.firstOrNull()) + } } } } \ No newline at end of file diff --git a/app/src/main/java/com/woka/shop/views/MyOrdersActivity.kt b/app/src/main/java/com/woka/shop/views/MyOrdersActivity.kt index 5cf4721..78600f0 100644 --- a/app/src/main/java/com/woka/shop/views/MyOrdersActivity.kt +++ b/app/src/main/java/com/woka/shop/views/MyOrdersActivity.kt @@ -6,28 +6,40 @@ import androidx.activity.enableEdgeToEdge import androidx.core.view.ViewCompat import androidx.core.view.WindowInsetsCompat import androidx.lifecycle.ViewModelProvider +import androidx.lifecycle.lifecycleScope +import com.google.android.material.bottomsheet.BottomSheetDialog import com.woka.R import com.woka.WokaApp import com.woka.databinding.ActivityMyOrdersBinding +import com.woka.databinding.BsOrderTrackingBinding import com.woka.networking.ApiResult +import com.woka.shop.adapters.OrderScanAdapter import com.woka.shop.adapters.OrdersAdapter +import com.woka.shop.models.orders.OrderData import com.woka.shop.viewmodels.OrdersViewModel import com.woka.userPreference.UserType import com.woka.utils.NoSignInDialog import com.woka.utils.WokaBaseActivity +import com.woka.utils.convertTimeFormat import com.woka.utils.hide import com.woka.utils.lightStatusBar import com.woka.utils.setVisibility import com.woka.utils.show +import com.woka.utils.toast +import kotlinx.coroutines.launch class MyOrdersActivity : WokaBaseActivity() { private lateinit var binding: ActivityMyOrdersBinding private lateinit var viewModel: OrdersViewModel + private lateinit var bsOrderTrackDialog: BottomSheetDialog + private lateinit var bsBinding: BsOrderTrackingBinding + private lateinit var noSignInDialog: NoSignInDialog private lateinit var adapter: OrdersAdapter + private lateinit var orderTrackAdapter: OrderScanAdapter override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -43,9 +55,16 @@ class MyOrdersActivity : WokaBaseActivity() { viewModel = ViewModelProvider(this)[OrdersViewModel::class.java] noSignInDialog = NoSignInDialog(this) + // adapters adapter = OrdersAdapter() + orderTrackAdapter = OrderScanAdapter() - window.navigationBarColor = getColor(R.color.my_orders_img_color) + // order tracking dialog init + bsBinding = BsOrderTrackingBinding.inflate(layoutInflater) + bsOrderTrackDialog = BottomSheetDialog(this, R.style.BottomSheetDialog) + bsOrderTrackDialog.setContentView(bsBinding.root) + + window.navigationBarColor = getColor(R.color.black) window.lightStatusBar(true) initViews() @@ -62,6 +81,7 @@ class MyOrdersActivity : WokaBaseActivity() { private fun initViews(){ binding.apply { rvOrders.adapter = adapter + bsBinding.rvOrderTrack.adapter = orderTrackAdapter } } @@ -82,6 +102,55 @@ class MyOrdersActivity : WokaBaseActivity() { loadMoreBtn.setOnClickListener { viewModel.loadOrders() } + + adapter.orderTrackClickListener = { + showOrderTrackingDialog(it) + } + } + } + + private fun showOrderTrackingDialog(orderData: OrderData){ + lifecycleScope.launch { + bsBinding.apply { + + orderTrackAdapter.clearCurrentData() + + dataView.hide() + rvOrderTrack.hide() + shimmer.show() + + bsOrderTrackDialog.show() + + orderData.order_id?.let { + when (val response = viewModel.trackOrder(it)){ + is ApiResult.Error -> { + toast(response.errorMessage) + bsOrderTrackDialog.dismiss() + } + is ApiResult.Loading -> {} + is ApiResult.Success -> { + response.data?.let {trackingData -> + + val orderIdVal = "Order ID : ${trackingData.orderno?:"NA"}" + orderId.text = orderIdVal + + airwayBillNo.text = trackingData.awbno?:"NA" + deliveryStatus.text = trackingData.shipment_latest_status?:"NA" + expectedDelivery.text = trackingData.edd?.convertTimeFormat("yyyy-MM-dd", "dd/MM/yyyy")?:"NA" + + shimmer.hide() + dataView.show() + + trackingData.scan_detail?.filterNotNull()?.let {scanList -> + orderTrackAdapter.submitOrderTrack(scanList) + rvOrderTrack.show() + rvOrderTrack.smoothScrollToPosition(scanList.size) + } + } + } + } + } + } } } diff --git a/app/src/main/java/com/woka/userdata/UserApiService.kt b/app/src/main/java/com/woka/userdata/UserApiService.kt index f0bc8eb..b940d2f 100644 --- a/app/src/main/java/com/woka/userdata/UserApiService.kt +++ b/app/src/main/java/com/woka/userdata/UserApiService.kt @@ -28,5 +28,5 @@ interface UserApiService { suspend fun getNotifications(): Response>> @POST("favourite_listing") - suspend fun getMyFavList(): Response> + suspend fun getMyFavList(@Body formBody: FormBody): Response> } \ No newline at end of file diff --git a/app/src/main/java/com/woka/userdata/UserRepository.kt b/app/src/main/java/com/woka/userdata/UserRepository.kt index 2097b25..a694fe1 100644 --- a/app/src/main/java/com/woka/userdata/UserRepository.kt +++ b/app/src/main/java/com/woka/userdata/UserRepository.kt @@ -50,7 +50,11 @@ object UserRepository { suspend fun loadMyFavList(): ApiResult{ return handleApiCall { - userApiService.getMyFavList() + userApiService.getMyFavList( + FormBody.Builder() + .add("api_version", "v2") + .build() + ) } } } \ No newline at end of file diff --git a/app/src/main/java/com/woka/utils/Extensions.kt b/app/src/main/java/com/woka/utils/Extensions.kt index 63f6e71..1aacc6b 100644 --- a/app/src/main/java/com/woka/utils/Extensions.kt +++ b/app/src/main/java/com/woka/utils/Extensions.kt @@ -21,6 +21,7 @@ import androidx.fragment.app.Fragment import com.google.i18n.phonenumbers.PhoneNumberUtil import com.google.i18n.phonenumbers.Phonenumber import com.woka.WokaApp.Companion.userPrefs +import java.text.SimpleDateFormat import java.util.Locale import kotlin.math.ceil @@ -99,6 +100,18 @@ fun Long.formatTime(): String { } } +fun String.convertTimeFormat(fromFormat: String, toFormat: String): String{ + return try{ + val sdf1 = SimpleDateFormat(fromFormat, Locale.getDefault()) + val sdf2 = SimpleDateFormat(toFormat, Locale.getDefault()) + + val date = sdf1.parse(this) ?: throw Exception() + sdf2.format(date) + }catch (e: Exception){ + this + } +} + fun Context.isNetworkConnected(): Boolean { val connectivityManager = getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager val network = connectivityManager.activeNetwork ?: return false diff --git a/app/src/main/res/layout/bs_order_tracking.xml b/app/src/main/res/layout/bs_order_tracking.xml new file mode 100644 index 0000000..4ba1fb5 --- /dev/null +++ b/app/src/main/res/layout/bs_order_tracking.xml @@ -0,0 +1,210 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_my_list.xml b/app/src/main/res/layout/fragment_my_list.xml index 74d230a..d2739ed 100644 --- a/app/src/main/res/layout/fragment_my_list.xml +++ b/app/src/main/res/layout/fragment_my_list.xml @@ -97,18 +97,47 @@ android:layout_marginTop="15dp" android:orientation="vertical"> - - android:text="@string/web_series_english" - android:fontFamily="@font/exo_2_bold" - android:textColor="@color/color_primary" + + android:layout_centerVertical="true" + + /> + + + + - - android:text="@string/web_series_hindi" - android:fontFamily="@font/exo_2_bold" - android:textColor="@color/color_primary" + + android:layout_centerVertical="true" + + /> + + + + - - android:text="@string/audio_books" - android:fontFamily="@font/exo_2_bold" - android:textColor="@color/color_primary" + + android:layout_centerVertical="true" + + /> + + + + - - android:text="@string/karaoke" - android:fontFamily="@font/exo_2_bold" - android:textColor="@color/color_primary" + + android:layout_centerVertical="true" + + /> + + + + - - android:text="@string/games" - android:fontFamily="@font/exo_2_bold" - android:textColor="@color/color_primary" + + android:layout_centerVertical="true" + + /> + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/order_track_view_holder.xml b/app/src/main/res/layout/order_track_view_holder.xml new file mode 100644 index 0000000..65b1125 --- /dev/null +++ b/app/src/main/res/layout/order_track_view_holder.xml @@ -0,0 +1,112 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values-night/themes.xml b/app/src/main/res/values-night/themes.xml index 3c15ff7..65bcd2d 100644 --- a/app/src/main/res/values-night/themes.xml +++ b/app/src/main/res/values-night/themes.xml @@ -6,4 +6,14 @@ @drawable/cursor_drawable true + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 9dd10be..dc63afa 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -293,4 +293,8 @@ COURIER TRACK No orders found + AIRWAY BILL NUMBER: + Status: + Expected Date: + VIEW ALL \ No newline at end of file diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml index 2b3156a..81f7e1d 100644 --- a/app/src/main/res/values/themes.xml +++ b/app/src/main/res/values/themes.xml @@ -40,5 +40,15 @@ @color/black + + + + +