Skip to content
Snippets Groups Projects
Commit b15615dd authored by Adrien Béraud's avatar Adrien Béraud
Browse files

home: remove request fragment when empty

Change-Id: I38362ce927326f0f1ce6373645a84f298a007bdf
parent fb751002
No related branches found
No related tags found
No related merge requests found
......@@ -367,7 +367,6 @@ class HomeActivity : AppCompatActivity(), Colorable, ContactPickerFragment.OnCon
private fun presentTrustRequestFragment(accountId: String) {
mNotificationService.cancelTrustRequestNotification(accountId)
mHomeFragment!!.presentForAccount(accountId)
}
fun goToAdvancedSettings() {
......
......@@ -25,7 +25,6 @@ import androidx.recyclerview.widget.RecyclerView
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import com.google.android.material.snackbar.Snackbar
import cx.ring.R
import cx.ring.account.AccountEditionFragment
import cx.ring.adapters.SmartListAdapter
import cx.ring.client.HomeActivity
import cx.ring.databinding.FragPendingContactRequestsBinding
......@@ -58,17 +57,6 @@ class ContactRequestsFragment :
binding = null
}
fun presentForAccount(accountId: String?) {
if (accountId != null)
arguments?.putString(AccountEditionFragment.ACCOUNT_ID_KEY, accountId)
presenter.updateAccount(accountId)
}
override fun onStart() {
super.onStart()
presenter.updateAccount(arguments?.getString(AccountEditionFragment.ACCOUNT_ID_KEY))
}
override fun updateView(list: List<Conversation>, conversationFacade: ConversationFacade, disposable: CompositeDisposable) {
val binding = binding ?: return
binding.placeholder.visibility = if (list.isEmpty()) View.VISIBLE else View.GONE
......
......@@ -35,6 +35,7 @@ import androidx.appcompat.widget.Toolbar
import androidx.core.view.isVisible
import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentActivity
import androidx.fragment.app.FragmentManager
import androidx.viewpager2.adapter.FragmentStateAdapter
import androidx.viewpager2.widget.ViewPager2
import com.google.android.material.tabs.TabLayout
......@@ -52,8 +53,17 @@ import net.jami.home.HomePresenter
import net.jami.home.HomeView
import net.jami.services.AccountService
import net.jami.services.ConversationFacade
import java.lang.IllegalArgumentException
import javax.inject.Inject
fun ViewPager2.findCurrentFragment(fragmentManager: FragmentManager): Fragment? =
fragmentManager.findFragmentByTag("f$currentItem")
fun ViewPager2.findFragmentAtPosition(
fragmentManager: FragmentManager,
position: Int
): Fragment? = fragmentManager.findFragmentByTag("f$position")
@AndroidEntryPoint
class HomeFragment : BaseSupportFragment<HomePresenter, HomeView>(),
TabLayout.OnTabSelectedListener, SearchView.OnQueryTextListener, HomeView {
......@@ -68,7 +78,6 @@ class HomeFragment : BaseSupportFragment<HomePresenter, HomeView>(),
private var mSearchView: SearchView? = null
private var mSearchMenuItem: MenuItem? = null
private var mDialPadMenuItem: MenuItem? = null
private var mSmartListFragment: Fragment? = null
@Inject
lateinit
......@@ -111,7 +120,7 @@ class HomeFragment : BaseSupportFragment<HomePresenter, HomeView>(),
override fun onPageSelected(position: Int) {
super.onPageSelected(position)
binding.tabLayout.getTabAt(position)!!.select()
pagerContent = mPagerAdapter!!.fragments[position]
pagerContent = binding.pager.findFragmentAtPosition(requireActivity().supportFragmentManager, position)
conversationBackPressedCallback.isEnabled = position != TAB_CONVERSATIONS
}
})
......@@ -139,14 +148,13 @@ class HomeFragment : BaseSupportFragment<HomePresenter, HomeView>(),
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
mSmartListFragment = mPagerAdapter!!.fragments[TAB_CONVERSATIONS] as SmartListFragment
val menu = mBinding!!.toolbar.menu
val searchMenuItem = menu.findItem(R.id.menu_contact_search)
val dialpadMenuItem = menu.findItem(R.id.menu_contact_dial)
searchMenuItem.setOnActionExpandListener(object : MenuItem.OnActionExpandListener {
override fun onMenuItemActionCollapse(item: MenuItem): Boolean {
dialpadMenuItem.isVisible = false
(mSmartListFragment as SmartListFragment?)?.showFab(true)
(pagerContent as? SmartListFragment?)?.showFab(true)
setOverflowMenuVisible(menu, true)
mBinding!!.qrCode.visibility = View.GONE
mBinding!!.newGroup.visibility = View.GONE
......@@ -156,7 +164,7 @@ class HomeFragment : BaseSupportFragment<HomePresenter, HomeView>(),
override fun onMenuItemActionExpand(item: MenuItem): Boolean {
dialpadMenuItem.isVisible = true
(mSmartListFragment as SmartListFragment).showFab(false)
(pagerContent as? SmartListFragment?)?.showFab(false)
setOverflowMenuVisible(menu, false)
mBinding!!.qrCode.visibility = View.VISIBLE
mBinding!!.newGroup.visibility = View.VISIBLE
......@@ -240,7 +248,7 @@ class HomeFragment : BaseSupportFragment<HomePresenter, HomeView>(),
mBinding!!.spinnerToolbar.setSelection(0)
}
} ?: run {
AccountSpinnerAdapter(activity!!, ArrayList(accounts), mDisposable, mAccountService, mConversationFacade).apply {
AccountSpinnerAdapter(requireActivity(), ArrayList(accounts), mDisposable, mAccountService, mConversationFacade).apply {
mAccountAdapter = this
setNotifyOnChange(false)
mBinding?.spinnerToolbar?.adapter = this
......@@ -287,29 +295,26 @@ class HomeFragment : BaseSupportFragment<HomePresenter, HomeView>(),
mBinding!!.pager.currentItem = position
}
fun presentForAccount(accountId: String) {
val fragment = mPagerAdapter!!.fragments[TAB_INVITATIONS]
(fragment as ContactRequestsFragment).presentForAccount(accountId)
}
fun goToHome() {
mBinding!!.tabLayout.getTabAt(TAB_CONVERSATIONS)!!.select()
pagerContent = mPagerAdapter!!.fragments[TAB_CONVERSATIONS]
pagerContent = mBinding!!.pager.findCurrentFragment(requireActivity().supportFragmentManager)
}
private fun setBadge(menuId: Int, number: Int) {
val tab = mBinding!!.tabLayout.getTabAt(menuId)
val binding = mBinding ?: return
val tab = binding.tabLayout.getTabAt(menuId) ?: return
if (number == 0) {
tab!!.removeBadge()
tab.removeBadge()
if (menuId == TAB_CONVERSATIONS) mHasConversationBadge = false else mHasPendingBadge = false
if (!mHasPendingBadge && pagerContent is ContactRequestsFragment) goToHome()
} else {
tab!!.orCreateBadge.number = number
mBinding!!.tabLayout.isVisible = true
tab.orCreateBadge.number = number
if (menuId == TAB_CONVERSATIONS) mHasConversationBadge = true else mHasPendingBadge = true
}
mBinding!!.tabLayout.isVisible = mHasPendingBadge
mBinding!!.pager.isUserInputEnabled = mHasConversationBadge || mHasPendingBadge
binding.tabLayout.isVisible = mHasPendingBadge
mPagerAdapter!!.enableRequests(mHasPendingBadge)
binding.pager.isUserInputEnabled = mHasPendingBadge
}
fun handleIntent(intent: Intent) {
......@@ -344,7 +349,7 @@ class HomeFragment : BaseSupportFragment<HomePresenter, HomeView>(),
}
override fun onQueryTextChange(newText: String): Boolean {
(mSmartListFragment as SmartListFragment).searchQueryTextChanged(newText)
(pagerContent as? SmartListFragment?)?.searchQueryTextChanged(newText)
return true
}
......@@ -368,11 +373,23 @@ class HomeFragment : BaseSupportFragment<HomePresenter, HomeView>(),
}
private inner class ScreenSlidePagerAdapter(fa: FragmentActivity) : FragmentStateAdapter(fa) {
val fragments: List<Fragment> = listOf(SmartListFragment(), ContactRequestsFragment())
var hasRequests = false
override fun getItemCount(): Int = if (hasRequests) 2 else 1
override fun getItemCount(): Int = fragments.size
override fun createFragment(position: Int): Fragment = when(position) {
TAB_CONVERSATIONS -> SmartListFragment()
TAB_INVITATIONS -> ContactRequestsFragment()
else -> throw IllegalArgumentException()
}
override fun createFragment(position: Int): Fragment = fragments[position]
fun enableRequests(enable: Boolean) {
if (enable == hasRequests) return
hasRequests = enable
if (enable)
notifyItemInserted(TAB_INVITATIONS)
else
notifyItemRemoved(TAB_INVITATIONS)
}
}
companion object {
......
......@@ -19,63 +19,41 @@
*/
package net.jami.contactrequests
import io.reactivex.rxjava3.core.Observable
import io.reactivex.rxjava3.core.Scheduler
import io.reactivex.rxjava3.subjects.BehaviorSubject
import net.jami.model.Account
import net.jami.model.Conversation
import net.jami.model.Uri
import net.jami.mvp.RootPresenter
import net.jami.services.AccountService
import net.jami.services.ConversationFacade
import net.jami.smartlist.ConversationItemViewModel
import net.jami.utils.Log
import java.util.*
import javax.inject.Inject
import javax.inject.Named
class ContactRequestsPresenter @Inject internal constructor(
private val mConversationFacade: ConversationFacade,
private val mAccountService: AccountService,
@param:Named("UiScheduler") private val mUiScheduler: Scheduler
private val conversationFacade: ConversationFacade,
private val accountService: AccountService,
@param:Named("UiScheduler") private val uiScheduler: Scheduler
) : RootPresenter<ContactRequestsView>() {
private val mAccount = BehaviorSubject.create<Account>()
override fun bindView(view: ContactRequestsView) {
super.bindView(view)
mCompositeDisposable.add(mConversationFacade.getPendingConversationList(mAccount)
.observeOn(mUiScheduler)
mCompositeDisposable.add(conversationFacade.getPendingConversationList()
.observeOn(uiScheduler)
.subscribe { viewModels ->
this.view?.updateView(ArrayList(viewModels), mConversationFacade, mCompositeDisposable)
this.view?.updateView(ArrayList(viewModels), conversationFacade, mCompositeDisposable)
})
}
override fun onDestroy() {
mAccount.onComplete()
super.onDestroy()
}
fun updateAccount(accountId: String?) {
mAccountService.getAccount(accountId).let { account ->
if (account == null) {
mAccountService.currentAccountSubject.subscribe(mAccount)
} else {
mAccount.onNext(account)
}
}
}
fun contactRequestClicked(accountId: String, uri: Uri) {
view?.goToConversation(accountId, uri)
}
fun removeConversation(item: Conversation) {
mConversationFacade.discardRequest(item.accountId, item.uri)
conversationFacade.discardRequest(item.accountId, item.uri)
}
fun banContact(item: Conversation) {
mConversationFacade.discardRequest(item.accountId, item.uri)
mAccountService.removeContact(item.accountId, item.uri.host, true)
conversationFacade.discardRequest(item.accountId, item.uri)
accountService.removeContact(item.accountId, item.uri.host, true)
}
fun copyNumber(item: Conversation) {
......@@ -87,7 +65,4 @@ class ContactRequestsPresenter @Inject internal constructor(
}
}
companion object {
private val TAG = ContactRequestsPresenter::class.simpleName!!
}
}
\ No newline at end of file
......@@ -292,6 +292,9 @@ class ConversationFacade(
fun getPendingConversationList(currentAccount: Observable<Account>): Observable<List<Conversation>> =
currentAccount.switchMap { account: Account ->
account.getPendingSubject()}
fun getPendingConversationList(): Observable<List<Conversation>> =
currentAccountSubject.switchMap { account: Account ->
account.getPendingSubject()}
fun getSmartList(hasPresence: Boolean): Observable<List<Observable<ConversationItemViewModel>>> =
getSmartList(mAccountService.currentAccountSubject, hasPresence)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment