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

tv: fix display of contact, conversation list

GitLab: #1220
Change-Id: I68c3c2d42545e47f32e6351c4c2203215c59cc1a
parent de8ec561
No related branches found
No related tags found
No related merge requests found
......@@ -57,9 +57,8 @@ class TVContactFragment : BaseDetailFragment<TVContactPresenter>(), TVContactVie
else
ConversationPath.fromIntent(requireActivity().intent)!!
iconSize = resources.getDimensionPixelSize(R.dimen.tv_avatar_size)
presenter.setContact(mConversationPath)
setupAdapter()
presenter.setContact(mConversationPath)
}
private fun setupAdapter() {
......
......@@ -43,6 +43,7 @@ import android.view.animation.Animation
import android.widget.Toast
import androidx.appcompat.app.AlertDialog
import androidx.core.content.ContextCompat
import androidx.core.view.isVisible
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.transition.TransitionManager
import com.google.android.material.dialog.MaterialAlertDialogBuilder
......@@ -102,7 +103,37 @@ class TvConversationFragment : BaseSupportFragment<ConversationPresenter, Conver
}
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View =
FragConversationTvBinding.inflate(inflater, container, false).apply { binding = this }.root
FragConversationTvBinding.inflate(inflater, container, false).apply {
buttonText.setOnClickListener { displaySpeechRecognizer() }
buttonVideo.setOnClickListener {
if (checkAudioPermission(REQUEST_AUDIO_PERMISSION_FOR_VIDEO))
openVideoRecorder()
}
buttonAudio.setOnClickListener {
onRecord(mStartRecording)
mStartRecording = !mStartRecording
}
buttonText.onFocusChangeListener =
View.OnFocusChangeListener { _, hasFocus: Boolean ->
TransitionManager.beginDelayedTransition(textContainer)
textText.visibility = if (hasFocus) View.VISIBLE else View.GONE
}
buttonAudio.onFocusChangeListener =
View.OnFocusChangeListener { _, hasFocus: Boolean ->
TransitionManager.beginDelayedTransition(audioContainer)
textAudio.visibility = if (hasFocus) View.VISIBLE else View.GONE
}
buttonVideo.onFocusChangeListener =
View.OnFocusChangeListener { _, hasFocus: Boolean ->
TransitionManager.beginDelayedTransition(videoContainer)
textVideo.visibility = if (hasFocus) View.VISIBLE else View.GONE
}
recyclerView.layoutManager = LinearLayoutManager(root.context).apply {
reverseLayout = true
stackFromEnd = true
}
binding = this
}.root
override fun onDestroyView() {
super.onDestroyView()
......@@ -135,43 +166,9 @@ class TvConversationFragment : BaseSupportFragment<ConversationPresenter, Conver
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
//ConversationPath path = ConversationPath.fromIntent(requireActivity().getIntent());
presenter.init(mConversationPath!!.conversationUri, mConversationPath!!.accountId)
mAdapter = TvConversationAdapter(this, presenter)
binding!!.let { binding ->
binding.buttonText.setOnClickListener { displaySpeechRecognizer() }
binding.buttonVideo.setOnClickListener {
if (checkAudioPermission(REQUEST_AUDIO_PERMISSION_FOR_VIDEO))
openVideoRecorder()
}
binding.buttonAudio.setOnClickListener {
onRecord(mStartRecording)
mStartRecording = !mStartRecording
}
binding.buttonText.onFocusChangeListener =
View.OnFocusChangeListener { _, hasFocus: Boolean ->
TransitionManager.beginDelayedTransition(binding.textContainer)
binding.textText.visibility = if (hasFocus) View.VISIBLE else View.GONE
}
binding.buttonAudio.onFocusChangeListener =
View.OnFocusChangeListener { _, hasFocus: Boolean ->
TransitionManager.beginDelayedTransition(binding.audioContainer)
binding.textAudio.visibility = if (hasFocus) View.VISIBLE else View.GONE
}
binding.buttonVideo.onFocusChangeListener =
View.OnFocusChangeListener { _, hasFocus: Boolean ->
TransitionManager.beginDelayedTransition(binding.videoContainer)
binding.textVideo.visibility = if (hasFocus) View.VISIBLE else View.GONE
}
val linearLayoutManager = LinearLayoutManager(context)
linearLayoutManager.reverseLayout = true
linearLayoutManager.stackFromEnd = true
binding.recyclerView.layoutManager = linearLayoutManager
binding.recyclerView.adapter = mAdapter
}
presenter.init(mConversationPath!!.conversationUri, mConversationPath!!.accountId)
binding!!.recyclerView.adapter = mAdapter
}
private fun checkAudioPermission(code: Int): Boolean {
......@@ -626,27 +623,50 @@ class TvConversationFragment : BaseSupportFragment<ConversationPresenter, Conver
override fun goToContactActivity(accountId: String, uri: net.jami.model.Uri) {}
override fun switchToUnknownView(name: String) {
// todo
binding?.apply {
conversationActionGroup.isVisible = false
conversationActionMessage.text = getString(R.string.message_contact_not_trusted, name)
conversationActionMessage.isVisible = true
}
}
override fun switchToIncomingTrustRequestView(message: String) {
// todo
override fun switchToIncomingTrustRequestView(name: String) {
binding?.apply {
conversationActionGroup.isVisible = false
conversationActionMessage.text = name
conversationActionMessage.isVisible = true
}
}
override fun switchToConversationView() {
// todo
binding?.apply {
conversationActionGroup.isVisible = true
conversationActionMessage.isVisible = false
}
}
override fun switchToBannedView() {
// todo
binding?.apply {
conversationActionGroup.isVisible = false
conversationActionMessage.text = getString(R.string.conversation_contact_banned, "")
conversationActionMessage.isVisible = true
}
}
override fun switchToSyncingView() {
// todo
binding?.apply {
conversationActionGroup.isVisible = false
conversationActionMessage.text = getString(R.string.conversation_contact_banned, "")
conversationActionMessage.isVisible = true
}
}
override fun switchToEndedView() {
// todo
binding?.apply {
conversationActionGroup.isVisible = false
conversationActionMessage.text = getText(R.string.conversation_ended)
conversationActionMessage.isVisible = true
}
}
override fun openFilePicker() {}
......
......@@ -88,34 +88,28 @@ class MainFragment : BaseBrowseFragment<MainPresenter>(), MainView {
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
mTitleView = view.findViewById(R.id.browse_title_group)
super.onViewCreated(view, savedInstanceState)
setupUIElements(requireContext(), presenter.conversationFacade)
mTitleView = view.findViewById<CustomTitleView>(R.id.browse_title_group).apply {
settingsButton.setOnClickListener { presenter.onSettingsClicked() }
}
override fun onDestroyView() {
super.onDestroyView()
mDisposable.clear()
}
private fun setupUIElements(context: Context, conversationFacade: ConversationFacade) {
selector = CardPresenterSelector(context, conversationFacade)
onItemViewClickedListener = ItemViewClickedListener()
setOnSearchClickedListener { startActivity(Intent(context, SearchActivity::class.java)) }
selector = CardPresenterSelector(requireContext(), presenter.conversationFacade)
cardRowAdapter = ArrayObjectAdapter(selector)
/* Contact Presenter */
val contactRow = CardRow(false, getString(R.string.tv_contact_row_header), ArrayList())
val cardPresenterHeader = HeaderItem(HEADER_CONTACTS, getString(R.string.tv_contact_row_header))
val contactListRow = CardListRow(cardPresenterHeader, cardRowAdapter, contactRow)
accountSettingsRow = createAccountSettingsRow(context)
accountSettingsRow = createAccountSettingsRow(requireContext())
adapter = ArrayObjectAdapter(ShadowRowPresenterSelector()).apply {
add(contactListRow)
add(accountSettingsRow)
}
// listeners
setOnSearchClickedListener { startActivity(Intent(context, SearchActivity::class.java)) }
onItemViewClickedListener = ItemViewClickedListener()
mTitleView!!.settingsButton.setOnClickListener { presenter.onSettingsClicked() }
super.onViewCreated(view, savedInstanceState)
}
override fun onDestroyView() {
super.onDestroyView()
mDisposable.clear()
}
private fun createRow(titleSection: String, cards: List<Card>, shadow: Boolean): ListRow {
......
......@@ -63,7 +63,20 @@
app:cardCornerRadius="32dp"
app:cardElevation="4dp">
<TextView
android:id="@+id/conversation_action_message"
tools:text="@string/contact_request_msg"
tools:visibility="visible"
android:visibility="gone"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:textColor="@color/colorOnPrimary"
android:textAppearance="@style/TextAppearance.MaterialComponents.Body1"
android:gravity="center" />
<LinearLayout
android:id="@+id/conversation_action_group"
tools:visibility="gone"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:baselineAligned="false"
......
......@@ -92,7 +92,7 @@ class ConversationPresenter @Inject constructor(
}
private fun setConversation(account: Account, conversation: Conversation) {
Log.w(TAG, "setConversation " + conversation.aggregateHistory.size)
Log.w(TAG, "setConversation ${conversation.aggregateHistory.size}")
if (mConversation == conversation) return
mConversation = conversation
mConversationSubject.onNext(conversation)
......@@ -116,12 +116,9 @@ class ConversationPresenter @Inject constructor(
}) { e -> Log.e(TAG, "Error loading conversation", e) })
}
private fun initContact(account: Account,
c: ConversationItemViewModel,
view: ConversationView
) {
private fun initContact(account: Account, c: ConversationItemViewModel, view: ConversationView) {
if (account.isJami) {
Log.w(TAG, "initContact " + c.uri + " mode: " + c.mode)
Log.w(TAG, "initContact ${c.uri} mode: ${c.mode}")
if (c.mode === Conversation.Mode.Syncing) {
view.switchToSyncingView()
} else if (c.mode == Conversation.Mode.Request) {
......@@ -146,7 +143,7 @@ class ConversationPresenter @Inject constructor(
}
private fun initView(account: Account, c: Conversation, view: ConversationView) {
Log.w(TAG, "initView " + c.uri)
Log.w(TAG, "initView ${c.uri}")
val disposable = mConversationDisposable?.apply { clear() } ?: CompositeDisposable().apply {
mConversationDisposable = this
mCompositeDisposable.add(this)
......@@ -179,14 +176,12 @@ class ConversationPresenter @Inject constructor(
})
disposable.add(c.sortedHistory
.observeOn(uiScheduler)
.subscribe({ conversation: List<Interaction> -> this.view?.refreshView(conversation) }) { e: Throwable ->
Log.e(TAG, "Can't update element", e)
})
.subscribe({ conversation -> this.view?.refreshView(conversation) })
{ e -> Log.e(TAG, "Can't update element", e) })
disposable.add(c.cleared
.observeOn(uiScheduler)
.subscribe({ conversation: List<Interaction> -> this.view?.refreshView(conversation) }) { e: Throwable ->
Log.e(TAG, "Can't update elements", e)
})
.subscribe({ conversation -> this.view?.refreshView(conversation) })
{ e -> Log.e(TAG, "Can't update elements", e) })
disposable.add(c.contactUpdates
.switchMap { contacts -> Observable.merge(contactService.observeLoadedContact(c.accountId, contacts, true)) }
.observeOn(uiScheduler)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment