diff --git a/jami-android/app/src/main/java/cx/ring/tv/contact/TVContactFragment.kt b/jami-android/app/src/main/java/cx/ring/tv/contact/TVContactFragment.kt index 13f62e9e6b9b7e0fe02b4d95b7a69a9db0fb4282..4521932f1d99f2224ab0dee4df66e7cfa0ca8ed9 100644 --- a/jami-android/app/src/main/java/cx/ring/tv/contact/TVContactFragment.kt +++ b/jami-android/app/src/main/java/cx/ring/tv/contact/TVContactFragment.kt @@ -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() { diff --git a/jami-android/app/src/main/java/cx/ring/tv/conversation/TvConversationFragment.kt b/jami-android/app/src/main/java/cx/ring/tv/conversation/TvConversationFragment.kt index ce10e602bed8d586f0306bcc5d14c623b1c4ba2e..68701ad4a1727470d5ae5b8b187703d6a4a10ca0 100644 --- a/jami-android/app/src/main/java/cx/ring/tv/conversation/TvConversationFragment.kt +++ b/jami-android/app/src/main/java/cx/ring/tv/conversation/TvConversationFragment.kt @@ -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() {} diff --git a/jami-android/app/src/main/java/cx/ring/tv/main/MainFragment.kt b/jami-android/app/src/main/java/cx/ring/tv/main/MainFragment.kt index 728d846b54ade759273a48e7f1303cc47501df21..9a6a64cd24f11a08f70947f5a22d62483ec3d5a8 100644 --- a/jami-android/app/src/main/java/cx/ring/tv/main/MainFragment.kt +++ b/jami-android/app/src/main/java/cx/ring/tv/main/MainFragment.kt @@ -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) - } - - override fun onDestroyView() { - super.onDestroyView() - mDisposable.clear() - } - - private fun setupUIElements(context: Context, conversationFacade: ConversationFacade) { - selector = CardPresenterSelector(context, conversationFacade) + mTitleView = view.findViewById<CustomTitleView>(R.id.browse_title_group).apply { + settingsButton.setOnClickListener { presenter.onSettingsClicked() } + } + 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 { diff --git a/jami-android/app/src/main/res/layout/frag_conversation_tv.xml b/jami-android/app/src/main/res/layout/frag_conversation_tv.xml index 70647e86179f64856e9884937bd410b31457d279..350c0b65311f972b870fb5af0c3ba0cb1ea4796e 100644 --- a/jami-android/app/src/main/res/layout/frag_conversation_tv.xml +++ b/jami-android/app/src/main/res/layout/frag_conversation_tv.xml @@ -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" diff --git a/jami-android/libjamiclient/src/main/kotlin/net/jami/conversation/ConversationPresenter.kt b/jami-android/libjamiclient/src/main/kotlin/net/jami/conversation/ConversationPresenter.kt index a48c54372eb557dc091a2855491df4584e92cd19..ccbf9a78fe7d6a14790af0485cd571dd335f9dd8 100644 --- a/jami-android/libjamiclient/src/main/kotlin/net/jami/conversation/ConversationPresenter.kt +++ b/jami-android/libjamiclient/src/main/kotlin/net/jami/conversation/ConversationPresenter.kt @@ -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)