Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Ep/feature/tickets list UI #142

Open
wants to merge 4 commits into
base: ep/feature/refactoringHelpyPsd
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions PyrusServiceDeskAndroid/pyrusservicedesk/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,10 @@ apply from: "${rootDir}/scripts/android.gradle"

android {

buildFeatures {
viewBinding = true
}

defaultConfig {
vectorDrawables.useSupportLibrary = true
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,10 @@
android:name="com.pyrus.pyrusservicedesk.presentation.ui.navigation_page.file_preview.FilePreviewActivity"
android:theme="@style/PyrusServiceDesk.Dialog"/>

<activity
android:name="com.pyrus.pyrusservicedesk.presentation.ui.navigation_page.tickets_list.TicketListActivity"
android:theme="@style/PyrusServiceDesk.Dialog"/>

<provider
android:name=".sdk.PSDFileProvider"
android:authorities="${applicationId}.com.pyrus.pyrusservicedesk.sdk.PSDFileProvider"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import androidx.annotation.MainThread
import com.google.gson.GsonBuilder
import com.pyrus.pyrusservicedesk.log.PLog
import com.pyrus.pyrusservicedesk.presentation.ui.navigation_page.ticket.TicketActivity
import com.pyrus.pyrusservicedesk.presentation.ui.navigation_page.tickets_list.TicketListActivity
import com.pyrus.pyrusservicedesk.presentation.viewmodel.SharedViewModel
import com.pyrus.pyrusservicedesk.sdk.FileResolver
import com.pyrus.pyrusservicedesk.sdk.FileResolverImpl
Expand Down Expand Up @@ -399,8 +400,8 @@ class PyrusServiceDesk private constructor(
get().sharedViewModel.clearQuitServiceDesk()
get().onStopCallback = onStopCallback

activity.startActivity(TicketActivity.getLaunchIntent())

//activity.startActivity(TicketActivity.getLaunchIntent())
activity.startActivity(TicketListActivity.getLaunchIntent())
if (configuration == null)
return
val currentUserId = get().preferences.getString(PREFERENCE_KEY_USER_ID_V2, null)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
package com.pyrus.pyrusservicedesk.presentation.ui.navigation_page.tickets_list

import android.content.Intent
import android.os.Bundle
import android.view.View
import android.widget.ImageButton
import android.widget.Toast
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.pyrus.pyrusservicedesk.PyrusServiceDesk
import com.pyrus.pyrusservicedesk.R
import com.pyrus.pyrusservicedesk.databinding.PsdTicketsListBinding
import com.pyrus.pyrusservicedesk.presentation.ConnectionActivityBase
import com.pyrus.pyrusservicedesk.presentation.ui.navigation_page.ticket.TicketActivity
import com.pyrus.pyrusservicedesk.presentation.ui.navigation_page.tickets_list.recyclerview_tickets_list.TicketsListAdapter
import kotlinx.android.synthetic.main.psd_toolbar.view.psd_toolbar_filter_ib
import kotlinx.android.synthetic.main.psd_toolbar.view.psd_toolbar_qr_ib

/**
* Activity for rendering ticket/feed comments.
*/
internal class TicketListActivity : ConnectionActivityBase<TicketsListViewModel>(TicketsListViewModel::class.java) {

override val layoutResId = R.layout.psd_tickets_list
override val toolbarViewId = R.id.toolbar_tickets_list
override val refresherViewId = View.NO_ID
override val progressBarViewId: Int = View.NO_ID


private lateinit var adapter: TicketsListAdapter
private lateinit var binding: PsdTicketsListBinding

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)

binding = PsdTicketsListBinding.inflate(layoutInflater)

val toolbarFilter = findViewById<ImageButton>(R.id.psd_toolbar_filter_ib)
val toolbarQr = findViewById<ImageButton>(R.id.psd_toolbar_qr_ib)
val ticketsRv = findViewById<RecyclerView>(R.id.tickets_rv)
Comment on lines +38 to +40
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Давай binding завезем

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

сделала


binding.toolbarTicketsList.psd_toolbar_filter_ib.setOnClickListener {
binding.toolbarTicketsList.psd_toolbar_filter_ib.setBackgroundResource(if(binding.filterFl.visibility == View.VISIBLE) R.drawable.ic_filter else R.drawable.ic_selected_filter)
binding.filterFl.visibility = if(binding.filterFl.visibility == View.VISIBLE) View.GONE else View.VISIBLE
Toast.makeText(applicationContext, "фильтры", Toast.LENGTH_SHORT).show()
}
binding.toolbarTicketsList.psd_toolbar_qr_ib.setOnClickListener {
//TODO
Toast.makeText(applicationContext, "QR", Toast.LENGTH_SHORT).show()
}

adapter = TicketsListAdapter(emptyList())
.apply {
setOnTicketItemClickListener {
it.ticketId.let { ticketId ->
[email protected](TicketActivity.getLaunchIntent(
ticketId,
when {
!it.isRead -> viewModel.getUnreadCount() - 1
else -> viewModel.getUnreadCount()
}
)
)
viewModel.onTicketOpened(it)
}
}
}
binding.ticketsRv.adapter = adapter
binding.ticketsRv.layoutManager = LinearLayoutManager(this)

//TODO button New ticket, maybe addItemDecoration
//tickets_rv.addItemDecoration(SpaceItemDecoration(resources.getDimensionPixelSize(R.dimen.psd_tickets_item_space)))

}

override fun startObserveData() {
super.startObserveData()
//TODO
// viewModel.getTicketsLiveData().observe(
// this,
// Observer { list ->
// refresh.isRefreshing = false
// list?.let{ adapter.setItems(it) }
// }
// )
// val list = provideTickets()
// list.let{ adapter.setItems(it) }
}

companion object {

/**
* Provides intent for launching the screen.
*/
fun getLaunchIntent(): Intent {
return Intent(
PyrusServiceDesk.get().application,
TicketListActivity::class.java
)
}

}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
package com.pyrus.pyrusservicedesk.presentation.ui.navigation_page.tickets_list

import android.content.Context
import android.net.Uri
import android.os.Handler
import android.os.Looper
import android.widget.Toast
import androidx.lifecycle.LiveData
import androidx.lifecycle.MediatorLiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.Observer
import androidx.recyclerview.widget.DiffUtil
import com.pyrus.pyrusservicedesk.PyrusServiceDesk
import com.pyrus.pyrusservicedesk.R
import com.pyrus.pyrusservicedesk.ServiceDeskProvider
import com.pyrus.pyrusservicedesk.log.PLog
import com.pyrus.pyrusservicedesk.presentation.call.*
import com.pyrus.pyrusservicedesk.presentation.ui.navigation_page.ticket.CommentsDiffCallback
import com.pyrus.pyrusservicedesk.presentation.ui.navigation_page.ticket.HtmlTagUtils
import com.pyrus.pyrusservicedesk.presentation.ui.navigation_page.ticket.entries.*
import com.pyrus.pyrusservicedesk.presentation.ui.view.recyclerview.DiffResultWithNewItems
import com.pyrus.pyrusservicedesk.presentation.viewmodel.ConnectionViewModelBase
import com.pyrus.pyrusservicedesk.sdk.data.Attachment
import com.pyrus.pyrusservicedesk.sdk.data.Author
import com.pyrus.pyrusservicedesk.sdk.data.Comment
import com.pyrus.pyrusservicedesk.sdk.data.FileManager
import com.pyrus.pyrusservicedesk.sdk.data.LocalDataProvider
import com.pyrus.pyrusservicedesk.sdk.data.TicketShortDescription
import com.pyrus.pyrusservicedesk.sdk.data.intermediate.AddCommentResponseData
import com.pyrus.pyrusservicedesk.sdk.data.intermediate.Comments
import com.pyrus.pyrusservicedesk.sdk.response.PendingDataError
import com.pyrus.pyrusservicedesk.sdk.updates.OnUnreadTicketCountChangedSubscriber
import com.pyrus.pyrusservicedesk.sdk.updates.PreferencesManager
import com.pyrus.pyrusservicedesk.sdk.verify.LocalDataVerifier
import com.pyrus.pyrusservicedesk.sdk.web.OnCancelListener
import com.pyrus.pyrusservicedesk.sdk.web.UploadFileHooks
import com.pyrus.pyrusservicedesk.utils.ConfigUtils
import com.pyrus.pyrusservicedesk.utils.MILLISECONDS_IN_MINUTE
import com.pyrus.pyrusservicedesk.utils.MILLISECONDS_IN_SECOND
import com.pyrus.pyrusservicedesk.utils.RequestUtils.Companion.MAX_FILE_SIZE_BYTES
import com.pyrus.pyrusservicedesk.utils.RequestUtils.Companion.MAX_FILE_SIZE_MEGABYTES
import com.pyrus.pyrusservicedesk.utils.getWhen
import kotlinx.coroutines.*
import java.lang.Exception
import java.lang.Runnable
import java.util.*
import kotlin.collections.ArrayList

/**
* ViewModel for the tickets list screen.
*/
internal class TicketsListViewModel(
serviceDeskProvider: ServiceDeskProvider,
private val preferencesManager: PreferencesManager
) : ConnectionViewModelBase(serviceDeskProvider) {


private val tickets = MediatorLiveData<List<TicketShortDescription>>()

private var unreadCount = 0


override fun onLoadData() {
//update()
}



/**
* Provides live data that delivers list of [TicketShortDescription] to be rendered.
*/
fun getTicketsLiveData(): LiveData<List<TicketShortDescription>> = tickets


/**
* Provides live data that delivers count of currently unread tickets
*/
fun getUnreadCount() = unreadCount


/**
* Callback to be invoked when user opens [ticket] in UI
*/
fun onTicketOpened(ticket: TicketShortDescription) {
if (!ticket.isRead) {
unreadCount--
val ticketsMutable = tickets.value!!.toMutableList()
//ticketsMutable[ticketsMutable.indexOf(ticket)] = ticket.isRead
tickets.value = ticketsMutable
}
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
package com.pyrus.pyrusservicedesk.presentation.ui.navigation_page.tickets_list.recyclerview_tickets_list

import android.annotation.SuppressLint
import android.view.View.GONE
import android.view.View.VISIBLE
import android.view.ViewGroup
import android.widget.ImageView
import android.widget.TextView
import com.pyrus.pyrusservicedesk.R
import com.pyrus.pyrusservicedesk.presentation.ui.navigation_page.ticket.entries.TicketEntry
import com.pyrus.pyrusservicedesk.presentation.ui.view.recyclerview.AdapterBase
import com.pyrus.pyrusservicedesk.presentation.ui.view.recyclerview.ViewHolderBase
import com.pyrus.pyrusservicedesk.sdk.data.TicketShortDescription
import com.pyrus.pyrusservicedesk.utils.getTimePassedFrom
import java.util.Calendar

/**
* Adapter that is used for rendering comment feed of the ticket screen.
*/
internal class TicketsListAdapter(itemsList: List<TicketShortDescription>): AdapterBase<TicketShortDescription>() {

init {
this.itemsList = itemsList.toMutableList()
}
private var onTicketItemClickListener: ((ticket: TicketShortDescription) -> Unit)? = null

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolderBase<TicketShortDescription> {
return TicketsListViewHolder(parent)
}

/**
* Assigns [listener] ths is invoked when comment with the file that is
* ready to be previewed was clicked.
*/
fun setOnTicketItemClickListener(listener: (ticket: TicketShortDescription) -> Unit) {
onTicketItemClickListener = listener
}

inner class TicketsListViewHolder(parent: ViewGroup)
: ViewHolderBase<TicketShortDescription>(parent, R.layout.psd_tickets_list_item) {

private val ticketName = itemView.findViewById<TextView>(R.id.ticket_name_tv)
private val isUnread = itemView.findViewById<ImageView>(R.id.ticket_unread_iv)
private val date = itemView.findViewById<TextView>(R.id.ticket_time_tv)
private val lastComment = itemView.findViewById<TextView>(R.id.ticket_last_comment_tv)

init {
itemView.setOnClickListener{ onTicketItemClickListener?.invoke(getItem()) }
}

override fun bindItem(item: TicketShortDescription) {
super.bindItem(item)
ticketName.text = getItem().subject
lastComment.text = getItem().lastComment?.body
date.text = "20.09"
isUnread.visibility = if (!getItem().isRead) VISIBLE else GONE
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import com.pyrus.pyrusservicedesk.presentation.ui.navigation_page.file_preview.F
import com.pyrus.pyrusservicedesk.presentation.ui.navigation_page.ticket.TicketViewModel
import com.pyrus.pyrusservicedesk.presentation.ui.navigation_page.ticket.dialogs.attach_files.AttachFileSharedViewModel
import com.pyrus.pyrusservicedesk.presentation.ui.navigation_page.ticket.dialogs.comment_actions.PendingCommentActionSharedViewModel
import com.pyrus.pyrusservicedesk.presentation.ui.navigation_page.tickets_list.TicketsListViewModel

/**
* Factory that provides view models.
Expand All @@ -24,6 +25,11 @@ internal class ViewModelFactory(private val arguments: Intent): ViewModelProvide
PyrusServiceDesk.get().serviceDeskProvider,
PyrusServiceDesk.getPreferencesManager()
) as T
TicketsListViewModel::class.java ->
TicketsListViewModel(
PyrusServiceDesk.get().serviceDeskProvider,
PyrusServiceDesk.getPreferencesManager()
) as T
FilePreviewViewModel::class.java ->
FilePreviewViewModel(
PyrusServiceDesk.get().serviceDeskProvider,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="28dp"
android:height="28dp"
android:viewportWidth="28"
android:viewportHeight="28">
<path
android:pathData="M14,4C14.23,4 14.417,4.187 14.417,4.417V23.583C14.417,23.813 14.23,24 14,24C13.77,24 13.583,23.813 13.583,23.583V4.417C13.583,4.187 13.77,4 14,4Z"
android:fillColor="#ffffff"
android:fillType="evenOdd"/>
<path
android:pathData="M4,14C4,13.77 4.187,13.583 4.417,13.583H23.583C23.813,13.583 24,13.77 24,14C24,14.23 23.813,14.417 23.583,14.417H4.417C4.187,14.417 4,14.23 4,14Z"
android:fillColor="#ffffff"
android:fillType="evenOdd"/>
</vector>
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:aapt="http://schemas.android.com/aapt"
android:width="91dp"
android:height="90dp"
android:viewportWidth="91"
android:viewportHeight="90">
<path
android:pathData="M42.5,60C42.5,71.598 52.798,81 65.5,81C69.029,81 72.373,80.274 75.361,78.977C80.84,79.852 85.164,79.828 86.76,79.688C84.424,77.61 83.14,75.621 82.493,74.152C86.224,70.419 88.5,65.452 88.5,60C88.5,48.402 78.202,39 65.5,39C52.798,39 42.5,48.402 42.5,60Z"
android:fillColor="#C7CCD1"
android:fillType="evenOdd"/>
<path
android:pathData="M73.5,42C73.5,59.673 58.278,74 39.5,74C34.283,74 29.34,72.894 24.922,70.918C16.823,72.251 10.432,72.215 8.072,72C11.526,68.834 13.424,65.803 14.38,63.565C8.864,57.877 5.5,50.308 5.5,42C5.5,24.327 20.722,10 39.5,10C58.278,10 73.5,24.327 73.5,42Z"
android:fillAlpha="0.75"
android:fillType="evenOdd">
<aapt:attr name="android:fillColor">
<gradient
android:startX="51.2"
android:startY="17.451"
android:endX="17.04"
android:endY="68.306"
android:type="linear">
<item android:offset="0" android:color="#6B4494E6"/>
<item android:offset="1" android:color="#FF4494E6"/>
</gradient>
</aapt:attr>
</path>
</vector>
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="28dp"
android:height="28dp"
android:viewportWidth="28"
android:viewportHeight="28">
<path
android:pathData="M5.132,5.132C5.308,4.956 5.592,4.956 5.768,5.132L22.868,22.232C23.044,22.407 23.044,22.692 22.868,22.868C22.692,23.044 22.407,23.044 22.232,22.868L5.132,5.768C4.956,5.592 4.956,5.308 5.132,5.132Z"
android:fillColor="#ffffff"
android:fillType="evenOdd"/>
<path
android:pathData="M22.868,5.132C23.044,5.308 23.044,5.592 22.868,5.768L5.768,22.868C5.592,23.044 5.308,23.044 5.132,22.868C4.956,22.692 4.956,22.407 5.132,22.232L22.232,5.132C22.407,4.956 22.692,4.956 22.868,5.132Z"
android:fillColor="#ffffff"
android:fillType="evenOdd"/>
</vector>
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="28dp"
android:height="28dp"
android:viewportWidth="28"
android:viewportHeight="28">
<group>
<clip-path
android:pathData="M4.057,4.269C4.143,4.104 4.314,4 4.5,4H23.5C23.686,4 23.857,4.104 23.944,4.269C24.03,4.434 24.017,4.634 23.91,4.787L17,14.658V23.5C17,23.68 16.903,23.846 16.746,23.935C16.59,24.024 16.397,24.021 16.243,23.929L11.243,20.929C11.092,20.838 11,20.676 11,20.5V14.658L4.09,4.787C3.983,4.634 3.97,4.434 4.057,4.269ZM5.46,5L11.91,14.213C11.968,14.297 12,14.397 12,14.5V20.217L16,22.617V14.5C16,14.397 16.032,14.297 16.09,14.213L22.54,5H5.46Z"
android:fillType="evenOdd"/>
<path
android:pathData="M4.057,4.269L2.283,3.345V3.345L4.057,4.269ZM23.944,4.269L22.17,5.193L22.17,5.193L23.944,4.269ZM23.91,4.787L25.548,5.934L25.548,5.934L23.91,4.787ZM17,14.658L15.361,13.511L15,14.027V14.658H17ZM16.243,23.929L15.214,25.644L15.214,25.644L16.243,23.929ZM11.243,20.929L10.214,22.644L10.214,22.644L11.243,20.929ZM11,14.658H13V14.027L12.639,13.511L11,14.658ZM4.09,4.787L2.452,5.934L2.452,5.934L4.09,4.787ZM11.91,14.213L10.271,15.36L10.271,15.36L11.91,14.213ZM5.46,5V3H1.619L3.822,6.147L5.46,5ZM12,20.217H10V21.349L10.971,21.932L12,20.217ZM16,22.617L14.971,24.332L18,26.149V22.617H16ZM16.09,14.213L17.729,15.36L17.729,15.36L16.09,14.213ZM22.54,5L24.178,6.147L26.381,3H22.54V5ZM4.5,2C3.568,2 2.713,2.519 2.283,3.345L5.83,5.193C5.572,5.689 5.059,6 4.5,6V2ZM23.5,2H4.5V6H23.5V2ZM25.718,3.345C25.287,2.519 24.432,2 23.5,2V6C22.941,6 22.428,5.689 22.17,5.193L25.718,3.345ZM25.548,5.934C26.083,5.17 26.148,4.172 25.717,3.345L22.17,5.193C21.911,4.697 21.95,4.098 22.271,3.64L25.548,5.934ZM18.639,15.804L25.548,5.934L22.271,3.64L15.361,13.511L18.639,15.804ZM19,23.5V14.658H15V23.5H19ZM17.732,25.676C18.515,25.232 19,24.401 19,23.5H15C15,22.96 15.291,22.461 15.761,22.195L17.732,25.676ZM15.214,25.644C15.986,26.107 16.948,26.119 17.732,25.676L15.761,22.195C16.231,21.928 16.808,21.936 17.272,22.214L15.214,25.644ZM10.214,22.644L15.214,25.644L17.272,22.214L12.272,19.214L10.214,22.644ZM9,20.5C9,21.378 9.461,22.192 10.214,22.644L12.272,19.214C12.724,19.485 13,19.973 13,20.5H9ZM9,14.658V20.5H13V14.658H9ZM2.452,5.934L9.362,15.804L12.639,13.511L5.729,3.64L2.452,5.934ZM2.283,3.345C1.852,4.172 1.917,5.17 2.452,5.934L5.729,3.64C6.05,4.098 6.089,4.697 5.83,5.193L2.283,3.345ZM13.548,13.066L7.099,3.853L3.822,6.147L10.271,15.36L13.548,13.066ZM14,14.5C14,13.987 13.842,13.486 13.548,13.066L10.271,15.36C10.095,15.108 10,14.808 10,14.5H14ZM14,20.217V14.5H10V20.217H14ZM17.029,20.902L13.029,18.502L10.971,21.932L14.971,24.332L17.029,20.902ZM14,14.5V22.617H18V14.5H14ZM14.452,13.066C14.158,13.486 14,13.987 14,14.5H18C18,14.808 17.905,15.108 17.729,15.36L14.452,13.066ZM20.901,3.853L14.452,13.066L17.729,15.36L24.178,6.147L20.901,3.853ZM5.46,7H22.54V3H5.46V7Z"
android:fillColor="#4494E6"/>
</group>
</vector>
Loading