From 13a8bcd99ef94094e519e1a59f7a85e313c726d7 Mon Sep 17 00:00:00 2001 From: NIkita Fedrunov Date: Mon, 8 Aug 2022 16:21:18 +0200 Subject: [PATCH 1/4] dialpad moved from bottom navigation tab to a separate activity --- changelog.d/6787.wip | 1 + vector/src/main/AndroidManifest.xml | 1 + .../features/call/dialpad/PstnDialActivity.kt | 108 ++++++++++++++++++ .../vector/app/features/home/HomeActivity.kt | 5 + .../features/home/NewHomeDetailFragment.kt | 44 +------ vector/src/main/res/menu/menu_new_home.xml | 5 + 6 files changed, 123 insertions(+), 41 deletions(-) create mode 100644 changelog.d/6787.wip create mode 100644 vector/src/main/java/im/vector/app/features/call/dialpad/PstnDialActivity.kt diff --git a/changelog.d/6787.wip b/changelog.d/6787.wip new file mode 100644 index 00000000000..ace2b04d9ed --- /dev/null +++ b/changelog.d/6787.wip @@ -0,0 +1 @@ +[App Layout] Dialpad moved from bottom navigation tab to a separate activity accessed via home screen context menu diff --git a/vector/src/main/AndroidManifest.xml b/vector/src/main/AndroidManifest.xml index beee800b4a7..bed0b618d0a 100644 --- a/vector/src/main/AndroidManifest.xml +++ b/vector/src/main/AndroidManifest.xml @@ -348,6 +348,7 @@ + diff --git a/vector/src/main/java/im/vector/app/features/call/dialpad/PstnDialActivity.kt b/vector/src/main/java/im/vector/app/features/call/dialpad/PstnDialActivity.kt new file mode 100644 index 00000000000..5048121d173 --- /dev/null +++ b/vector/src/main/java/im/vector/app/features/call/dialpad/PstnDialActivity.kt @@ -0,0 +1,108 @@ +/* + * Copyright (c) 2022 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package im.vector.app.features.call.dialpad + +import android.os.Bundle +import androidx.appcompat.app.AlertDialog +import androidx.fragment.app.Fragment +import androidx.lifecycle.lifecycleScope +import com.google.android.material.dialog.MaterialAlertDialogBuilder +import dagger.hilt.android.AndroidEntryPoint +import im.vector.app.R +import im.vector.app.core.error.ErrorFormatter +import im.vector.app.core.extensions.addFragment +import im.vector.app.core.platform.SimpleFragmentActivity +import im.vector.app.features.call.webrtc.WebRtcCallManager +import im.vector.app.features.createdirect.DirectRoomHelper +import im.vector.app.features.settings.VectorLocale +import im.vector.lib.ui.styles.dialogs.MaterialProgressDialog +import kotlinx.coroutines.launch +import org.matrix.android.sdk.api.session.Session +import javax.inject.Inject + +@AndroidEntryPoint +class PstnDialActivity : SimpleFragmentActivity() { + + @Inject lateinit var callManager: WebRtcCallManager + @Inject lateinit var directRoomHelper: DirectRoomHelper + @Inject lateinit var session: Session + @Inject lateinit var errorFormatter: ErrorFormatter + + private var progress: AlertDialog? = null + + override fun getTitleRes(): Int = R.string.call + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + if (isFirstCreation()) { + addFragment( + views.container, + createDialPadFragment() + ) + } + } + + private fun handleStartCallWithPhoneNumber(rawNumber: String) { + lifecycleScope.launch { + try { + showLoadingDialog() + val result = DialPadLookup(session, callManager, directRoomHelper).lookupPhoneNumber(rawNumber) + callManager.startOutgoingCall(result.roomId, result.userId, isVideoCall = false) + dismissLoadingDialog() + finish() + } catch (failure: Throwable) { + displayErrorDialog(failure) + } + } + } + + private fun createDialPadFragment(): Fragment { + val fragment = supportFragmentManager.fragmentFactory.instantiate(classLoader, DialPadFragment::class.java.name) + return (fragment as DialPadFragment).apply { + arguments = Bundle().apply { + putBoolean(DialPadFragment.EXTRA_ENABLE_DELETE, true) + putBoolean(DialPadFragment.EXTRA_ENABLE_OK, true) + putString(DialPadFragment.EXTRA_REGION_CODE, VectorLocale.applicationLocale.country) + } + callback = object : DialPadFragment.Callback { + override fun onOkClicked(formatted: String?, raw: String?) { + if (raw.isNullOrEmpty()) return + handleStartCallWithPhoneNumber(raw) + } + } + } + } + + private fun showLoadingDialog() { + progress?.dismiss() + progress = MaterialProgressDialog(this) + .show(getString(R.string.please_wait)) + } + + private fun dismissLoadingDialog() { + progress?.dismiss() + } + + private fun displayErrorDialog(throwable: Throwable) { + MaterialAlertDialogBuilder(this) + .setTitle(R.string.dialog_title_error) + .setMessage(errorFormatter.toHumanReadable(throwable)) + .setPositiveButton(R.string.ok, null) + .show() + } +} diff --git a/vector/src/main/java/im/vector/app/features/home/HomeActivity.kt b/vector/src/main/java/im/vector/app/features/home/HomeActivity.kt index fe57b9f735c..52960a47127 100644 --- a/vector/src/main/java/im/vector/app/features/home/HomeActivity.kt +++ b/vector/src/main/java/im/vector/app/features/home/HomeActivity.kt @@ -54,6 +54,7 @@ import im.vector.app.features.MainActivityArgs import im.vector.app.features.analytics.accountdata.AnalyticsAccountDataViewModel import im.vector.app.features.analytics.plan.MobileScreen import im.vector.app.features.analytics.plan.ViewRoom +import im.vector.app.features.call.dialpad.PstnDialActivity import im.vector.app.features.crypto.recover.SetupMode import im.vector.app.features.disclaimer.showDisclaimerDialog import im.vector.app.features.matrixto.MatrixToBottomSheet @@ -600,6 +601,10 @@ class HomeActivity : launchInviteFriends() true } + R.id.menu_home_diapad -> { + startActivity(Intent(this, PstnDialActivity::class.java)) + true + } else -> false } } diff --git a/vector/src/main/java/im/vector/app/features/home/NewHomeDetailFragment.kt b/vector/src/main/java/im/vector/app/features/home/NewHomeDetailFragment.kt index 839ae6da889..0eef64f9498 100644 --- a/vector/src/main/java/im/vector/app/features/home/NewHomeDetailFragment.kt +++ b/vector/src/main/java/im/vector/app/features/home/NewHomeDetailFragment.kt @@ -22,7 +22,6 @@ import android.view.Menu import android.view.MenuItem import android.view.View import android.view.ViewGroup -import androidx.fragment.app.Fragment import androidx.lifecycle.lifecycleScope import com.airbnb.mvrx.activityViewModel import com.airbnb.mvrx.fragmentViewModel @@ -42,12 +41,10 @@ import im.vector.app.core.ui.views.KeysBackupBanner import im.vector.app.databinding.FragmentNewHomeDetailBinding import im.vector.app.features.call.SharedKnownCallsViewModel import im.vector.app.features.call.VectorCallActivity -import im.vector.app.features.call.dialpad.DialPadFragment import im.vector.app.features.call.webrtc.WebRtcCallManager import im.vector.app.features.home.room.list.home.HomeRoomListFragment import im.vector.app.features.popup.PopupAlertManager import im.vector.app.features.popup.VerificationVectorAlert -import im.vector.app.features.settings.VectorLocale import im.vector.app.features.settings.VectorPreferences import im.vector.app.features.settings.VectorSettingsActivity.Companion.EXTRA_DIRECT_ACCESS_SECURITY_PRIVACY_MANAGE_SESSIONS import im.vector.app.features.themes.ThemeUtils @@ -138,14 +135,10 @@ class NewHomeDetailFragment @Inject constructor( updateUIForTab(currentTab) } - viewModel.onEach(HomeDetailViewState::showDialPadTab) { showDialPadTab -> - updateTabVisibilitySafely(R.id.bottom_action_dial_pad, showDialPadTab) - } - viewModel.observeViewEvents { viewEvent -> when (viewEvent) { - HomeDetailViewEvents.CallStarted -> handleCallStarted() - is HomeDetailViewEvents.FailToCall -> showFailure(viewEvent.failure) + HomeDetailViewEvents.CallStarted -> Unit + is HomeDetailViewEvents.FailToCall -> Unit HomeDetailViewEvents.Loading -> showLoadingDialog() } } @@ -186,12 +179,6 @@ class NewHomeDetailFragment @Inject constructor( sharedActionViewModel.post(HomeActivitySharedAction.OnCloseSpace) } - private fun handleCallStarted() { - dismissLoadingDialog() - val fragmentTag = HomeTab.DialPad.toFragmentTag() - (childFragmentManager.findFragmentByTag(fragmentTag) as? DialPadFragment)?.clear() - } - override fun onDestroyView() { currentCallsViewPresenter.unBind() super.onDestroyView() @@ -339,30 +326,15 @@ class NewHomeDetailFragment @Inject constructor( add(R.id.roomListContainer, HomeRoomListFragment::class.java, null, fragmentTag) } is HomeTab.DialPad -> { - add(R.id.roomListContainer, createDialPadFragment(), fragmentTag) + throw NotImplementedError("this tab shouldn't exists when app layout is enabled") } } } else { - if (tab is HomeTab.DialPad) { - (fragmentToShow as? DialPadFragment)?.applyCallback() - } attach(fragmentToShow) } } } - private fun createDialPadFragment(): Fragment { - val fragment = childFragmentManager.fragmentFactory.instantiate(vectorBaseActivity.classLoader, DialPadFragment::class.java.name) - return (fragment as DialPadFragment).apply { - arguments = Bundle().apply { - putBoolean(DialPadFragment.EXTRA_ENABLE_DELETE, true) - putBoolean(DialPadFragment.EXTRA_ENABLE_OK, true) - putString(DialPadFragment.EXTRA_REGION_CODE, VectorLocale.applicationLocale.country) - } - applyCallback() - } - } - private fun updateTabVisibilitySafely(tabId: Int, isVisible: Boolean) { val wasVisible = views.bottomNavigationView.menu.findItem(tabId).isVisible views.bottomNavigationView.menu.findItem(tabId).isVisible = isVisible @@ -439,16 +411,6 @@ class NewHomeDetailFragment @Inject constructor( } } - private fun DialPadFragment.applyCallback(): DialPadFragment { - callback = object : DialPadFragment.Callback { - override fun onOkClicked(formatted: String?, raw: String?) { - if (raw.isNullOrEmpty()) return - viewModel.handle(HomeDetailAction.StartCallWithPhoneNumber(raw)) - } - } - return this - } - override fun onBackPressed(toolbarButton: Boolean) = if (spaceStateHandler.getCurrentSpace() != null) { navigateBack() true diff --git a/vector/src/main/res/menu/menu_new_home.xml b/vector/src/main/res/menu/menu_new_home.xml index e893624d549..98a72981777 100644 --- a/vector/src/main/res/menu/menu_new_home.xml +++ b/vector/src/main/res/menu/menu_new_home.xml @@ -8,6 +8,11 @@ android:title="@string/invite_friends" app:showAsAction="never" /> + + Date: Fri, 19 Aug 2022 14:48:00 +0200 Subject: [PATCH 2/4] added condition to show context menu --- .../java/im/vector/app/features/home/HomeActivity.kt | 5 ----- .../app/features/home/NewHomeDetailFragment.kt | 7 +++++++ vector/src/main/res/menu/menu_new_home.xml | 5 ----- vector/src/main/res/menu/room_list.xml | 12 ++++++++++-- 4 files changed, 17 insertions(+), 12 deletions(-) diff --git a/vector/src/main/java/im/vector/app/features/home/HomeActivity.kt b/vector/src/main/java/im/vector/app/features/home/HomeActivity.kt index 52960a47127..fe57b9f735c 100644 --- a/vector/src/main/java/im/vector/app/features/home/HomeActivity.kt +++ b/vector/src/main/java/im/vector/app/features/home/HomeActivity.kt @@ -54,7 +54,6 @@ import im.vector.app.features.MainActivityArgs import im.vector.app.features.analytics.accountdata.AnalyticsAccountDataViewModel import im.vector.app.features.analytics.plan.MobileScreen import im.vector.app.features.analytics.plan.ViewRoom -import im.vector.app.features.call.dialpad.PstnDialActivity import im.vector.app.features.crypto.recover.SetupMode import im.vector.app.features.disclaimer.showDisclaimerDialog import im.vector.app.features.matrixto.MatrixToBottomSheet @@ -601,10 +600,6 @@ class HomeActivity : launchInviteFriends() true } - R.id.menu_home_diapad -> { - startActivity(Intent(this, PstnDialActivity::class.java)) - true - } else -> false } } diff --git a/vector/src/main/java/im/vector/app/features/home/NewHomeDetailFragment.kt b/vector/src/main/java/im/vector/app/features/home/NewHomeDetailFragment.kt index 0eef64f9498..d45aaeb762a 100644 --- a/vector/src/main/java/im/vector/app/features/home/NewHomeDetailFragment.kt +++ b/vector/src/main/java/im/vector/app/features/home/NewHomeDetailFragment.kt @@ -16,6 +16,7 @@ package im.vector.app.features.home +import android.content.Intent import android.os.Bundle import android.view.LayoutInflater import android.view.Menu @@ -41,6 +42,7 @@ import im.vector.app.core.ui.views.KeysBackupBanner import im.vector.app.databinding.FragmentNewHomeDetailBinding import im.vector.app.features.call.SharedKnownCallsViewModel import im.vector.app.features.call.VectorCallActivity +import im.vector.app.features.call.dialpad.PstnDialActivity import im.vector.app.features.call.webrtc.WebRtcCallManager import im.vector.app.features.home.room.list.home.HomeRoomListFragment import im.vector.app.features.popup.PopupAlertManager @@ -96,6 +98,10 @@ class NewHomeDetailFragment @Inject constructor( viewModel.handle(HomeDetailAction.MarkAllRoomsRead) true } + R.id.menu_home_dialpad -> { + startActivity(Intent(requireContext(), PstnDialActivity::class.java)) + true + } else -> false } } @@ -104,6 +110,7 @@ class NewHomeDetailFragment @Inject constructor( withState(viewModel) { state -> val isRoomList = state.currentTab is HomeTab.RoomList menu.findItem(R.id.menu_home_mark_all_as_read).isVisible = isRoomList && hasUnreadRooms + menu.findItem(R.id.menu_home_dialpad).isVisible = state.showDialPadTab } } diff --git a/vector/src/main/res/menu/menu_new_home.xml b/vector/src/main/res/menu/menu_new_home.xml index 98a72981777..e893624d549 100644 --- a/vector/src/main/res/menu/menu_new_home.xml +++ b/vector/src/main/res/menu/menu_new_home.xml @@ -8,11 +8,6 @@ android:title="@string/invite_friends" app:showAsAction="never" /> - - - + - \ No newline at end of file + + From 58e4048490d7be43c796493968f36e528c47a2c9 Mon Sep 17 00:00:00 2001 From: NIkita Fedrunov Date: Fri, 19 Aug 2022 14:49:24 +0200 Subject: [PATCH 3/4] dismiss loading dialog in case of failure --- .../java/im/vector/app/features/call/dialpad/PstnDialActivity.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/vector/src/main/java/im/vector/app/features/call/dialpad/PstnDialActivity.kt b/vector/src/main/java/im/vector/app/features/call/dialpad/PstnDialActivity.kt index 5048121d173..40d2317e9d1 100644 --- a/vector/src/main/java/im/vector/app/features/call/dialpad/PstnDialActivity.kt +++ b/vector/src/main/java/im/vector/app/features/call/dialpad/PstnDialActivity.kt @@ -66,6 +66,7 @@ class PstnDialActivity : SimpleFragmentActivity() { dismissLoadingDialog() finish() } catch (failure: Throwable) { + dismissLoadingDialog() displayErrorDialog(failure) } } From 6fe401caf01175f16277ea12187c2243062fcf02 Mon Sep 17 00:00:00 2001 From: NIkita Fedrunov Date: Fri, 19 Aug 2022 15:15:03 +0200 Subject: [PATCH 4/4] alert dialog is replaced with appcompat dialog --- .../im/vector/app/features/call/dialpad/PstnDialActivity.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/vector/src/main/java/im/vector/app/features/call/dialpad/PstnDialActivity.kt b/vector/src/main/java/im/vector/app/features/call/dialpad/PstnDialActivity.kt index 40d2317e9d1..a0d6e29849b 100644 --- a/vector/src/main/java/im/vector/app/features/call/dialpad/PstnDialActivity.kt +++ b/vector/src/main/java/im/vector/app/features/call/dialpad/PstnDialActivity.kt @@ -17,7 +17,7 @@ package im.vector.app.features.call.dialpad import android.os.Bundle -import androidx.appcompat.app.AlertDialog +import androidx.appcompat.app.AppCompatDialog import androidx.fragment.app.Fragment import androidx.lifecycle.lifecycleScope import com.google.android.material.dialog.MaterialAlertDialogBuilder @@ -42,7 +42,7 @@ class PstnDialActivity : SimpleFragmentActivity() { @Inject lateinit var session: Session @Inject lateinit var errorFormatter: ErrorFormatter - private var progress: AlertDialog? = null + private var progress: AppCompatDialog? = null override fun getTitleRes(): Int = R.string.call