Advertisement
elsemTim

apiFuture

Aug 9th, 2019
283
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Kotlin 11.15 KB | None | 0 0
  1. package ru.mail.intranet.ui.businesstrip.component.list.page.base
  2.  
  3. import android.os.Bundle
  4. import android.view.Menu
  5. import android.view.MenuItem
  6. import android.view.View
  7. import androidx.annotation.CallSuper
  8. import androidx.annotation.WorkerThread
  9. import androidx.recyclerview.widget.LinearLayoutManager
  10. import androidx.recyclerview.widget.RecyclerView
  11. import ru.mail.intranet.R
  12. import ru.mail.intranet.model.base.api.action.ApiFuture
  13. import ru.mail.intranet.model.base.api.result.component.error.ApiError
  14. import ru.mail.intranet.model.base.message.MESSAGE_CENTER
  15. import ru.mail.intranet.model.base.message.component.HandleTarget
  16. import ru.mail.intranet.model.base.message.component.Message
  17. import ru.mail.intranet.model.base.repository.businessTripRepository
  18. import ru.mail.intranet.model.base.util.getApiErrorText
  19. import ru.mail.intranet.model.base.util.processApiError
  20. import ru.mail.intranet.model.base.util.toast
  21. import ru.mail.intranet.model.businesstrip.data.BusinessTrip
  22. import ru.mail.intranet.ui.base.component.ErrorViewType
  23. import ru.mail.intranet.ui.base.page.BasePage
  24. import ru.mail.intranet.ui.base.util.addActionButton
  25. import ru.mail.intranet.ui.base.util.disableItemChangeAnimation
  26. import ru.mail.intranet.ui.businesstrip.BusinessTripRequestListActivity
  27. import ru.mail.intranet.ui.businesstrip.component.list.adapter.RequestListAdapter
  28. import ru.mail.intranet.ui.businesstrip.component.list.data.ActionList
  29. import ru.mail.intranet.ui.businesstrip.component.list.decoration.BusinessTripListItemDecoration
  30. import ru.mail.intranet.ui.businesstrip.component.list.item.RequestItem
  31. import ru.mail.intranet.ui.businesstrip.component.message.BusinessTripMessage
  32. import ru.mail.intranet.ui.businesstrip.component.util.matches
  33. import ru.mail.intranet.ui.common.dialog.alert.showAlertDialog
  34. import ru.mail.intranet.util.text.splitToWords
  35. import ru.mail.intranet.util.thread.runOnMainThread
  36.  
  37. abstract class BusinessTripPage: BasePage<BusinessTripRequestListActivity>() {
  38.  
  39.     private lateinit var recyclerView: RecyclerView
  40.     private lateinit var actionListView: View
  41.     private lateinit var approveButton: View
  42.     private lateinit var rejectButton: View
  43.     //    private var future: ApiFuture<*>? = null
  44.     private var allItems: List<RequestItem>? = null
  45.     private var selectAllButton: MenuItem? = null
  46.  
  47.     protected lateinit var adapter: RequestListAdapter
  48.         private set
  49.  
  50.     protected abstract fun loadData(): ApiFuture<*>
  51.  
  52.     @CallSuper
  53.     override fun onCreate(savedInstanceState: Bundle?) {
  54.         setContentView(R.layout.page_business_trip_list)
  55.         recyclerView = findViewById(R.id.page_business_trip_list_recycler)
  56.         actionListView = findViewById(R.id.page_business_trip_list_action)
  57.         approveButton = findViewById(R.id.page_business_trip_list_approve_group)
  58.         rejectButton = findViewById(R.id.page_business_trip_list_reject_group)
  59.  
  60.         recyclerView.disableItemChangeAnimation()
  61.         recyclerView.layoutManager = LinearLayoutManager(activity)
  62.         adapter = RequestListAdapter(activity,
  63.             { countSelectedItems, actionList ->
  64.                 toggleActionMenu(
  65.                     countSelectedItems > 0,
  66.                     actionList
  67.                 )
  68.             },
  69.             {
  70.                 showErrorView()
  71.             })
  72.         approveButton.setOnClickListener {
  73.             val size = adapter.collectSelectedRequestList().size
  74.             activity.showAlertDialog(
  75.                 activity.resources.getQuantityString(
  76.                     R.plurals.confirm_business_trip_approve,
  77.                     size
  78.                 )
  79.             ) { resultPositive ->
  80.                 if (resultPositive) {
  81.                     val requestNumberList =
  82.                         adapter.collectSelectedRequestList().map { it.requestNumber }
  83.                     adapter.toggleRefreshingState(
  84.                         requestNumberList,
  85.                         true
  86.                     )
  87.                     activity.businessTripRepository.approveBusinessTripList(requestNumberList)
  88.                 }
  89.             }
  90.         }
  91.         rejectButton.setOnClickListener {
  92.             val size = adapter.collectSelectedRequestList().size
  93.             activity.showAlertDialog(
  94.                 activity.resources.getQuantityString(
  95.                     R.plurals.confirm_business_trip_reject,
  96.                     size
  97.                 )
  98.             ) { resultPositive ->
  99.                 if (resultPositive) {
  100.                     val requestNumberList =
  101.                         adapter.collectSelectedRequestList().map { it.requestNumber }
  102.                     adapter.toggleRefreshingState(
  103.                         requestNumberList,
  104.                         true
  105.                     )
  106.                     activity.businessTripRepository.rejectBusinessTripList(requestNumberList)
  107.                 }
  108.             }
  109.         }
  110.         recyclerView.addItemDecoration(
  111.             BusinessTripListItemDecoration(
  112.                 activity,
  113.                 adapter
  114.             )
  115.         )
  116.         recyclerView.adapter = adapter
  117.         isRefreshEnabled = true
  118.         hasSearch = true
  119.         hasOptionsMenu = true
  120.         showProgressView(false)
  121. //        future = loadData()
  122.         loadData()
  123.         MESSAGE_CENTER.registerHandler(
  124.             this,
  125.             BusinessTripMessage.MC_REFRESH_REQUEST,
  126.             HandleTarget.MAIN_THREAD
  127.         )
  128.     }
  129.  
  130.     override fun onSearchQueryChanged(query: String?) = false
  131.  
  132.     override fun onSearch(query: String?) {
  133.         val allItems = allItems ?: return
  134.         if (query.isNullOrBlank()) {
  135.             runOnMainThread {
  136.                 adapter.setItemsRaw(allItems)
  137.             }
  138.             return
  139.         }
  140.         val words = query.splitToWords()
  141.         val filtered = ArrayList<RequestItem>()
  142.         for (item in allItems) {
  143.             val trip = item.businessTrip
  144.             var matches = true
  145.             for (word in words) {
  146.                 if (!trip.matches(word)) {
  147.                     matches = false
  148.                     break
  149.                 }
  150.             }
  151.             if (matches) {
  152.                 filtered.add(item)
  153.             }
  154.         }
  155.         runOnMainThread {
  156.             adapter.setItemsRaw(filtered)
  157.         }
  158.     }
  159.  
  160.     override fun onSearchFieldVisibilityChanged(visible: Boolean) {
  161.         val allItems = allItems
  162.         if (!visible && allItems != null) {
  163.             adapter.setItemsRaw(allItems)
  164.         }
  165.     }
  166.  
  167.     override fun onRefresh() {
  168. //        future?.cancel()
  169. //        future = loadData()
  170.         loadData().cancel()
  171.         loadData()
  172.     }
  173.  
  174.     override fun onDestroy() {
  175.         MESSAGE_CENTER.unregisterHandler(this)
  176.         loadData().cancel()
  177. //        future?.cancel()
  178.     }
  179.  
  180.     override fun onCreateOptionsMenu(menu: Menu) {
  181.         super.onCreateOptionsMenu(menu)
  182.         val selectAllButton = menu.addActionButton(
  183.             activity,
  184.             R.string.select_all,
  185.             R.drawable.ic_select_all,
  186.             R.color.menu_action
  187.         ) {
  188.             adapter.toggleSelectionAll()
  189.         }
  190.         selectAllButton.isVisible = false
  191.         this.selectAllButton = selectAllButton
  192.     }
  193.  
  194.     protected open fun onBusinessTripUpdateSuccess(businessTrip: BusinessTrip) {
  195.         adapter.updateBusinessTrip(businessTrip)
  196.     }
  197.  
  198.     override fun onHandleMessage(message: Message) {
  199.         when {
  200.             message.containsExtra(BusinessTripMessage.EXTRA_BUSINESS_TRIP) -> {
  201.                 val businessTrip =
  202.                     message.getExtra<BusinessTrip>(BusinessTripMessage.EXTRA_BUSINESS_TRIP)
  203.                 onBusinessTripUpdateSuccess(businessTrip)
  204.             }
  205.             message.containsExtra(BusinessTripMessage.EXTRA_BUSINESS_TRIP_NUMBER) -> {
  206.                 val requestNumber =
  207.                     message.getExtra<Long>(BusinessTripMessage.EXTRA_BUSINESS_TRIP_NUMBER)
  208.                 adapter.toggleRefreshingState(
  209.                     requestNumber,
  210.                     false
  211.                 )
  212.             }
  213.         }
  214.     }
  215.  
  216.     @WorkerThread
  217.     protected fun processBusinessTripList(businessTripList: List<BusinessTrip>?) {
  218.         val items = businessTripList?.map { RequestItem(it) }
  219.         allItems = items
  220.         runOnMainThread {
  221.             if (items.isNullOrEmpty()) {
  222.                 showErrorView(
  223.                     text = activity.getString(R.string.business_trip_no_requests),
  224.                     type = ErrorViewType.INFO,
  225.                     image = activity.getDrawable(R.drawable.ic_business_trip_no_history),
  226.                     retryText = activity.getString(R.string.business_trip_update)
  227.                 ) {
  228.                     //                    future?.cancel()
  229. //                    future = loadData()
  230.                     loadData().cancel()
  231.                     loadData()
  232.                     showProgressView(false)
  233.                     hideErrorView()
  234.                 }
  235.             } else {
  236.                 isRefreshing = false
  237.                 adapter.setItemsRaw(items)
  238.             }
  239.             hideProgressView()
  240.         }
  241.     }
  242.  
  243.     @WorkerThread
  244.     protected fun processBusinessTripListError(error: ApiError?) = processApiError(
  245.         activity,
  246.         error,
  247.         true
  248.     ) {
  249.         runOnMainThread {
  250.             if (adapter.isEmpty()) {
  251.                 showErrorView(
  252.                     text = activity.getApiErrorText(error),
  253.                     animate = false,
  254.                     image = activity.getDrawable(R.drawable.ic_reserve_request_error)
  255.                 ) {
  256.                     //                    future?.cancel()
  257. //                    future = loadData()
  258.                     loadData().cancel()
  259.                     loadData()
  260.                     showProgressView(false)
  261.                     hideErrorView()
  262.                 }
  263.             } else {
  264.                 activity.toast(error)
  265.             }
  266.             isRefreshing = false
  267.             hideProgressView()
  268.         }
  269.     }
  270.  
  271.     private fun toggleActionMenu(
  272.         visible: Boolean,
  273.         actionList: ActionList
  274.     ) {
  275.         if (visible) {
  276.             approveButton.visibility = View.GONE
  277.             rejectButton.visibility = View.GONE
  278.             if (actionList.canApprove) {
  279.                 approveButton.visibility = View.VISIBLE
  280.             }
  281.             if (actionList.canReject) {
  282.                 rejectButton.visibility = View.VISIBLE
  283.             }
  284.             actionListView.visibility = View.VISIBLE
  285.             selectAllButton?.isVisible = true
  286.         } else {
  287.             actionListView.visibility = View.GONE
  288.             selectAllButton?.isVisible = false
  289.         }
  290.     }
  291.  
  292.     private fun showErrorView() {
  293.         showErrorView(
  294.             text = activity.getString(R.string.business_trip_no_requests),
  295.             type = ErrorViewType.INFO,
  296.             image = activity.getDrawable(R.drawable.ic_business_trip_no_history),
  297.             retryText = activity.getString(R.string.business_trip_update)
  298.         ) {
  299.             //            future?.cancel()
  300. //            future = loadData()
  301.             loadData().cancel()
  302.             loadData()
  303.             hideErrorView()
  304.         }
  305.     }
  306. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement