Commit fc951d66 authored by Eugene Shapovalov's avatar Eugene Shapovalov 💬

Implemented project merge requests tab.

parent e645ba53
......@@ -7,27 +7,40 @@ import ru.terrakok.gitlabclient.model.repository.mergerequest.MergeRequestReposi
import javax.inject.Inject
class MergeRequestInteractor @Inject constructor(
private val mergeRequestRepository: MergeRequestRepository
private val mergeRequestRepository: MergeRequestRepository
) {
fun getMyMergeRequests(
createdByMe: Boolean,
onlyOpened: Boolean,
page: Int
createdByMe: Boolean,
onlyOpened: Boolean,
page: Int
) = mergeRequestRepository
.getMyMergeRequests(
scope = if (createdByMe) MergeRequestScope.CREATED_BY_ME else MergeRequestScope.ASSIGNED_TO_ME,
state = if (onlyOpened) MergeRequestState.OPENED else null,
orderBy = OrderBy.UPDATED_AT,
page = page
)
fun getMergeRequests(
projectId: Long,
mergeRequestState: MergeRequestState,
page: Int
) = mergeRequestRepository
.getMergeRequests(
scope = if (createdByMe) MergeRequestScope.CREATED_BY_ME else MergeRequestScope.ASSIGNED_TO_ME,
state = if (onlyOpened) MergeRequestState.OPENED else null,
orderBy = OrderBy.UPDATED_AT,
page = page
projectId = projectId,
state = mergeRequestState,
orderBy = OrderBy.UPDATED_AT,
page = page
)
fun getMergeRequest(
projectId: Long,
mergeRequestId: Long
projectId: Long,
mergeRequestId: Long
) = mergeRequestRepository.getMergeRequest(projectId, mergeRequestId)
fun getMergeRequestNotes(
projectId: Long,
mergeRequestId: Long
projectId: Long,
mergeRequestId: Long
) = mergeRequestRepository.getMergeRequestNotes(projectId, mergeRequestId)
}
\ No newline at end of file
......@@ -6,7 +6,14 @@ import io.reactivex.functions.BiFunction
import ru.terrakok.gitlabclient.entity.OrderBy
import ru.terrakok.gitlabclient.entity.Project
import ru.terrakok.gitlabclient.entity.Sort
import ru.terrakok.gitlabclient.entity.app.target.*
import ru.terrakok.gitlabclient.entity.app.target.AppTarget
import ru.terrakok.gitlabclient.entity.app.target.TargetBadge
import ru.terrakok.gitlabclient.entity.app.target.TargetBadgeIcon
import ru.terrakok.gitlabclient.entity.app.target.TargetBadgeStatus
import ru.terrakok.gitlabclient.entity.app.target.TargetHeader
import ru.terrakok.gitlabclient.entity.app.target.TargetHeaderIcon
import ru.terrakok.gitlabclient.entity.app.target.TargetHeaderTitle
import ru.terrakok.gitlabclient.entity.app.target.TargetInternal
import ru.terrakok.gitlabclient.entity.event.EventAction
import ru.terrakok.gitlabclient.entity.mergerequest.MergeRequest
import ru.terrakok.gitlabclient.entity.mergerequest.MergeRequestScope
......@@ -16,43 +23,77 @@ import ru.terrakok.gitlabclient.model.data.server.GitlabApi
import ru.terrakok.gitlabclient.model.system.SchedulersProvider
import ru.terrakok.gitlabclient.toothpick.PrimitiveWrapper
import ru.terrakok.gitlabclient.toothpick.qualifier.DefaultPageSize
import java.util.*
import java.util.Date
import javax.inject.Inject
class MergeRequestRepository @Inject constructor(
private val api: GitlabApi,
private val schedulers: SchedulersProvider,
@DefaultPageSize private val defaultPageSizeWrapper: PrimitiveWrapper<Int>
private val api: GitlabApi,
private val schedulers: SchedulersProvider,
@DefaultPageSize private val defaultPageSizeWrapper: PrimitiveWrapper<Int>
) {
private val defaultPageSize = defaultPageSizeWrapper.value
fun getMyMergeRequests(
state: MergeRequestState? = null,
milestone: String? = null,
viewType: MergeRequestViewType? = null,
labels: String? = null,
createdBefore: Date? = null,
createdAfter: Date? = null,
scope: MergeRequestScope? = null,
authorId: Int? = null,
assigneeId: Int? = null,
meReactionEmoji: String? = null,
orderBy: OrderBy? = null,
sort: Sort? = null,
page: Int,
pageSize: Int = defaultPageSize
) = api
.getMyMergeRequests(
state, milestone, viewType, labels, createdBefore, createdAfter, scope,
authorId, assigneeId, meReactionEmoji, orderBy, sort, page, pageSize
)
.flatMap { mrs ->
Single.zip(
Single.just(mrs),
getDistinctProjects(mrs),
BiFunction<List<MergeRequest>, Map<Long, Project>, List<TargetHeader>> { sourceMrs, projects ->
sourceMrs.map { getTargetHeader(it, projects[it.projectId]!!) }
}
)
}
.subscribeOn(schedulers.io())
.observeOn(schedulers.ui())
fun getMergeRequests(
state: MergeRequestState? = null,
milestone: String? = null,
viewType: MergeRequestViewType? = null,
labels: String? = null,
createdBefore: Date? = null,
createdAfter: Date? = null,
scope: MergeRequestScope? = null,
authorId: Int? = null,
assigneeId: Int? = null,
meReactionEmoji: String? = null,
orderBy: OrderBy? = null,
sort: Sort? = null,
page: Int,
pageSize: Int = defaultPageSize
projectId: Long,
state: MergeRequestState? = null,
milestone: String? = null,
viewType: MergeRequestViewType? = null,
labels: String? = null,
createdBefore: Date? = null,
createdAfter: Date? = null,
scope: MergeRequestScope? = null,
authorId: Int? = null,
assigneeId: Int? = null,
meReactionEmoji: String? = null,
orderBy: OrderBy? = null,
sort: Sort? = null,
page: Int,
pageSize: Int = defaultPageSize
) = api
.getMergeRequests(
state, milestone, viewType, labels, createdBefore, createdAfter, scope,
authorId, assigneeId, meReactionEmoji, orderBy, sort, page, pageSize
projectId, state, milestone, viewType, labels, createdBefore, createdAfter,
scope, authorId, assigneeId, meReactionEmoji, orderBy, sort, page, pageSize
)
.flatMap { mrs ->
Single.zip(
Single.just(mrs),
getDistinctProjects(mrs),
BiFunction<List<MergeRequest>, Map<Long, Project>, List<TargetHeader>> { sourceMrs, projects ->
sourceMrs.map { getTargetHeader(it, projects[it.projectId]!!) }
}
Single.just(mrs),
getDistinctProjects(mrs),
BiFunction<List<MergeRequest>, Map<Long, Project>, List<TargetHeader>> { sourceMrs, projects ->
sourceMrs.map { getTargetHeader(it, projects[it.projectId]!!) }
}
)
}
.subscribeOn(schedulers.io())
......@@ -67,11 +108,15 @@ class MergeRequestRepository @Inject constructor(
private fun getTargetHeader(mr: MergeRequest, project: Project): TargetHeader {
val badges = mutableListOf<TargetBadge>()
badges.add(TargetBadge.Status(when(mr.state) {
MergeRequestState.OPENED -> TargetBadgeStatus.OPENED
MergeRequestState.CLOSED -> TargetBadgeStatus.CLOSED
MergeRequestState.MERGED -> TargetBadgeStatus.MERGED
}))
badges.add(
TargetBadge.Status(
when (mr.state) {
MergeRequestState.OPENED -> TargetBadgeStatus.OPENED
MergeRequestState.CLOSED -> TargetBadgeStatus.CLOSED
MergeRequestState.MERGED -> TargetBadgeStatus.MERGED
}
)
)
badges.add(TargetBadge.Text(project.name, AppTarget.PROJECT, project.id))
badges.add(TargetBadge.Text(mr.author.username, AppTarget.USER, mr.author.id))
badges.add(TargetBadge.Icon(TargetBadgeIcon.COMMENTS, mr.userNotesCount))
......@@ -80,36 +125,36 @@ class MergeRequestRepository @Inject constructor(
mr.labels.forEach { label -> badges.add(TargetBadge.Text(label)) }
return TargetHeader(
mr.author,
TargetHeaderIcon.NONE,
TargetHeaderTitle.Event(
mr.author.name,
EventAction.CREATED,
"${AppTarget.MERGE_REQUEST} !${mr.iid}",
project.name
),
mr.title,
mr.createdAt,
AppTarget.MERGE_REQUEST,
mr.id,
TargetInternal(mr.projectId, mr.iid),
badges
mr.author,
TargetHeaderIcon.NONE,
TargetHeaderTitle.Event(
mr.author.name,
EventAction.CREATED,
"${AppTarget.MERGE_REQUEST} !${mr.iid}",
project.name
),
mr.title,
mr.createdAt,
AppTarget.MERGE_REQUEST,
mr.id,
TargetInternal(mr.projectId, mr.iid),
badges
)
}
fun getMergeRequest(
projectId: Long,
mergeRequestId: Long
projectId: Long,
mergeRequestId: Long
) = api
.getMergeRequest(projectId, mergeRequestId)
.subscribeOn(schedulers.io())
.observeOn(schedulers.ui())
fun getMergeRequestNotes(
projectId: Long,
mergeRequestId: Long,
orderBy: OrderBy? = null,
sort: Sort? = Sort.ASC
projectId: Long,
mergeRequestId: Long,
orderBy: OrderBy? = null,
sort: Sort? = Sort.ASC
) = api
.getMergeRequestNotes(projectId, mergeRequestId, orderBy, sort)
.subscribeOn(schedulers.io())
......
package ru.terrakok.gitlabclient.presentation.project.issues
import com.arellomobile.mvp.MvpView
import com.arellomobile.mvp.viewstate.strategy.AddToEndSingleStrategy
import com.arellomobile.mvp.viewstate.strategy.OneExecutionStateStrategy
import com.arellomobile.mvp.viewstate.strategy.StateStrategyType
import ru.terrakok.gitlabclient.entity.app.target.TargetHeader
......@@ -8,7 +9,7 @@ import ru.terrakok.gitlabclient.entity.app.target.TargetHeader
/**
* @author Eugene Shapovalov (CraggyHaggy). Date: 27.08.18
*/
@StateStrategyType(OneExecutionStateStrategy::class)
@StateStrategyType(AddToEndSingleStrategy::class)
interface ProjectIssuesView : MvpView {
fun showRefreshProgress(show: Boolean)
......
package ru.terrakok.gitlabclient.presentation.project.mergerequest
import com.arellomobile.mvp.InjectViewState
import ru.terrakok.gitlabclient.Screens
import ru.terrakok.gitlabclient.entity.app.target.TargetHeader
import ru.terrakok.gitlabclient.entity.mergerequest.MergeRequestState
import ru.terrakok.gitlabclient.extension.openInfo
import ru.terrakok.gitlabclient.model.interactor.mergerequest.MergeRequestInteractor
import ru.terrakok.gitlabclient.model.system.flow.FlowRouter
import ru.terrakok.gitlabclient.presentation.global.BasePresenter
import ru.terrakok.gitlabclient.presentation.global.ErrorHandler
import ru.terrakok.gitlabclient.presentation.global.MarkDownConverter
import ru.terrakok.gitlabclient.presentation.global.Paginator
import ru.terrakok.gitlabclient.toothpick.PrimitiveWrapper
import ru.terrakok.gitlabclient.toothpick.qualifier.ProjectId
import javax.inject.Inject
/**
* @author Eugene Shapovalov (CraggyHaggy). Date: 28.08.18
*/
@InjectViewState
class ProjectMergeRequestsPresenter @Inject constructor(
@ProjectId private val projectIdWrapper: PrimitiveWrapper<Long>,
private val mergeRequestState: MergeRequestState,
private val mergeRequestInteractor: MergeRequestInteractor,
private val mdConverter: MarkDownConverter,
private val errorHandler: ErrorHandler,
private val router: FlowRouter
) : BasePresenter<ProjectMergeRequestsView>() {
private val projectId = projectIdWrapper.value
override fun onFirstViewAttach() {
super.onFirstViewAttach()
refreshMergeRequests()
}
private val paginator = Paginator(
{
mergeRequestInteractor.getMergeRequests(projectId, mergeRequestState, it)
.toObservable()
.flatMapIterable { it }
.flatMap { item ->
mdConverter.markdownToSpannable(item.body.toString())
.map { md -> item.copy(body = md) }
.toObservable()
}
.toList()
},
object : Paginator.ViewController<TargetHeader> {
override fun showEmptyProgress(show: Boolean) {
viewState.showEmptyProgress(show)
}
override fun showEmptyError(show: Boolean, error: Throwable?) {
if (error != null) {
errorHandler.proceed(error, { viewState.showEmptyError(show, it) })
} else {
viewState.showEmptyError(show, null)
}
}
override fun showErrorMessage(error: Throwable) {
errorHandler.proceed(error, { viewState.showMessage(it) })
}
override fun showEmptyView(show: Boolean) {
viewState.showEmptyView(show)
}
override fun showData(show: Boolean, data: List<TargetHeader>) {
viewState.showMergeRequests(show, data)
}
override fun showRefreshProgress(show: Boolean) {
viewState.showRefreshProgress(show)
}
override fun showPageProgress(show: Boolean) {
viewState.showPageProgress(show)
}
}
)
fun onMergeRequestClick(item: TargetHeader) = item.openInfo(router)
fun onUserClick(userId: Long) = router.startFlow(Screens.USER_FLOW, userId)
fun refreshMergeRequests() = paginator.refresh()
fun loadNextMergeRequestsPage() = paginator.loadNewPage()
override fun onDestroy() {
super.onDestroy()
paginator.release()
}
}
\ No newline at end of file
package ru.terrakok.gitlabclient.presentation.project.mergerequest
import com.arellomobile.mvp.MvpView
import com.arellomobile.mvp.viewstate.strategy.AddToEndSingleStrategy
import com.arellomobile.mvp.viewstate.strategy.OneExecutionStateStrategy
import com.arellomobile.mvp.viewstate.strategy.StateStrategyType
import ru.terrakok.gitlabclient.entity.app.target.TargetHeader
/**
* @author Eugene Shapovalov (CraggyHaggy). Date: 28.08.18
*/
@StateStrategyType(AddToEndSingleStrategy::class)
interface ProjectMergeRequestsView : MvpView {
fun showRefreshProgress(show: Boolean)
fun showEmptyProgress(show: Boolean)
fun showPageProgress(show: Boolean)
fun showEmptyView(show: Boolean)
fun showEmptyError(show: Boolean, message: String?)
fun showMergeRequests(show: Boolean, mergeRequests: List<TargetHeader>)
@StateStrategyType(OneExecutionStateStrategy::class)
fun showMessage(message: String)
}
\ No newline at end of file
......@@ -11,6 +11,7 @@ import ru.terrakok.gitlabclient.extension.shareText
import ru.terrakok.gitlabclient.toothpick.DI
import ru.terrakok.gitlabclient.ui.global.BaseFragment
import ru.terrakok.gitlabclient.ui.project.issues.ProjectIssuesContainerFragment
import ru.terrakok.gitlabclient.ui.project.mergerequest.ProjectMergeRequestsContainerFragment
import toothpick.Toothpick
import javax.inject.Inject
......@@ -72,7 +73,9 @@ class ProjectFragment : BaseFragment(), ProjectInfoFragment.ToolbarConfigurator
childFragmentManager.beginTransaction()
.add(R.id.container, tabs[tabKeys[0]], tabKeys[0])
.add(R.id.container, tabs[tabKeys[1]], tabKeys[1])
.add(R.id.container, tabs[tabKeys[2]], tabKeys[2])
.hide(tabs[tabKeys[1]])
.hide(tabs[tabKeys[2]])
.commitNow()
bottomBar.setCurrentItem(0, false)
setToolbarElevation(0)
......@@ -90,12 +93,14 @@ class ProjectFragment : BaseFragment(), ProjectInfoFragment.ToolbarConfigurator
private fun createNewFragments(): HashMap<String, BaseFragment> = hashMapOf(
tabKeys[0] to ProjectInfoFragment(),
tabKeys[1] to ProjectIssuesContainerFragment()
tabKeys[1] to ProjectIssuesContainerFragment(),
tabKeys[2] to ProjectMergeRequestsContainerFragment()
)
private fun findFragments(): HashMap<String, BaseFragment> = hashMapOf(
tabKeys[0] to childFragmentManager.findFragmentByTag(tabKeys[0]) as BaseFragment,
tabKeys[1] to childFragmentManager.findFragmentByTag(tabKeys[1]) as BaseFragment
tabKeys[1] to childFragmentManager.findFragmentByTag(tabKeys[1]) as BaseFragment,
tabKeys[2] to childFragmentManager.findFragmentByTag(tabKeys[2]) as BaseFragment
)
private fun setToolbarElevation(tabItem: Int) {
......
......@@ -18,7 +18,6 @@ import ru.terrakok.gitlabclient.toothpick.DI
import ru.terrakok.gitlabclient.ui.global.BaseFragment
import ru.terrakok.gitlabclient.ui.global.ZeroViewHolder
import ru.terrakok.gitlabclient.ui.my.TargetsAdapter
import ru.terrakok.gitlabclient.ui.my.issues.MyIssuesFragment
import toothpick.Toothpick
import toothpick.config.Module
......@@ -39,7 +38,7 @@ class ProjectIssuesFragment : BaseFragment(), ProjectIssuesView {
scope.installModules(object : Module() {
init {
bind(IssueState::class.java)
.toInstance(arguments?.getEnum<IssueState>(ARG_ISSUE_STATE))
.toInstance(arguments!!.getEnum<IssueState>(ARG_ISSUE_STATE))
}
})
......@@ -57,6 +56,14 @@ class ProjectIssuesFragment : BaseFragment(), ProjectIssuesView {
}
private var zeroViewHolder: ZeroViewHolder? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
if (arguments?.getEnum<IssueState>(ARG_ISSUE_STATE) == null) {
throw IllegalArgumentException("Provide issue state as args.")
}
}
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
......@@ -106,10 +113,10 @@ class ProjectIssuesFragment : BaseFragment(), ProjectIssuesView {
}
companion object {
private val ARG_ISSUE_STATE = "arg issue state"
private const val ARG_ISSUE_STATE = "arg issue state"
fun newInstance(issueState: IssueState) =
MyIssuesFragment().apply {
ProjectIssuesFragment().apply {
arguments = Bundle().apply {
putEnum(ARG_ISSUE_STATE, issueState)
}
......
package ru.terrakok.gitlabclient.ui.project.mergerequest
import android.os.Bundle
import android.support.v4.app.FragmentPagerAdapter
import kotlinx.android.synthetic.main.fragment_my_merge_requests_container.*
import ru.terrakok.gitlabclient.R
import ru.terrakok.gitlabclient.entity.mergerequest.MergeRequestState
import ru.terrakok.gitlabclient.ui.global.BaseFragment
/**
* @author Eugene Shapovalov (CraggyHaggy). Date: 28.08.18
*/
class ProjectMergeRequestsContainerFragment : BaseFragment() {
override val layoutRes = R.layout.fragment_project_merge_requests_container
private val adapter: ProjectMergeRequestsPagesAdapter by lazy { ProjectMergeRequestsPagesAdapter() }
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
viewPager.adapter = adapter
}
private inner class ProjectMergeRequestsPagesAdapter :
FragmentPagerAdapter(childFragmentManager) {
override fun getItem(position: Int) = when (position) {
0 -> ProjectMergeRequestsFragment.newInstance(MergeRequestState.OPENED)
1 -> ProjectMergeRequestsFragment.newInstance(MergeRequestState.MERGED)
2 -> ProjectMergeRequestsFragment.newInstance(MergeRequestState.CLOSED)
else -> null
}
override fun getCount() = 3
override fun getPageTitle(position: Int) = when (position) {
0 -> getString(R.string.target_status_opened)
1 -> getString(R.string.target_status_merged)
2 -> getString(R.string.target_status_closed)
else -> null
}
}
}
\ No newline at end of file
package ru.terrakok.gitlabclient.ui.project.mergerequest
import android.os.Bundle
import android.support.v7.widget.LinearLayoutManager
import com.arellomobile.mvp.presenter.InjectPresenter
import com.arellomobile.mvp.presenter.ProvidePresenter
import kotlinx.android.synthetic.main.layout_base_list.*
import kotlinx.android.synthetic.main.layout_zero.*
import ru.terrakok.gitlabclient.R
import ru.terrakok.gitlabclient.entity.app.target.TargetHeader
import ru.terrakok.gitlabclient.entity.mergerequest.MergeRequestState
import ru.terrakok.gitlabclient.extension.getEnum
import ru.terrakok.gitlabclient.extension.putEnum
import ru.terrakok.gitlabclient.extension.visible
import ru.terrakok.gitlabclient.presentation.project.mergerequest.ProjectMergeRequestsPresenter
import ru.terrakok.gitlabclient.presentation.project.mergerequest.ProjectMergeRequestsView
import ru.terrakok.gitlabclient.toothpick.DI
import ru.terrakok.gitlabclient.ui.global.BaseFragment
import ru.terrakok.gitlabclient.ui.global.ZeroViewHolder
import ru.terrakok.gitlabclient.ui.my.TargetsAdapter
import toothpick.Toothpick
import toothpick.config.Module
/**
* @author Eugene Shapovalov (CraggyHaggy). Date: 28.08.18
*/
class ProjectMergeRequestsFragment : BaseFragment(), ProjectMergeRequestsView {
override val layoutRes = R.layout.fragment_my_merge_requests
@InjectPresenter
lateinit var presenter: ProjectMergeRequestsPresenter
@ProvidePresenter
fun providePresenter(): ProjectMergeRequestsPresenter {
val scopeName = "ProjectMergeRequestsScope_${hashCode()}"
val scope = Toothpick.openScopes(DI.PROJECT_SCOPE, scopeName)
scope.installModules(object : Module() {
init {
bind(MergeRequestState::class.java)
.toInstance(arguments!!.getEnum<MergeRequestState>(ARG_MERGE_REQUEST_STATE))
}
})
return scope.getInstance(ProjectMergeRequestsPresenter::class.java).also {
Toothpick.closeScope(scopeName)
}
}
private val adapter: TargetsAdapter by lazy {
TargetsAdapter(
{ presenter.onUserClick(it) },
{ presenter.onMergeRequestClick(it) },
{ presenter.loadNextMergeRequestsPage() }
)
}
private var zeroViewHolder: ZeroViewHolder? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
if (arguments?.getEnum<MergeRequestState>(ARG_MERGE_REQUEST_STATE) == null) {
throw IllegalArgumentException("Provide merge request state as args.")
}
}
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
recyclerView.apply {
layoutManager = LinearLayoutManager(context)
setHasFixedSize(true)
adapter = this@ProjectMergeRequestsFragment.adapter
}
swipeToRefresh.setOnRefreshListener { presenter.refreshMergeRequests() }
zeroViewHolder = ZeroViewHolder(zeroLayout, { presenter.refreshMergeRequests() })
}
override fun showRefreshProgress(show: Boolean) {
swipeToRefresh.post { swipeToRefresh.isRefreshing = show }
}
override fun showEmptyProgress(show: Boolean) {
fullscreenProgressView.visible(show)
//trick for disable and hide swipeToRefresh on fullscreen progress
swipeToRefresh.visible(!show)
swipeToRefresh.post { swipeToRefresh.isRefreshing = false }
}
override fun showPageProgress(show: Boolean) {
recyclerView.post { adapter.showProgress(show) }
}
override fun showEmptyView(show: Boolean) {
if (show) zeroViewHolder?.showEmptyData()
else zeroViewHolder?.hide()
}
override fun showEmptyError(show: Boolean, message: String?) {
if (show) zeroViewHolder?.showEmptyError(message)
else zeroViewHolder?.hide()
}
override fun showMergeRequests(show: Boolean, mergeRequests: List<TargetHeader>) {
recyclerView.visible(show)
recyclerView.post { adapter.setData(mergeRequests) }
}
override fun showMessage(message: String) {
showSnackMessage(message)
}
companion object {
private const val ARG_MERGE_REQUEST_STATE = "arg merge request state"
fun newInstance(mergeRequestState: MergeRequestState) =
ProjectMergeRequestsFragment().apply {
arguments = Bundle().apply {
putEnum(ARG_MERGE_REQUEST_STATE, mergeRequestState)
}
}
}
}
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<include layout="@layout/layout_base_list" />
</FrameLayout>
\ No newline at end of file