diff --git a/app/build.gradle b/app/build.gradle index 9810fcd74..5ec831479 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -235,13 +235,16 @@ dependencies { implementation 'androidx.appcompat:appcompat:1.3.0' implementation 'androidx.media:media:1.2.0' - implementation 'androidx.fragment:fragment-ktx:1.3.4' - implementation 'androidx.core:core-ktx:1.6.0-beta02' + implementation 'androidx.fragment:fragment-ktx:1.4.0-alpha03' + implementation 'androidx.core:core-ktx:1.6.0-rc01' def nav_version = "2.3.5" implementation "androidx.navigation:navigation-fragment-ktx:$nav_version" implementation "androidx.navigation:navigation-ui-ktx:$nav_version" + implementation "androidx.slidingpanelayout:slidingpanelayout:1.2.0-alpha02" + implementation "androidx.window:window:1.0.0-alpha08" + implementation 'androidx.constraintlayout:constraintlayout:2.0.4' implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0' implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1' diff --git a/app/src/main/java/org/linphone/activities/GenericActivity.kt b/app/src/main/java/org/linphone/activities/GenericActivity.kt index 5441ca9e9..2ea9f174e 100644 --- a/app/src/main/java/org/linphone/activities/GenericActivity.kt +++ b/app/src/main/java/org/linphone/activities/GenericActivity.kt @@ -23,13 +23,20 @@ import android.annotation.SuppressLint import android.content.pm.ActivityInfo import android.content.res.Configuration import android.os.Bundle +import android.os.Handler +import android.os.Looper import android.util.DisplayMetrics import android.view.Display import android.view.Surface import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatDelegate +import androidx.core.util.Consumer import androidx.navigation.ActivityNavigator +import androidx.window.FoldingFeature +import androidx.window.WindowLayoutInfo +import androidx.window.WindowManager import java.util.* +import java.util.concurrent.Executor import org.linphone.LinphoneApplication.Companion.coreContext import org.linphone.LinphoneApplication.Companion.corePreferences import org.linphone.LinphoneApplication.Companion.ensureCoreExists @@ -42,10 +49,57 @@ abstract class GenericActivity : AppCompatActivity() { val isDestructionPending: Boolean get() = _isDestructionPending + private lateinit var windowManagerX: WindowManager + + inner class LayoutStateChangeCallback : Consumer { + override fun accept(newLayoutInfo: WindowLayoutInfo) { + Log.i("[Layout State Change] $newLayoutInfo") + + if (newLayoutInfo.displayFeatures.isEmpty()) { + onLayoutChanges(null) + } else { + for (feature in newLayoutInfo.displayFeatures) { + val foldingFeature = feature as? FoldingFeature + if (foldingFeature != null) { + onLayoutChanges(foldingFeature) + } + } + } + } + } + private val layoutStateChangeCallback = LayoutStateChangeCallback() + + private fun runOnUiThreadExecutor(): Executor { + val handler = Handler(Looper.getMainLooper()) + return Executor() { + handler.post(it) + } + } + + override fun onAttachedToWindow() { + super.onAttachedToWindow() + + windowManagerX.registerLayoutChangeCallback( + runOnUiThreadExecutor(), + layoutStateChangeCallback + ) + } + + override fun onDetachedFromWindow() { + super.onDetachedFromWindow() + + windowManagerX.unregisterLayoutChangeCallback(layoutStateChangeCallback) + } + + open fun onLayoutChanges(foldingFeature: FoldingFeature?) { + } + @SuppressLint("SourceLockedOrientationActivity") override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) + windowManagerX = WindowManager(this) + ensureCoreExists(applicationContext) requestedOrientation = if (corePreferences.forcePortrait) { diff --git a/app/src/main/java/org/linphone/activities/GenericFragment.kt b/app/src/main/java/org/linphone/activities/GenericFragment.kt index b88ffde0c..0f68b1cd1 100644 --- a/app/src/main/java/org/linphone/activities/GenericFragment.kt +++ b/app/src/main/java/org/linphone/activities/GenericFragment.kt @@ -23,14 +23,23 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import androidx.activity.OnBackPressedCallback +import androidx.activity.addCallback import androidx.databinding.DataBindingUtil import androidx.databinding.ViewDataBinding import androidx.fragment.app.Fragment +import androidx.navigation.fragment.findNavController abstract class GenericFragment : Fragment() { private var _binding: T? = null protected val binding get() = _binding!! + private val onBackPressedCallback = object : OnBackPressedCallback(true) { + override fun handleOnBackPressed() { + goBack() + } + } + abstract fun getLayoutId(): Int override fun onCreateView( @@ -42,8 +51,23 @@ abstract class GenericFragment : Fragment() { return _binding!!.root } + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + requireActivity().onBackPressedDispatcher.addCallback(this, onBackPressedCallback) + } + override fun onDestroyView() { super.onDestroyView() _binding = null } + + protected open fun goBack() { + if (!findNavController().popBackStack()) { + if (!findNavController().navigateUp()) { + onBackPressedCallback.isEnabled = false + requireActivity().onBackPressed() + } + } + } } diff --git a/app/src/main/java/org/linphone/activities/Navigation.kt b/app/src/main/java/org/linphone/activities/Navigation.kt index ed36a6cf1..75a8d7bb6 100644 --- a/app/src/main/java/org/linphone/activities/Navigation.kt +++ b/app/src/main/java/org/linphone/activities/Navigation.kt @@ -50,11 +50,7 @@ import org.linphone.contact.NativeContact import org.linphone.core.Address internal fun Fragment.findMasterNavController(): NavController { - return if (!resources.getBoolean(R.bool.isTablet)) { - findNavController() - } else { - parentFragment?.parentFragment?.findNavController() ?: findNavController() - } + return parentFragment?.parentFragment?.findNavController() ?: findNavController() } fun getRightToLeftAnimationNavOptions( @@ -149,6 +145,16 @@ fun getLeftTopToRightBottomNoPopAnimationNavOptions( .build() } +fun popupTo( + popUpTo: Int = -1, + popUpInclusive: Boolean = false, + singleTop: Boolean = true +): NavOptions { + val builder = NavOptions.Builder() + builder.setPopUpTo(popUpTo, popUpInclusive).setLaunchSingleTop(singleTop) + return builder.build() +} + /* Main activity related */ internal fun MainActivity.navigateToDialer(args: Bundle?) { @@ -263,21 +269,20 @@ internal fun DialerFragment.navigateToConfigFileViewer() { /* Chat related */ internal fun MasterChatRoomsFragment.navigateToChatRoom(args: Bundle) { - if (!resources.getBoolean(R.bool.isTablet)) { - if (findNavController().currentDestination?.id == R.id.masterChatRoomsFragment) { - findNavController().navigate( - R.id.action_masterChatRoomsFragment_to_detailChatRoomFragment, - args, - getRightToLeftAnimationNavOptions() - ) - } - } else { - val navHostFragment = - childFragmentManager.findFragmentById(R.id.chat_nav_container) as NavHostFragment + val navHostFragment = + childFragmentManager.findFragmentById(R.id.chat_nav_container) as NavHostFragment + val previousBackStackEntry = navHostFragment.navController.currentBackStackEntry + if (previousBackStackEntry == null || previousBackStackEntry.destination.id == R.id.emptyChatFragment) { navHostFragment.navController.navigate( R.id.action_global_detailChatRoomFragment, args, - getRightToLeftAnimationNavOptions(R.id.emptyChatFragment, true) + popupTo(R.id.emptyChatFragment, true) + ) + } else { + navHostFragment.navController.navigate( + R.id.action_global_detailChatRoomFragment, + args, + popupTo(R.id.chatRoomCreationFragment, true) ) } } @@ -286,21 +291,20 @@ internal fun MasterChatRoomsFragment.navigateToChatRoomCreation( createGroupChatRoom: Boolean = false ) { val bundle = bundleOf("createGroup" to createGroupChatRoom) - if (!resources.getBoolean(R.bool.isTablet)) { - if (findNavController().currentDestination?.id == R.id.masterChatRoomsFragment) { - findNavController().navigate( - R.id.action_masterChatRoomsFragment_to_chatRoomCreationFragment, - bundle, - getRightToLeftAnimationNavOptions() - ) - } - } else { - val navHostFragment = - childFragmentManager.findFragmentById(R.id.chat_nav_container) as NavHostFragment + val navHostFragment = + childFragmentManager.findFragmentById(R.id.chat_nav_container) as NavHostFragment + val previousBackStackEntry = navHostFragment.navController.currentBackStackEntry + if (previousBackStackEntry == null || previousBackStackEntry.destination.id == R.id.emptyChatFragment) { navHostFragment.navController.navigate( R.id.action_global_chatRoomCreationFragment, bundle, - getRightToLeftAnimationNavOptions(R.id.emptyChatFragment, true) + popupTo(R.id.emptyChatFragment, true) + ) + } else { + navHostFragment.navController.navigate( + R.id.action_global_chatRoomCreationFragment, + bundle, + popupTo(R.id.detailChatRoomFragment, true) ) } } @@ -310,14 +314,6 @@ internal fun DetailChatRoomFragment.navigateToContacts(sipUriToAdd: String) { findMasterNavController().navigate(Uri.parse(deepLink), getLeftToRightAnimationNavOptions()) } -internal fun DetailChatRoomFragment.navigateToChatRooms() { - findMasterNavController().navigate( - R.id.action_global_masterChatRoomsFragment, - null, - getLeftToRightAnimationNavOptions(R.id.masterChatRoomsFragment) - ) -} - internal fun DetailChatRoomFragment.navigateToImdn(args: Bundle?) { if (findNavController().currentDestination?.id == R.id.detailChatRoomFragment) { findNavController().navigate( @@ -415,19 +411,11 @@ internal fun ChatRoomCreationFragment.navigateToGroupInfo() { internal fun ChatRoomCreationFragment.navigateToChatRoom(args: Bundle) { if (findNavController().currentDestination?.id == R.id.chatRoomCreationFragment) { - if (!resources.getBoolean(R.bool.isTablet)) { - findNavController().navigate( - R.id.action_chatRoomCreationFragment_to_detailChatRoomFragment, - args, - getRightToLeftAnimationNavOptions() - ) - } else { - findNavController().navigate( - R.id.action_chatRoomCreationFragment_to_detailChatRoomFragment, - args, - getRightToLeftAnimationNavOptions(R.id.emptyFragment, true) - ) - } + findNavController().navigate( + R.id.action_chatRoomCreationFragment_to_detailChatRoomFragment, + args, + getRightToLeftAnimationNavOptions(R.id.emptyFragment, true) + ) } } @@ -442,59 +430,37 @@ internal fun GroupInfoFragment.navigateToChatRoomCreation(args: Bundle?) { internal fun GroupInfoFragment.navigateToChatRoom(args: Bundle?) { if (findNavController().currentDestination?.id == R.id.groupInfoFragment) { - if (!resources.getBoolean(R.bool.isTablet)) { - findNavController().navigate( - R.id.action_groupInfoFragment_to_detailChatRoomFragment, - args, - getRightToLeftAnimationNavOptions() - ) - } else { - findNavController().navigate( - R.id.action_groupInfoFragment_to_detailChatRoomFragment, - args, - getRightToLeftAnimationNavOptions(R.id.emptyFragment, true) - ) - } + findNavController().navigate( + R.id.action_groupInfoFragment_to_detailChatRoomFragment, + args, + getRightToLeftAnimationNavOptions(R.id.emptyFragment, true) + ) } } /* Contacts related */ internal fun MasterContactsFragment.navigateToContact() { - if (!resources.getBoolean(R.bool.isTablet)) { - if (findNavController().currentDestination?.id == R.id.masterContactsFragment) { - findNavController().navigate(R.id.action_masterContactsFragment_to_detailContactFragment, - null, - getRightToLeftAnimationNavOptions()) - } - } else { + if (findNavController().currentDestination?.id == R.id.masterContactsFragment) { val navHostFragment = childFragmentManager.findFragmentById(R.id.contacts_nav_container) as NavHostFragment navHostFragment.navController.navigate( R.id.action_global_detailContactFragment, null, - getRightToLeftAnimationNavOptions(R.id.emptyContactFragment, true) + popupTo(R.id.emptyContactFragment, true) ) } } internal fun MasterContactsFragment.navigateToContactEditor(sipUriToAdd: String? = null) { - val bundle = if (sipUriToAdd != null) bundleOf("SipUri" to sipUriToAdd) else Bundle() - if (!resources.getBoolean(R.bool.isTablet)) { - if (findNavController().currentDestination?.id == R.id.masterContactsFragment) { - findNavController().navigate( - R.id.action_masterContactsFragment_to_contactEditorFragment, - bundle, - getRightToLeftAnimationNavOptions() - ) - } - } else { + if (findNavController().currentDestination?.id == R.id.masterContactsFragment) { + val bundle = if (sipUriToAdd != null) bundleOf("SipUri" to sipUriToAdd) else Bundle() val navHostFragment = childFragmentManager.findFragmentById(R.id.contacts_nav_container) as NavHostFragment navHostFragment.navController.navigate( R.id.action_global_contactEditorFragment, bundle, - getRightToLeftAnimationNavOptions() + popupTo() ) } } @@ -505,24 +471,16 @@ internal fun ContactEditorFragment.navigateToContact(contact: NativeContact) { findNavController().navigate( R.id.action_contactEditorFragment_to_detailContactFragment, bundle, - getRightToLeftAnimationNavOptions(R.id.masterContactsFragment, false) + popupTo(R.id.masterContactsFragment, false) ) } internal fun DetailContactFragment.navigateToChatRoom(args: Bundle?) { - if (!resources.getBoolean(R.bool.isTablet)) { - findNavController().navigate( - R.id.action_detailContactFragment_to_detailChatRoomFragment, - args, - getRightBottomToLeftTopAnimationNavOptions() - ) - } else { - findMasterNavController().navigate( - R.id.action_global_masterChatRoomsFragment, - args, - getRightBottomToLeftTopAnimationNavOptions() - ) - } + findMasterNavController().navigate( + R.id.action_global_masterChatRoomsFragment, + args, + getRightBottomToLeftTopAnimationNavOptions() + ) } internal fun DetailContactFragment.navigateToDialer(args: Bundle?) { @@ -538,7 +496,7 @@ internal fun DetailContactFragment.navigateToContactEditor() { findNavController().navigate( R.id.action_detailContactFragment_to_contactEditorFragment, null, - getRightToLeftAnimationNavOptions() + popupTo() ) } } @@ -546,21 +504,13 @@ internal fun DetailContactFragment.navigateToContactEditor() { /* History related */ internal fun MasterCallLogsFragment.navigateToCallHistory() { - if (!resources.getBoolean(R.bool.isTablet)) { - if (findNavController().currentDestination?.id == R.id.masterCallLogsFragment) { - findNavController().navigate( - R.id.action_masterCallLogsFragment_to_detailCallLogFragment, - null, - getRightToLeftAnimationNavOptions() - ) - } - } else { + if (findNavController().currentDestination?.id == R.id.masterCallLogsFragment) { val navHostFragment = childFragmentManager.findFragmentById(R.id.history_nav_container) as NavHostFragment navHostFragment.navController.navigate( R.id.action_global_detailCallLogFragment, null, - getRightToLeftAnimationNavOptions(R.id.emptyFragment, true) + popupTo(R.id.emptyFragment, true) ) } } @@ -579,18 +529,8 @@ internal fun DetailCallLogFragment.navigateToContacts(sipUriToAdd: String) { } internal fun DetailCallLogFragment.navigateToContact(contact: NativeContact) { - if (!resources.getBoolean(R.bool.isTablet)) { - val args = Bundle() - args.putString("id", contact.nativeId) - findMasterNavController().navigate( - R.id.action_detailCallLogFragment_to_detailContactFragment, - args, - getRightBottomToLeftTopAnimationNavOptions() - ) - } else { - val deepLink = "linphone-android://contact/view/${contact.nativeId}" - findMasterNavController().navigate(Uri.parse(deepLink), getRightBottomToLeftTopAnimationNavOptions()) - } + val deepLink = "linphone-android://contact/view/${contact.nativeId}" + findMasterNavController().navigate(Uri.parse(deepLink), getRightBottomToLeftTopAnimationNavOptions()) } internal fun DetailCallLogFragment.navigateToFriend(friendAddress: Address) { @@ -599,19 +539,11 @@ internal fun DetailCallLogFragment.navigateToFriend(friendAddress: Address) { } internal fun DetailCallLogFragment.navigateToChatRoom(args: Bundle?) { - if (!resources.getBoolean(R.bool.isTablet)) { - findNavController().navigate( - R.id.action_detailCallLogFragment_to_detailChatRoomFragment, - args, - getRightBottomToLeftTopAnimationNavOptions() - ) - } else { - findMasterNavController().navigate( - R.id.action_global_masterChatRoomsFragment, - args, - getRightBottomToLeftTopAnimationNavOptions() - ) - } + findMasterNavController().navigate( + R.id.action_global_masterChatRoomsFragment, + args, + getRightBottomToLeftTopAnimationNavOptions() + ) } internal fun DetailCallLogFragment.navigateToDialer(args: Bundle?) { @@ -625,182 +557,110 @@ internal fun DetailCallLogFragment.navigateToDialer(args: Bundle?) { /* Settings related */ internal fun SettingsFragment.navigateToAccountSettings(identity: String) { - val bundle = bundleOf("Identity" to identity) - if (!resources.getBoolean(R.bool.isTablet)) { - if (findNavController().currentDestination?.id == R.id.settingsFragment) { - findNavController().navigate( - R.id.action_settingsFragment_to_accountSettingsFragment, - bundle, - getRightToLeftAnimationNavOptions() - ) - } - } else { + if (findNavController().currentDestination?.id == R.id.settingsFragment) { + val bundle = bundleOf("Identity" to identity) val navHostFragment = childFragmentManager.findFragmentById(R.id.settings_nav_container) as NavHostFragment navHostFragment.navController.navigate( R.id.action_global_accountSettingsFragment, bundle, - getRightToLeftAnimationNavOptions() + popupTo() ) } } internal fun SettingsFragment.navigateToTunnelSettings() { - if (!resources.getBoolean(R.bool.isTablet)) { - if (findNavController().currentDestination?.id == R.id.settingsFragment) { - findNavController().navigate( - R.id.action_settingsFragment_to_tunnelSettingsFragment, - null, - getRightToLeftAnimationNavOptions() - ) - } - } else { + if (findNavController().currentDestination?.id == R.id.settingsFragment) { val navHostFragment = childFragmentManager.findFragmentById(R.id.settings_nav_container) as NavHostFragment navHostFragment.navController.navigate( R.id.action_global_tunnelSettingsFragment, null, - getRightToLeftAnimationNavOptions() + popupTo() ) } } internal fun SettingsFragment.navigateToAudioSettings() { - if (!resources.getBoolean(R.bool.isTablet)) { - if (findNavController().currentDestination?.id == R.id.settingsFragment) { - findNavController().navigate( - R.id.action_settingsFragment_to_audioSettingsFragment, - null, - getRightToLeftAnimationNavOptions() - ) - } - } else { + if (findNavController().currentDestination?.id == R.id.settingsFragment) { val navHostFragment = childFragmentManager.findFragmentById(R.id.settings_nav_container) as NavHostFragment navHostFragment.navController.navigate( R.id.action_global_audioSettingsFragment, null, - getRightToLeftAnimationNavOptions() + popupTo() ) } } internal fun SettingsFragment.navigateToVideoSettings() { - if (!resources.getBoolean(R.bool.isTablet)) { - if (findNavController().currentDestination?.id == R.id.settingsFragment) { - findNavController().navigate( - R.id.action_settingsFragment_to_videoSettingsFragment, - null, - getRightToLeftAnimationNavOptions() - ) - } - } else { + if (findNavController().currentDestination?.id == R.id.settingsFragment) { val navHostFragment = childFragmentManager.findFragmentById(R.id.settings_nav_container) as NavHostFragment navHostFragment.navController.navigate( R.id.action_global_videoSettingsFragment, null, - getRightToLeftAnimationNavOptions() + popupTo() ) } } internal fun SettingsFragment.navigateToCallSettings() { - if (!resources.getBoolean(R.bool.isTablet)) { - if (findNavController().currentDestination?.id == R.id.settingsFragment) { - findNavController().navigate( - R.id.action_settingsFragment_to_callSettingsFragment, - null, - getRightToLeftAnimationNavOptions() - ) - } - } else { + if (findNavController().currentDestination?.id == R.id.settingsFragment) { val navHostFragment = childFragmentManager.findFragmentById(R.id.settings_nav_container) as NavHostFragment navHostFragment.navController.navigate( R.id.action_global_callSettingsFragment, null, - getRightToLeftAnimationNavOptions() + popupTo() ) } } internal fun SettingsFragment.navigateToChatSettings() { - if (!resources.getBoolean(R.bool.isTablet)) { - if (findNavController().currentDestination?.id == R.id.settingsFragment) { - findNavController().navigate( - R.id.action_settingsFragment_to_chatSettingsFragment, - null, - getRightToLeftAnimationNavOptions() - ) - } - } else { + if (findNavController().currentDestination?.id == R.id.settingsFragment) { val navHostFragment = childFragmentManager.findFragmentById(R.id.settings_nav_container) as NavHostFragment navHostFragment.navController.navigate( R.id.action_global_chatSettingsFragment, null, - getRightToLeftAnimationNavOptions() - ) + popupTo() + ) } } internal fun SettingsFragment.navigateToNetworkSettings() { - if (!resources.getBoolean(R.bool.isTablet)) { - if (findNavController().currentDestination?.id == R.id.settingsFragment) { - findNavController().navigate( - R.id.action_settingsFragment_to_networkSettingsFragment, - null, - getRightToLeftAnimationNavOptions() - ) - } - } else { + if (findNavController().currentDestination?.id == R.id.settingsFragment) { val navHostFragment = childFragmentManager.findFragmentById(R.id.settings_nav_container) as NavHostFragment navHostFragment.navController.navigate( R.id.action_global_networkSettingsFragment, null, - getRightToLeftAnimationNavOptions() + popupTo() ) } } internal fun SettingsFragment.navigateToContactsSettings() { - if (!resources.getBoolean(R.bool.isTablet)) { - if (findNavController().currentDestination?.id == R.id.settingsFragment) { - findNavController().navigate( - R.id.action_settingsFragment_to_contactsSettingsFragment, - null, - getRightToLeftAnimationNavOptions() - ) - } - } else { + if (findNavController().currentDestination?.id == R.id.settingsFragment) { val navHostFragment = childFragmentManager.findFragmentById(R.id.settings_nav_container) as NavHostFragment navHostFragment.navController.navigate( R.id.action_global_contactsSettingsFragment, null, - getRightToLeftAnimationNavOptions() + popupTo() ) } } internal fun SettingsFragment.navigateToAdvancedSettings() { - if (!resources.getBoolean(R.bool.isTablet)) { - if (findNavController().currentDestination?.id == R.id.settingsFragment) { - findNavController().navigate( - R.id.action_settingsFragment_to_advancedSettingsFragment, - null, - getRightToLeftAnimationNavOptions() - ) - } - } else { + if (findNavController().currentDestination?.id == R.id.settingsFragment) { val navHostFragment = childFragmentManager.findFragmentById(R.id.settings_nav_container) as NavHostFragment navHostFragment.navController.navigate( R.id.action_global_advancedSettingsFragment, null, - getRightToLeftAnimationNavOptions() + popupTo() ) } } @@ -810,7 +670,7 @@ internal fun AccountSettingsFragment.navigateToPhoneLinking(args: Bundle?) { findNavController().navigate( R.id.action_accountSettingsFragment_to_phoneAccountLinkingFragment, args, - getRightToLeftAnimationNavOptions() + popupTo() ) } } @@ -820,7 +680,7 @@ internal fun PhoneAccountLinkingFragment.navigateToPhoneAccountValidation(args: findNavController().navigate( R.id.action_phoneAccountLinkingFragment_to_phoneAccountValidationFragment, args, - getRightToLeftAnimationNavOptions() + popupTo() ) } } diff --git a/app/src/main/java/org/linphone/activities/assistant/fragments/TopBarFragment.kt b/app/src/main/java/org/linphone/activities/assistant/fragments/TopBarFragment.kt index 8ad5dde06..93eb41b8e 100644 --- a/app/src/main/java/org/linphone/activities/assistant/fragments/TopBarFragment.kt +++ b/app/src/main/java/org/linphone/activities/assistant/fragments/TopBarFragment.kt @@ -21,7 +21,6 @@ package org.linphone.activities.assistant.fragments import android.os.Bundle import android.view.View -import androidx.activity.addCallback import androidx.navigation.fragment.findNavController import org.linphone.LinphoneApplication.Companion.corePreferences import org.linphone.R @@ -31,14 +30,6 @@ import org.linphone.databinding.AssistantTopBarFragmentBinding class TopBarFragment : GenericFragment() { override fun getLayoutId(): Int = R.layout.assistant_top_bar_fragment - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - - requireActivity().onBackPressedDispatcher.addCallback(this) { - goBack() - } - } - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) @@ -49,7 +40,7 @@ class TopBarFragment : GenericFragment() { } } - private fun goBack() { + override fun goBack() { if (!findNavController().popBackStack()) { requireActivity().finish() if (corePreferences.enableAnimations) { diff --git a/app/src/main/java/org/linphone/activities/main/MainActivity.kt b/app/src/main/java/org/linphone/activities/main/MainActivity.kt index 5fc48438b..c9378d6f4 100644 --- a/app/src/main/java/org/linphone/activities/main/MainActivity.kt +++ b/app/src/main/java/org/linphone/activities/main/MainActivity.kt @@ -35,6 +35,7 @@ import androidx.lifecycle.lifecycleScope import androidx.navigation.NavController import androidx.navigation.NavDestination import androidx.navigation.findNavController +import androidx.window.FoldingFeature import com.google.android.material.snackbar.Snackbar import java.io.UnsupportedEncodingException import java.net.URLDecoder @@ -54,6 +55,7 @@ import org.linphone.contact.ContactsUpdatedListenerStub import org.linphone.core.tools.Log import org.linphone.databinding.MainActivityBinding import org.linphone.utils.AppUtils +import org.linphone.utils.Event import org.linphone.utils.FileUtils class MainActivity : GenericActivity(), SnackBarActivity, NavController.OnDestinationChangedListener { @@ -81,6 +83,10 @@ class MainActivity : GenericActivity(), SnackBarActivity, NavController.OnDestin private var initPosY = 0f private var overlay: View? = null + override fun onLayoutChanges(foldingFeature: FoldingFeature?) { + sharedViewModel.layoutChangedEvent.value = Event(true) + } + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -170,11 +176,19 @@ class MainActivity : GenericActivity(), SnackBarActivity, NavController.OnDestin when (destination.id) { R.id.masterCallLogsFragment, R.id.masterContactsFragment, R.id.dialerFragment, R.id.masterChatRoomsFragment -> - tabsFragment.visibility = View.VISIBLE - else -> tabsFragment.visibility = View.GONE + showTabsFragment() + else -> hideTabsFragment() } } + fun showTabsFragment() { + tabsFragment.visibility = View.VISIBLE + } + + fun hideTabsFragment() { + tabsFragment.visibility = View.GONE + } + fun hideStatusFragment() { statusFragment.visibility = View.GONE } diff --git a/app/src/main/java/org/linphone/activities/main/about/AboutFragment.kt b/app/src/main/java/org/linphone/activities/main/about/AboutFragment.kt index 40778a32c..6429185f6 100644 --- a/app/src/main/java/org/linphone/activities/main/about/AboutFragment.kt +++ b/app/src/main/java/org/linphone/activities/main/about/AboutFragment.kt @@ -24,7 +24,6 @@ import android.net.Uri import android.os.Bundle import android.view.View import androidx.lifecycle.ViewModelProvider -import androidx.navigation.fragment.findNavController import org.linphone.R import org.linphone.activities.main.fragments.SecureFragment import org.linphone.databinding.AboutFragmentBinding @@ -42,7 +41,7 @@ class AboutFragment : SecureFragment() { viewModel = ViewModelProvider(this).get(AboutViewModel::class.java) binding.viewModel = viewModel - binding.setBackClickListener { findNavController().popBackStack() } + binding.setBackClickListener { goBack() } binding.setPrivacyPolicyClickListener { val browserIntent = Intent( diff --git a/app/src/main/java/org/linphone/activities/main/chat/fragments/ChatRoomCreationFragment.kt b/app/src/main/java/org/linphone/activities/main/chat/fragments/ChatRoomCreationFragment.kt index 46a526e03..6a90019e8 100644 --- a/app/src/main/java/org/linphone/activities/main/chat/fragments/ChatRoomCreationFragment.kt +++ b/app/src/main/java/org/linphone/activities/main/chat/fragments/ChatRoomCreationFragment.kt @@ -37,6 +37,7 @@ import org.linphone.activities.navigateToGroupInfo import org.linphone.core.tools.Log import org.linphone.databinding.ChatRoomCreationFragmentBinding import org.linphone.utils.AppUtils +import org.linphone.utils.Event import org.linphone.utils.PermissionHelper class ChatRoomCreationFragment : SecureFragment() { @@ -76,7 +77,7 @@ class ChatRoomCreationFragment : SecureFragment binding.contactsList.addItemDecoration(AppUtils.getDividerDecoration(requireContext(), layoutManager)) binding.setBackClickListener { - findNavController().popBackStack() + goBack() } binding.back.visibility = if (resources.getBoolean(R.bool.isTablet)) View.INVISIBLE else View.VISIBLE @@ -146,6 +147,12 @@ class ChatRoomCreationFragment : SecureFragment } } + override fun goBack() { + if (!findNavController().popBackStack()) { + sharedViewModel.closeSlidingPaneEvent.value = Event(true) + } + } + override fun onRequestPermissionsResult( requestCode: Int, permissions: Array, diff --git a/app/src/main/java/org/linphone/activities/main/chat/fragments/DetailChatRoomFragment.kt b/app/src/main/java/org/linphone/activities/main/chat/fragments/DetailChatRoomFragment.kt index 14d433001..1f64e139b 100644 --- a/app/src/main/java/org/linphone/activities/main/chat/fragments/DetailChatRoomFragment.kt +++ b/app/src/main/java/org/linphone/activities/main/chat/fragments/DetailChatRoomFragment.kt @@ -30,7 +30,6 @@ import android.view.MenuInflater import android.view.MenuItem import android.view.MotionEvent import android.view.View -import androidx.activity.addCallback import androidx.appcompat.view.menu.MenuBuilder import androidx.appcompat.view.menu.MenuPopupHelper import androidx.core.content.FileProvider @@ -55,7 +54,6 @@ import org.linphone.activities.main.chat.viewmodels.* import org.linphone.activities.main.fragments.MasterFragment import org.linphone.activities.main.viewmodels.DialogViewModel import org.linphone.activities.main.viewmodels.SharedMainViewModel -import org.linphone.activities.navigateToChatRooms import org.linphone.activities.navigateToContacts import org.linphone.activities.navigateToImageFileViewer import org.linphone.activities.navigateToImdn @@ -94,14 +92,6 @@ class DetailChatRoomFragment : MasterFragment() { binding.viewModel = listViewModel binding.setBackClickListener { - findNavController().popBackStack() + goBack() } } } diff --git a/app/src/main/java/org/linphone/activities/main/chat/fragments/EphemeralFragment.kt b/app/src/main/java/org/linphone/activities/main/chat/fragments/EphemeralFragment.kt index 1b313a844..e4d41059b 100644 --- a/app/src/main/java/org/linphone/activities/main/chat/fragments/EphemeralFragment.kt +++ b/app/src/main/java/org/linphone/activities/main/chat/fragments/EphemeralFragment.kt @@ -64,12 +64,12 @@ class EphemeralFragment : SecureFragment() { binding.viewModel = viewModel binding.setBackClickListener { - findNavController().popBackStack() + goBack() } binding.setValidClickListener { viewModel.updateChatRoomEphemeralDuration() - findNavController().popBackStack() + goBack() } } } diff --git a/app/src/main/java/org/linphone/activities/main/chat/fragments/GroupInfoFragment.kt b/app/src/main/java/org/linphone/activities/main/chat/fragments/GroupInfoFragment.kt index dc9a50180..603d3e375 100644 --- a/app/src/main/java/org/linphone/activities/main/chat/fragments/GroupInfoFragment.kt +++ b/app/src/main/java/org/linphone/activities/main/chat/fragments/GroupInfoFragment.kt @@ -23,7 +23,6 @@ import android.app.Dialog import android.os.Bundle import android.view.View import androidx.lifecycle.ViewModelProvider -import androidx.navigation.fragment.findNavController import androidx.recyclerview.widget.LinearLayoutManager import org.linphone.R import org.linphone.activities.main.MainActivity @@ -107,7 +106,7 @@ class GroupInfoFragment : SecureFragment() { addParticipantsFromSharedViewModel() binding.setBackClickListener { - findNavController().popBackStack() + goBack() } viewModel.createdChatRoomEvent.observe(viewLifecycleOwner, { diff --git a/app/src/main/java/org/linphone/activities/main/chat/fragments/ImdnFragment.kt b/app/src/main/java/org/linphone/activities/main/chat/fragments/ImdnFragment.kt index 5ac773e4a..eedb6a044 100644 --- a/app/src/main/java/org/linphone/activities/main/chat/fragments/ImdnFragment.kt +++ b/app/src/main/java/org/linphone/activities/main/chat/fragments/ImdnFragment.kt @@ -94,7 +94,7 @@ class ImdnFragment : SecureFragment() { binding.participantsList.addItemDecoration(AppUtils.getDividerDecoration(requireContext(), layoutManager)) // Displays state header - val headerItemDecoration = RecyclerViewHeaderDecoration(adapter) + val headerItemDecoration = RecyclerViewHeaderDecoration(requireContext(), adapter) binding.participantsList.addItemDecoration(headerItemDecoration) viewModel.participants.observe(viewLifecycleOwner, { @@ -102,7 +102,7 @@ class ImdnFragment : SecureFragment() { }) binding.setBackClickListener { - findNavController().popBackStack() + goBack() } } } diff --git a/app/src/main/java/org/linphone/activities/main/chat/fragments/MasterChatRoomsFragment.kt b/app/src/main/java/org/linphone/activities/main/chat/fragments/MasterChatRoomsFragment.kt index 7a00b177b..088a803ce 100644 --- a/app/src/main/java/org/linphone/activities/main/chat/fragments/MasterChatRoomsFragment.kt +++ b/app/src/main/java/org/linphone/activities/main/chat/fragments/MasterChatRoomsFragment.kt @@ -23,10 +23,12 @@ import android.app.Dialog import android.os.Bundle import android.view.View import androidx.core.content.ContextCompat +import androidx.core.view.doOnPreDraw import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.ItemTouchHelper import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView +import androidx.slidingpanelayout.widget.SlidingPaneLayout import org.linphone.LinphoneApplication.Companion.coreContext import org.linphone.R import org.linphone.activities.GenericActivity @@ -80,10 +82,45 @@ class MasterChatRoomsFragment : MasterFragment(), S binding.viewModel = viewModel binding.setBackClickListener { - findNavController().popBackStack() + goBack() } binding.setAvatarClickListener { diff --git a/app/src/main/java/org/linphone/activities/main/contact/fragments/DetailContactFragment.kt b/app/src/main/java/org/linphone/activities/main/contact/fragments/DetailContactFragment.kt index 3bc96f5e6..343b75018 100644 --- a/app/src/main/java/org/linphone/activities/main/contact/fragments/DetailContactFragment.kt +++ b/app/src/main/java/org/linphone/activities/main/contact/fragments/DetailContactFragment.kt @@ -40,6 +40,7 @@ import org.linphone.activities.navigateToDialer import org.linphone.core.tools.Log import org.linphone.databinding.ContactDetailFragmentBinding import org.linphone.utils.DialogUtils +import org.linphone.utils.Event class DetailContactFragment : GenericFragment() { private lateinit var viewModel: ContactViewModel @@ -55,6 +56,7 @@ class DetailContactFragment : GenericFragment() { sharedViewModel = requireActivity().run { ViewModelProvider(this).get(SharedMainViewModel::class.java) } + binding.sharedMainViewModel = sharedViewModel val id = arguments?.getString("id") arguments?.clear() @@ -108,9 +110,8 @@ class DetailContactFragment : GenericFragment() { }) binding.setBackClickListener { - findNavController().popBackStack() + goBack() } - binding.back.visibility = if (resources.getBoolean(R.bool.isTablet)) View.INVISIBLE else View.VISIBLE binding.setEditClickListener { navigateToContactEditor() @@ -127,6 +128,10 @@ class DetailContactFragment : GenericFragment() { }) } + override fun goBack() { + sharedViewModel.closeSlidingPaneEvent.value = Event(true) + } + private fun confirmContactRemoval() { val dialogViewModel = DialogViewModel(getString(R.string.contact_delete_one_dialog)) val dialog: Dialog = DialogUtils.getDialog(requireContext(), dialogViewModel) diff --git a/app/src/main/java/org/linphone/activities/main/contact/fragments/MasterContactsFragment.kt b/app/src/main/java/org/linphone/activities/main/contact/fragments/MasterContactsFragment.kt index 56ea20bd9..62d8ea571 100644 --- a/app/src/main/java/org/linphone/activities/main/contact/fragments/MasterContactsFragment.kt +++ b/app/src/main/java/org/linphone/activities/main/contact/fragments/MasterContactsFragment.kt @@ -24,10 +24,12 @@ import android.content.pm.PackageManager import android.os.Bundle import android.view.View import androidx.core.content.ContextCompat +import androidx.core.view.doOnPreDraw import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.ItemTouchHelper import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView +import androidx.slidingpanelayout.widget.SlidingPaneLayout import org.linphone.LinphoneApplication.Companion.coreContext import org.linphone.R import org.linphone.activities.main.MainActivity @@ -68,10 +70,45 @@ class MasterContactsFragment : MasterFragment() { isSecure = arguments?.getBoolean("Secure") ?: false binding.setBackClickListener { - findNavController().popBackStack() + goBack() } binding.setExportClickListener { diff --git a/app/src/main/java/org/linphone/activities/main/files/fragments/AudioViewerFragment.kt b/app/src/main/java/org/linphone/activities/main/files/fragments/AudioViewerFragment.kt index 9c2d6d140..9ddf17bce 100644 --- a/app/src/main/java/org/linphone/activities/main/files/fragments/AudioViewerFragment.kt +++ b/app/src/main/java/org/linphone/activities/main/files/fragments/AudioViewerFragment.kt @@ -69,7 +69,7 @@ class AudioViewerFragment : GenericViewerFragment() { binding.lifecycleOwner = this binding.setBackClickListener { - findNavController().popBackStack() + goBack() } binding.setExportClickListener { diff --git a/app/src/main/java/org/linphone/activities/main/files/fragments/VideoViewerFragment.kt b/app/src/main/java/org/linphone/activities/main/files/fragments/VideoViewerFragment.kt index 9673fe4db..861ee7bfd 100644 --- a/app/src/main/java/org/linphone/activities/main/files/fragments/VideoViewerFragment.kt +++ b/app/src/main/java/org/linphone/activities/main/files/fragments/VideoViewerFragment.kt @@ -61,7 +61,7 @@ class VideoViewerFragment : GenericViewerFragment() { private lateinit var viewModel: CallLogViewModel @@ -51,6 +52,7 @@ class DetailCallLogFragment : GenericFragment() { sharedViewModel = requireActivity().run { ViewModelProvider(this).get(SharedMainViewModel::class.java) } + binding.sharedMainViewModel = sharedViewModel val callLogGroup = sharedViewModel.selectedCallLogGroup.value if (callLogGroup == null) { @@ -69,9 +71,8 @@ class DetailCallLogFragment : GenericFragment() { viewModel.relatedCallLogs.value = callLogGroup.callLogs binding.setBackClickListener { - findNavController().popBackStack() + goBack() } - binding.back.visibility = if (resources.getBoolean(R.bool.isTablet)) View.INVISIBLE else View.VISIBLE binding.setNewContactClickListener { val copy = viewModel.callLog.remoteAddress.clone() @@ -101,7 +102,10 @@ class DetailCallLogFragment : GenericFragment() { val args = Bundle() args.putString("URI", address.asStringUriOnly()) args.putBoolean("Transfer", sharedViewModel.pendingCallTransfer) - args.putBoolean("SkipAutoCallStart", true) // If auto start call setting is enabled, ignore it + args.putBoolean( + "SkipAutoCallStart", + true + ) // If auto start call setting is enabled, ignore it navigateToDialer(args) } else { val localAddress = callLog.localAddress @@ -125,4 +129,8 @@ class DetailCallLogFragment : GenericFragment() { } }) } + + override fun goBack() { + sharedViewModel.closeSlidingPaneEvent.value = Event(true) + } } diff --git a/app/src/main/java/org/linphone/activities/main/history/fragments/MasterCallLogsFragment.kt b/app/src/main/java/org/linphone/activities/main/history/fragments/MasterCallLogsFragment.kt index 5496dca1b..546006c71 100644 --- a/app/src/main/java/org/linphone/activities/main/history/fragments/MasterCallLogsFragment.kt +++ b/app/src/main/java/org/linphone/activities/main/history/fragments/MasterCallLogsFragment.kt @@ -23,10 +23,12 @@ import android.app.Dialog import android.os.Bundle import android.view.View import androidx.core.content.ContextCompat +import androidx.core.view.doOnPreDraw import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.ItemTouchHelper import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView +import androidx.slidingpanelayout.widget.SlidingPaneLayout import org.linphone.LinphoneApplication.Companion.coreContext import org.linphone.R import org.linphone.activities.main.fragments.MasterFragment @@ -71,10 +73,45 @@ class MasterCallLogsFragment : MasterFragment @@ -157,6 +194,7 @@ class MasterCallLogsFragment : MasterFragment sharedViewModel.selectedCallLogGroup.value = callLog + binding.slidingPane.openPane() navigateToCallHistory() } }) diff --git a/app/src/main/java/org/linphone/activities/main/recordings/fragments/RecordingsFragment.kt b/app/src/main/java/org/linphone/activities/main/recordings/fragments/RecordingsFragment.kt index 2e31f2791..eb972cac8 100644 --- a/app/src/main/java/org/linphone/activities/main/recordings/fragments/RecordingsFragment.kt +++ b/app/src/main/java/org/linphone/activities/main/recordings/fragments/RecordingsFragment.kt @@ -23,7 +23,6 @@ import android.os.Bundle import android.view.MotionEvent import android.view.View import androidx.lifecycle.ViewModelProvider -import androidx.navigation.fragment.findNavController import androidx.recyclerview.widget.LinearLayoutManager import org.linphone.R import org.linphone.activities.main.fragments.MasterFragment @@ -66,14 +65,14 @@ class RecordingsFragment : MasterFragment adapter.submitList(recordings) }) - binding.setBackClickListener { findNavController().popBackStack() } + binding.setBackClickListener { goBack() } binding.setEditClickListener { listSelectionViewModel.isEditionEnabled.value = true } diff --git a/app/src/main/java/org/linphone/activities/main/settings/fragments/AccountSettingsFragment.kt b/app/src/main/java/org/linphone/activities/main/settings/fragments/AccountSettingsFragment.kt index 36e002fa0..19396a88b 100644 --- a/app/src/main/java/org/linphone/activities/main/settings/fragments/AccountSettingsFragment.kt +++ b/app/src/main/java/org/linphone/activities/main/settings/fragments/AccountSettingsFragment.kt @@ -31,6 +31,7 @@ import org.linphone.activities.main.viewmodels.SharedMainViewModel import org.linphone.activities.navigateToPhoneLinking import org.linphone.core.tools.Log import org.linphone.databinding.SettingsAccountFragmentBinding +import org.linphone.utils.Event class AccountSettingsFragment : GenericFragment() { private lateinit var sharedViewModel: SharedMainViewModel @@ -46,6 +47,7 @@ class AccountSettingsFragment : GenericFragment( sharedViewModel = requireActivity().run { ViewModelProvider(this).get(SharedMainViewModel::class.java) } + binding.sharedMainViewModel = sharedViewModel val identity = arguments?.getString("Identity") if (identity == null) { @@ -58,8 +60,7 @@ class AccountSettingsFragment : GenericFragment( viewModel = ViewModelProvider(this, AccountSettingsViewModelFactory(identity)).get(AccountSettingsViewModel::class.java) binding.viewModel = viewModel - binding.setBackClickListener { findNavController().popBackStack() } - binding.back.visibility = if (resources.getBoolean(R.bool.isTablet)) View.INVISIBLE else View.VISIBLE + binding.setBackClickListener { goBack() } viewModel.linkPhoneNumberEvent.observe(viewLifecycleOwner, { it.consume { @@ -83,4 +84,8 @@ class AccountSettingsFragment : GenericFragment( } }) } + + override fun goBack() { + sharedViewModel.closeSlidingPaneEvent.value = Event(true) + } } diff --git a/app/src/main/java/org/linphone/activities/main/settings/fragments/AdvancedSettingsFragment.kt b/app/src/main/java/org/linphone/activities/main/settings/fragments/AdvancedSettingsFragment.kt index 9f2d79965..a85c15f60 100644 --- a/app/src/main/java/org/linphone/activities/main/settings/fragments/AdvancedSettingsFragment.kt +++ b/app/src/main/java/org/linphone/activities/main/settings/fragments/AdvancedSettingsFragment.kt @@ -27,18 +27,20 @@ import android.view.View import androidx.appcompat.app.AppCompatDelegate import androidx.core.content.ContextCompat import androidx.lifecycle.ViewModelProvider -import androidx.navigation.fragment.findNavController import org.linphone.R import org.linphone.activities.GenericFragment import org.linphone.activities.main.MainActivity import org.linphone.activities.main.settings.viewmodels.AdvancedSettingsViewModel +import org.linphone.activities.main.viewmodels.SharedMainViewModel import org.linphone.core.tools.Log import org.linphone.core.tools.compatibility.DeviceUtils import org.linphone.databinding.SettingsAdvancedFragmentBinding import org.linphone.utils.AppUtils +import org.linphone.utils.Event import org.linphone.utils.PowerManagerUtils class AdvancedSettingsFragment : GenericFragment() { + private lateinit var sharedViewModel: SharedMainViewModel private lateinit var viewModel: AdvancedSettingsViewModel override fun getLayoutId(): Int = R.layout.settings_advanced_fragment @@ -48,11 +50,15 @@ class AdvancedSettingsFragment : GenericFragment @@ -126,4 +132,8 @@ class AdvancedSettingsFragment : GenericFragment() { + private lateinit var sharedViewModel: SharedMainViewModel private lateinit var viewModel: AudioSettingsViewModel override fun getLayoutId(): Int = R.layout.settings_audio_fragment @@ -47,11 +49,15 @@ class AudioSettingsFragment : GenericFragment() { binding.lifecycleOwner = this + sharedViewModel = requireActivity().run { + ViewModelProvider(this).get(SharedMainViewModel::class.java) + } + binding.sharedMainViewModel = sharedViewModel + viewModel = ViewModelProvider(this).get(AudioSettingsViewModel::class.java) binding.viewModel = viewModel - binding.setBackClickListener { findNavController().popBackStack() } - binding.back.visibility = if (resources.getBoolean(R.bool.isTablet)) View.INVISIBLE else View.VISIBLE + binding.setBackClickListener { goBack() } viewModel.askAudioRecordPermissionForEchoCancellerCalibrationEvent.observe(viewLifecycleOwner, { it.consume { @@ -110,4 +116,8 @@ class AudioSettingsFragment : GenericFragment() { } viewModel.audioCodecs.value = list } + + override fun goBack() { + sharedViewModel.closeSlidingPaneEvent.value = Event(true) + } } diff --git a/app/src/main/java/org/linphone/activities/main/settings/fragments/CallSettingsFragment.kt b/app/src/main/java/org/linphone/activities/main/settings/fragments/CallSettingsFragment.kt index 08e6a751e..8ddab9f76 100644 --- a/app/src/main/java/org/linphone/activities/main/settings/fragments/CallSettingsFragment.kt +++ b/app/src/main/java/org/linphone/activities/main/settings/fragments/CallSettingsFragment.kt @@ -26,15 +26,17 @@ import android.os.Bundle import android.provider.Settings import android.view.View import androidx.lifecycle.ViewModelProvider -import androidx.navigation.fragment.findNavController import org.linphone.R import org.linphone.activities.GenericFragment import org.linphone.activities.main.settings.viewmodels.CallSettingsViewModel +import org.linphone.activities.main.viewmodels.SharedMainViewModel import org.linphone.compatibility.Compatibility import org.linphone.databinding.SettingsCallFragmentBinding import org.linphone.mediastream.Version +import org.linphone.utils.Event class CallSettingsFragment : GenericFragment() { + private lateinit var sharedViewModel: SharedMainViewModel private lateinit var viewModel: CallSettingsViewModel override fun getLayoutId(): Int = R.layout.settings_call_fragment @@ -44,11 +46,15 @@ class CallSettingsFragment : GenericFragment() { binding.lifecycleOwner = this + sharedViewModel = requireActivity().run { + ViewModelProvider(this).get(SharedMainViewModel::class.java) + } + binding.sharedMainViewModel = sharedViewModel + viewModel = ViewModelProvider(this).get(CallSettingsViewModel::class.java) binding.viewModel = viewModel - binding.setBackClickListener { findNavController().popBackStack() } - binding.back.visibility = if (resources.getBoolean(R.bool.isTablet)) View.INVISIBLE else View.VISIBLE + binding.setBackClickListener { goBack() } viewModel.systemWideOverlayEnabledEvent.observe(viewLifecycleOwner, { it.consume { @@ -84,4 +90,8 @@ class CallSettingsFragment : GenericFragment() { viewModel.systemWideOverlayListener.onBoolValueChanged(false) } } + + override fun goBack() { + sharedViewModel.closeSlidingPaneEvent.value = Event(true) + } } diff --git a/app/src/main/java/org/linphone/activities/main/settings/fragments/ChatSettingsFragment.kt b/app/src/main/java/org/linphone/activities/main/settings/fragments/ChatSettingsFragment.kt index 597616b6e..7d7fb4602 100644 --- a/app/src/main/java/org/linphone/activities/main/settings/fragments/ChatSettingsFragment.kt +++ b/app/src/main/java/org/linphone/activities/main/settings/fragments/ChatSettingsFragment.kt @@ -25,15 +25,17 @@ import android.os.Bundle import android.provider.Settings import android.view.View import androidx.lifecycle.ViewModelProvider -import androidx.navigation.fragment.findNavController import org.linphone.R import org.linphone.activities.GenericFragment import org.linphone.activities.main.settings.viewmodels.ChatSettingsViewModel +import org.linphone.activities.main.viewmodels.SharedMainViewModel import org.linphone.compatibility.Compatibility import org.linphone.databinding.SettingsChatFragmentBinding import org.linphone.mediastream.Version +import org.linphone.utils.Event class ChatSettingsFragment : GenericFragment() { + private lateinit var sharedViewModel: SharedMainViewModel private lateinit var viewModel: ChatSettingsViewModel override fun getLayoutId(): Int = R.layout.settings_chat_fragment @@ -43,11 +45,15 @@ class ChatSettingsFragment : GenericFragment() { binding.lifecycleOwner = this + sharedViewModel = requireActivity().run { + ViewModelProvider(this).get(SharedMainViewModel::class.java) + } + binding.sharedMainViewModel = sharedViewModel + viewModel = ViewModelProvider(this).get(ChatSettingsViewModel::class.java) binding.viewModel = viewModel - binding.setBackClickListener { findNavController().popBackStack() } - binding.back.visibility = if (resources.getBoolean(R.bool.isTablet)) View.INVISIBLE else View.VISIBLE + binding.setBackClickListener { goBack() } viewModel.launcherShortcutsEvent.observe(viewLifecycleOwner, { it.consume { newValue -> @@ -76,4 +82,8 @@ class ChatSettingsFragment : GenericFragment() { } } }) } + + override fun goBack() { + sharedViewModel.closeSlidingPaneEvent.value = Event(true) + } } diff --git a/app/src/main/java/org/linphone/activities/main/settings/fragments/ContactsSettingsFragment.kt b/app/src/main/java/org/linphone/activities/main/settings/fragments/ContactsSettingsFragment.kt index 9b4685ba2..99f3ea538 100644 --- a/app/src/main/java/org/linphone/activities/main/settings/fragments/ContactsSettingsFragment.kt +++ b/app/src/main/java/org/linphone/activities/main/settings/fragments/ContactsSettingsFragment.kt @@ -23,18 +23,20 @@ import android.content.pm.PackageManager import android.os.Bundle import android.view.View import androidx.lifecycle.ViewModelProvider -import androidx.navigation.fragment.findNavController import org.linphone.LinphoneApplication.Companion.coreContext import org.linphone.LinphoneApplication.Companion.corePreferences import org.linphone.R import org.linphone.activities.GenericFragment import org.linphone.activities.main.settings.viewmodels.ContactsSettingsViewModel +import org.linphone.activities.main.viewmodels.SharedMainViewModel import org.linphone.compatibility.Compatibility import org.linphone.core.tools.Log import org.linphone.databinding.SettingsContactsFragmentBinding +import org.linphone.utils.Event import org.linphone.utils.PermissionHelper class ContactsSettingsFragment : GenericFragment() { + private lateinit var sharedViewModel: SharedMainViewModel private lateinit var viewModel: ContactsSettingsViewModel override fun getLayoutId(): Int = R.layout.settings_contacts_fragment @@ -44,11 +46,15 @@ class ContactsSettingsFragment : GenericFragment @@ -105,4 +111,8 @@ class ContactsSettingsFragment : GenericFragment() { + private lateinit var sharedViewModel: SharedMainViewModel private lateinit var viewModel: NetworkSettingsViewModel override fun getLayoutId(): Int = R.layout.settings_network_fragment @@ -38,10 +40,18 @@ class NetworkSettingsFragment : GenericFragment( binding.lifecycleOwner = this + sharedViewModel = requireActivity().run { + ViewModelProvider(this).get(SharedMainViewModel::class.java) + } + binding.sharedMainViewModel = sharedViewModel + viewModel = ViewModelProvider(this).get(NetworkSettingsViewModel::class.java) binding.viewModel = viewModel - binding.setBackClickListener { findNavController().popBackStack() } - binding.back.visibility = if (resources.getBoolean(R.bool.isTablet)) View.INVISIBLE else View.VISIBLE + binding.setBackClickListener { goBack() } + } + + override fun goBack() { + sharedViewModel.closeSlidingPaneEvent.value = Event(true) } } diff --git a/app/src/main/java/org/linphone/activities/main/settings/fragments/SettingsFragment.kt b/app/src/main/java/org/linphone/activities/main/settings/fragments/SettingsFragment.kt index 139bddbed..0c031abcb 100644 --- a/app/src/main/java/org/linphone/activities/main/settings/fragments/SettingsFragment.kt +++ b/app/src/main/java/org/linphone/activities/main/settings/fragments/SettingsFragment.kt @@ -21,8 +21,9 @@ package org.linphone.activities.main.settings.fragments import android.os.Bundle import android.view.View +import androidx.core.view.doOnPreDraw import androidx.lifecycle.ViewModelProvider -import androidx.navigation.fragment.findNavController +import androidx.slidingpanelayout.widget.SlidingPaneLayout import org.linphone.R import org.linphone.activities.* import org.linphone.activities.main.fragments.SecureFragment @@ -47,14 +48,34 @@ class SettingsFragment : SecureFragment() { binding.lifecycleOwner = this + /* Shared view model & sliding pane related */ + sharedViewModel = requireActivity().run { ViewModelProvider(this).get(SharedMainViewModel::class.java) } + view.doOnPreDraw { sharedViewModel.canSlidingPaneBeClosed.value = binding.slidingPane.isSlideable } + + sharedViewModel.closeSlidingPaneEvent.observe(viewLifecycleOwner, { + it.consume { + if (!binding.slidingPane.closePane()) { + goBack() + } + } + }) + sharedViewModel.layoutChangedEvent.observe(viewLifecycleOwner, { + it.consume { + sharedViewModel.canSlidingPaneBeClosed.value = binding.slidingPane.isSlideable + } + }) + binding.slidingPane.lockMode = SlidingPaneLayout.LOCK_MODE_LOCKED + + /* End of hared view model & sliding pane related */ + viewModel = ViewModelProvider(this).get(SettingsViewModel::class.java) binding.viewModel = viewModel - binding.setBackClickListener { findNavController().popBackStack() } + binding.setBackClickListener { goBack() } sharedViewModel.accountRemoved.observe(viewLifecycleOwner, { Log.i("[Settings] Account removed, update accounts list") @@ -65,60 +86,70 @@ class SettingsFragment : SecureFragment() { if (identity != null) { Log.i("[Settings] Found identity parameter in arguments: $identity") arguments?.clear() + binding.slidingPane.openPane() navigateToAccountSettings(identity) } viewModel.accountsSettingsListener = object : SettingListenerStub() { override fun onAccountClicked(identity: String) { Log.i("[Settings] Navigation to settings for account with identity: $identity") + binding.slidingPane.openPane() navigateToAccountSettings(identity) } } viewModel.tunnelSettingsListener = object : SettingListenerStub() { override fun onClicked() { + binding.slidingPane.openPane() navigateToTunnelSettings() } } viewModel.audioSettingsListener = object : SettingListenerStub() { override fun onClicked() { + binding.slidingPane.openPane() navigateToAudioSettings() } } viewModel.videoSettingsListener = object : SettingListenerStub() { override fun onClicked() { + binding.slidingPane.openPane() navigateToVideoSettings() } } viewModel.callSettingsListener = object : SettingListenerStub() { override fun onClicked() { + binding.slidingPane.openPane() navigateToCallSettings() } } viewModel.chatSettingsListener = object : SettingListenerStub() { override fun onClicked() { + binding.slidingPane.openPane() navigateToChatSettings() } } viewModel.networkSettingsListener = object : SettingListenerStub() { override fun onClicked() { + binding.slidingPane.openPane() navigateToNetworkSettings() } } viewModel.contactsSettingsListener = object : SettingListenerStub() { override fun onClicked() { + binding.slidingPane.openPane() navigateToContactsSettings() } } viewModel.advancedSettingsListener = object : SettingListenerStub() { override fun onClicked() { + binding.slidingPane.openPane() navigateToAdvancedSettings() } } diff --git a/app/src/main/java/org/linphone/activities/main/settings/fragments/TunnelSettingsFragment.kt b/app/src/main/java/org/linphone/activities/main/settings/fragments/TunnelSettingsFragment.kt index 84a7b2814..24dab5c38 100644 --- a/app/src/main/java/org/linphone/activities/main/settings/fragments/TunnelSettingsFragment.kt +++ b/app/src/main/java/org/linphone/activities/main/settings/fragments/TunnelSettingsFragment.kt @@ -22,13 +22,15 @@ package org.linphone.activities.main.settings.fragments import android.os.Bundle import android.view.View import androidx.lifecycle.ViewModelProvider -import androidx.navigation.fragment.findNavController import org.linphone.R import org.linphone.activities.GenericFragment import org.linphone.activities.main.settings.viewmodels.TunnelSettingsViewModel +import org.linphone.activities.main.viewmodels.SharedMainViewModel import org.linphone.databinding.SettingsTunnelFragmentBinding +import org.linphone.utils.Event class TunnelSettingsFragment : GenericFragment() { + private lateinit var sharedViewModel: SharedMainViewModel private lateinit var viewModel: TunnelSettingsViewModel override fun getLayoutId(): Int = R.layout.settings_tunnel_fragment @@ -38,10 +40,18 @@ class TunnelSettingsFragment : GenericFragment() binding.lifecycleOwner = this + sharedViewModel = requireActivity().run { + ViewModelProvider(this).get(SharedMainViewModel::class.java) + } + binding.sharedMainViewModel = sharedViewModel + viewModel = ViewModelProvider(this).get(TunnelSettingsViewModel::class.java) binding.viewModel = viewModel - binding.setBackClickListener { findNavController().popBackStack() } - binding.back.visibility = if (resources.getBoolean(R.bool.isTablet)) View.INVISIBLE else View.VISIBLE + binding.setBackClickListener { goBack() } + } + + override fun goBack() { + sharedViewModel.closeSlidingPaneEvent.value = Event(true) } } diff --git a/app/src/main/java/org/linphone/activities/main/settings/fragments/VideoSettingsFragment.kt b/app/src/main/java/org/linphone/activities/main/settings/fragments/VideoSettingsFragment.kt index b12a8070b..102963770 100644 --- a/app/src/main/java/org/linphone/activities/main/settings/fragments/VideoSettingsFragment.kt +++ b/app/src/main/java/org/linphone/activities/main/settings/fragments/VideoSettingsFragment.kt @@ -26,18 +26,20 @@ import android.view.View import androidx.databinding.DataBindingUtil import androidx.databinding.ViewDataBinding import androidx.lifecycle.ViewModelProvider -import androidx.navigation.fragment.findNavController import org.linphone.BR import org.linphone.LinphoneApplication.Companion.coreContext import org.linphone.R import org.linphone.activities.GenericFragment import org.linphone.activities.main.settings.SettingListenerStub import org.linphone.activities.main.settings.viewmodels.VideoSettingsViewModel +import org.linphone.activities.main.viewmodels.SharedMainViewModel import org.linphone.core.tools.Log import org.linphone.databinding.SettingsVideoFragmentBinding +import org.linphone.utils.Event import org.linphone.utils.PermissionHelper class VideoSettingsFragment : GenericFragment() { + private lateinit var sharedViewModel: SharedMainViewModel private lateinit var viewModel: VideoSettingsViewModel override fun getLayoutId(): Int = R.layout.settings_video_fragment @@ -47,11 +49,15 @@ class VideoSettingsFragment : GenericFragment() { binding.lifecycleOwner = this + sharedViewModel = requireActivity().run { + ViewModelProvider(this).get(SharedMainViewModel::class.java) + } + binding.sharedMainViewModel = sharedViewModel + viewModel = ViewModelProvider(this).get(VideoSettingsViewModel::class.java) binding.viewModel = viewModel - binding.setBackClickListener { findNavController().popBackStack() } - binding.back.visibility = if (resources.getBoolean(R.bool.isTablet)) View.INVISIBLE else View.VISIBLE + binding.setBackClickListener { goBack() } initVideoCodecsList() @@ -100,4 +106,8 @@ class VideoSettingsFragment : GenericFragment() { } viewModel.videoCodecs.value = list } + + override fun goBack() { + sharedViewModel.closeSlidingPaneEvent.value = Event(true) + } } diff --git a/app/src/main/java/org/linphone/activities/main/viewmodels/SharedMainViewModel.kt b/app/src/main/java/org/linphone/activities/main/viewmodels/SharedMainViewModel.kt index e68162ca4..b30a8042b 100644 --- a/app/src/main/java/org/linphone/activities/main/viewmodels/SharedMainViewModel.kt +++ b/app/src/main/java/org/linphone/activities/main/viewmodels/SharedMainViewModel.kt @@ -29,6 +29,10 @@ import org.linphone.utils.Event class SharedMainViewModel : ViewModel() { val toggleDrawerEvent = MutableLiveData>() + val layoutChangedEvent = MutableLiveData>() + var canSlidingPaneBeClosed = MutableLiveData() + val closeSlidingPaneEvent = MutableLiveData>() + /* Call history */ val selectedCallLogGroup = MutableLiveData() diff --git a/app/src/main/java/org/linphone/utils/RecyclerViewHeaderDecoration.kt b/app/src/main/java/org/linphone/utils/RecyclerViewHeaderDecoration.kt index 7e2b3b47a..a4f682376 100644 --- a/app/src/main/java/org/linphone/utils/RecyclerViewHeaderDecoration.kt +++ b/app/src/main/java/org/linphone/utils/RecyclerViewHeaderDecoration.kt @@ -26,9 +26,8 @@ import android.util.SparseArray import android.view.View import android.view.ViewGroup import androidx.recyclerview.widget.RecyclerView -import org.linphone.R -class RecyclerViewHeaderDecoration(private val adapter: HeaderAdapter) : RecyclerView.ItemDecoration() { +class RecyclerViewHeaderDecoration(private val context: Context, private val adapter: HeaderAdapter) : RecyclerView.ItemDecoration() { private val headers: SparseArray = SparseArray() override fun getItemOffsets( @@ -54,10 +53,8 @@ class RecyclerViewHeaderDecoration(private val adapter: HeaderAdapter) : Recycle view.layoutParams = ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT) } - val displayMetrics = parent.context.resources.displayMetrics - val width = if (view.resources.getBoolean(R.bool.isTablet)) displayMetrics.widthPixels / 2 else displayMetrics.widthPixels - val widthSpec = View.MeasureSpec.makeMeasureSpec(width, View.MeasureSpec.EXACTLY) - val heightSpec = View.MeasureSpec.makeMeasureSpec(displayMetrics.heightPixels, View.MeasureSpec.EXACTLY) + val widthSpec = View.MeasureSpec.makeMeasureSpec(parent.width, View.MeasureSpec.EXACTLY) + val heightSpec = View.MeasureSpec.makeMeasureSpec(parent.height, View.MeasureSpec.EXACTLY) val childWidth = ViewGroup.getChildMeasureSpec(widthSpec, parent.paddingLeft + parent.paddingRight, view.layoutParams.width) val childHeight = ViewGroup.getChildMeasureSpec(heightSpec, parent.paddingTop + parent.paddingBottom, view.layoutParams.height) @@ -71,7 +68,7 @@ class RecyclerViewHeaderDecoration(private val adapter: HeaderAdapter) : Recycle val position = parent.getChildAdapterPosition(child) if (position != RecyclerView.NO_POSITION && adapter.displayHeaderForPosition(position)) { canvas.save() - val headerView: View = headers.get(position) ?: adapter.getHeaderViewForPosition(parent.context, position) + val headerView: View = headers.get(position) ?: adapter.getHeaderViewForPosition(context, position) canvas.translate(0f, child.y - headerView.height) headerView.draw(canvas) canvas.restore() diff --git a/app/src/main/res/drawable-xhdpi/chat_group_new_default.png b/app/src/main/res/drawable-xhdpi/chat_group_new_default.png index 50d061eed..7fbb9ae8f 100644 Binary files a/app/src/main/res/drawable-xhdpi/chat_group_new_default.png and b/app/src/main/res/drawable-xhdpi/chat_group_new_default.png differ diff --git a/app/src/main/res/drawable-xhdpi/chat_new_default.png b/app/src/main/res/drawable-xhdpi/chat_new_default.png index 2c2f41889..7d94f9738 100644 Binary files a/app/src/main/res/drawable-xhdpi/chat_new_default.png and b/app/src/main/res/drawable-xhdpi/chat_new_default.png differ diff --git a/app/src/main/res/layout-land/history_detail_fragment.xml b/app/src/main/res/layout-land/history_detail_fragment.xml deleted file mode 100644 index 12546a67f..000000000 --- a/app/src/main/res/layout-land/history_detail_fragment.xml +++ /dev/null @@ -1,210 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/layout-sw533dp-land/history_detail_fragment.xml b/app/src/main/res/layout-sw533dp-land/history_detail_fragment.xml deleted file mode 100644 index d92e5400f..000000000 --- a/app/src/main/res/layout-sw533dp-land/history_detail_fragment.xml +++ /dev/null @@ -1,192 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/layout-sw533dp-land/settings_fragment.xml b/app/src/main/res/layout-sw533dp-land/settings_fragment.xml deleted file mode 100644 index 30c78816c..000000000 --- a/app/src/main/res/layout-sw533dp-land/settings_fragment.xml +++ /dev/null @@ -1,209 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout-sw533dp/chat_room_master_fragment.xml b/app/src/main/res/layout-sw533dp/chat_room_master_fragment.xml deleted file mode 100644 index 72fb86946..000000000 --- a/app/src/main/res/layout-sw533dp/chat_room_master_fragment.xml +++ /dev/null @@ -1,175 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/layout-sw533dp/contact_master_fragment.xml b/app/src/main/res/layout-sw533dp/contact_master_fragment.xml deleted file mode 100644 index 8b36fd95b..000000000 --- a/app/src/main/res/layout-sw533dp/contact_master_fragment.xml +++ /dev/null @@ -1,202 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/layout-sw533dp/history_master_fragment.xml b/app/src/main/res/layout-sw533dp/history_master_fragment.xml deleted file mode 100644 index 1667df406..000000000 --- a/app/src/main/res/layout-sw533dp/history_master_fragment.xml +++ /dev/null @@ -1,165 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/layout-sw533dp/settings_fragment.xml b/app/src/main/res/layout-sw533dp/settings_fragment.xml deleted file mode 100644 index 30c78816c..000000000 --- a/app/src/main/res/layout-sw533dp/settings_fragment.xml +++ /dev/null @@ -1,209 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/chat_room_detail_fragment.xml b/app/src/main/res/layout/chat_room_detail_fragment.xml index f13d6ed1f..c40af9770 100644 --- a/app/src/main/res/layout/chat_room_detail_fragment.xml +++ b/app/src/main/res/layout/chat_room_detail_fragment.xml @@ -32,6 +32,9 @@ + + android:paddingLeft="15dp"> + xmlns:tools="http://schemas.android.com/tools" + xmlns:app="http://schemas.android.com/apk/res-auto"> @@ -24,9 +25,16 @@ type="org.linphone.activities.main.chat.viewmodels.ChatRoomsListViewModel" /> - + android:layout_height="match_parent" + tools:context=".MainActivity"> + + + + + + + + diff --git a/app/src/main/res/layout/contact_detail_fragment.xml b/app/src/main/res/layout/contact_detail_fragment.xml index 1bcfe850b..0e26c8c39 100644 --- a/app/src/main/res/layout/contact_detail_fragment.xml +++ b/app/src/main/res/layout/contact_detail_fragment.xml @@ -17,6 +17,9 @@ + + xmlns:tools="http://schemas.android.com/tools" + xmlns:app="http://schemas.android.com/apk/res-auto"> @@ -21,147 +22,178 @@ type="org.linphone.activities.main.contact.viewmodels.ContactsListViewModel" /> - + android:layout_height="match_parent" + tools:context=".MainActivity"> - + - + - + android:layout_weight="0.2"> + + + + + + + + + + + + + + - - - - + android:layout_width="0dp" + android:layout_height="match_parent" + android:layout_weight="0.2" /> + + + + + + + + + + + + + + + + + android:text="@string/no_sip_contact" + android:visibility="@{viewModel.sipContactsSelected && viewModel.contactsList.empty ? View.VISIBLE : View.GONE}" /> - + android:layout_height="wrap_content" + android:layout_centerVertical="true" + android:gravity="center" + android:text="@string/no_contact" + android:visibility="@{!viewModel.sipContactsSelected && viewModel.contactsList.empty ? View.VISIBLE : View.GONE}" /> + android:layout_alignParentRight="true" + android:background="?attr/dividerColor" /> - - - - - + + android:id="@+id/contacts_nav_container" + android:name="androidx.navigation.fragment.NavHostFragment" + android:layout_width="300dp" + android:layout_height="match_parent" + android:layout_weight="1" + app:defaultNavHost="false" + app:navGraph="@navigation/contacts_nav_graph"/> - - - - - - - - - - - + diff --git a/app/src/main/res/layout/history_detail_fragment.xml b/app/src/main/res/layout/history_detail_fragment.xml index d92e5400f..106672939 100644 --- a/app/src/main/res/layout/history_detail_fragment.xml +++ b/app/src/main/res/layout/history_detail_fragment.xml @@ -17,6 +17,9 @@ + + xmlns:tools="http://schemas.android.com/tools" + xmlns:app="http://schemas.android.com/apk/res-auto"> @@ -18,114 +19,138 @@ type="org.linphone.activities.main.history.viewmodels.CallLogsListViewModel" /> - + android:layout_height="match_parent" + tools:context=".MainActivity"> - + - + - + android:layout_weight="0.2"> + + + + + + + + + + + + + + - - - - + android:layout_width="0dp" + android:layout_height="match_parent" + android:layout_weight="0.4" /> + android:src="@drawable/delete" /> - + - + + + + + + + + android:layout_alignParentRight="true" + android:background="?attr/dividerColor" /> - - - + + android:id="@+id/history_nav_container" + android:name="androidx.navigation.fragment.NavHostFragment" + android:layout_width="300dp" + android:layout_height="match_parent" + android:layout_weight="1" + app:defaultNavHost="false" + app:navGraph="@navigation/history_nav_graph"/> - - - - - - - + diff --git a/app/src/main/res/layout/settings_account_fragment.xml b/app/src/main/res/layout/settings_account_fragment.xml index de9dc871d..f2dfba0b6 100644 --- a/app/src/main/res/layout/settings_account_fragment.xml +++ b/app/src/main/res/layout/settings_account_fragment.xml @@ -12,6 +12,9 @@ + + android:visibility="@{sharedMainViewModel.canSlidingPaneBeClosed ? View.INVISIBLE : View.GONE}" /> diff --git a/app/src/main/res/layout/settings_advanced_fragment.xml b/app/src/main/res/layout/settings_advanced_fragment.xml index 20166266f..1f6571f1a 100644 --- a/app/src/main/res/layout/settings_advanced_fragment.xml +++ b/app/src/main/res/layout/settings_advanced_fragment.xml @@ -11,6 +11,9 @@ + + android:visibility="@{sharedMainViewModel.canSlidingPaneBeClosed ? View.INVISIBLE : View.GONE}" /> diff --git a/app/src/main/res/layout/settings_audio_fragment.xml b/app/src/main/res/layout/settings_audio_fragment.xml index b90c07f0c..30c9214fb 100644 --- a/app/src/main/res/layout/settings_audio_fragment.xml +++ b/app/src/main/res/layout/settings_audio_fragment.xml @@ -11,6 +11,9 @@ + + android:visibility="@{sharedMainViewModel.canSlidingPaneBeClosed ? View.INVISIBLE : View.GONE}" /> diff --git a/app/src/main/res/layout/settings_call_fragment.xml b/app/src/main/res/layout/settings_call_fragment.xml index 9dcee1ab6..b6878790c 100644 --- a/app/src/main/res/layout/settings_call_fragment.xml +++ b/app/src/main/res/layout/settings_call_fragment.xml @@ -11,6 +11,9 @@ + + android:visibility="@{sharedMainViewModel.canSlidingPaneBeClosed ? View.INVISIBLE : View.GONE}" /> diff --git a/app/src/main/res/layout/settings_chat_fragment.xml b/app/src/main/res/layout/settings_chat_fragment.xml index 6bb583f7e..7c9e8dc29 100644 --- a/app/src/main/res/layout/settings_chat_fragment.xml +++ b/app/src/main/res/layout/settings_chat_fragment.xml @@ -11,6 +11,9 @@ + + android:visibility="@{sharedMainViewModel.canSlidingPaneBeClosed ? View.INVISIBLE : View.GONE}" /> diff --git a/app/src/main/res/layout/settings_contacts_fragment.xml b/app/src/main/res/layout/settings_contacts_fragment.xml index 9da63cbe3..f7a191527 100644 --- a/app/src/main/res/layout/settings_contacts_fragment.xml +++ b/app/src/main/res/layout/settings_contacts_fragment.xml @@ -10,6 +10,9 @@ + + android:visibility="@{sharedMainViewModel.canSlidingPaneBeClosed ? View.INVISIBLE : View.GONE}" /> diff --git a/app/src/main/res/layout/settings_fragment.xml b/app/src/main/res/layout/settings_fragment.xml index 472febcc8..7f2bd98a7 100644 --- a/app/src/main/res/layout/settings_fragment.xml +++ b/app/src/main/res/layout/settings_fragment.xml @@ -1,6 +1,7 @@ + xmlns:linphone="http://schemas.android.com/apk/res-auto" + xmlns:tools="http://schemas.android.com/tools"> @@ -13,170 +14,194 @@ type="org.linphone.activities.main.settings.viewmodels.SettingsViewModel" /> - + android:layout_height="match_parent" + tools:context=".MainActivity"> - - - - - - - - - - - + + android:layout_height="@dimen/main_activity_top_bar_size" + android:layout_gravity="center_horizontal" + android:background="?attr/lightToolbarBackgroundColor" + android:orientation="horizontal"> + + + style="@style/accent_colored_title_font" + android:layout_width="0dp" + android:layout_height="match_parent" + android:layout_weight="0.6" + android:gravity="center" + android:singleLine="true" + android:ellipsize="end" + android:padding="15dp" + android:text="@string/settings"/> - + - + - + + android:paddingTop="5dp" + android:paddingBottom="5dp" + android:orientation="vertical"> - + - + - + - + - + - + - + - + - + - + - + - + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/settings_network_fragment.xml b/app/src/main/res/layout/settings_network_fragment.xml index 164554c02..067f4ceb3 100644 --- a/app/src/main/res/layout/settings_network_fragment.xml +++ b/app/src/main/res/layout/settings_network_fragment.xml @@ -11,6 +11,9 @@ + + android:visibility="@{sharedMainViewModel.canSlidingPaneBeClosed ? View.INVISIBLE : View.GONE}" /> diff --git a/app/src/main/res/layout/settings_tunnel_fragment.xml b/app/src/main/res/layout/settings_tunnel_fragment.xml index 35b84bc97..e6eac5db5 100644 --- a/app/src/main/res/layout/settings_tunnel_fragment.xml +++ b/app/src/main/res/layout/settings_tunnel_fragment.xml @@ -11,6 +11,9 @@ + + android:visibility="@{sharedMainViewModel.canSlidingPaneBeClosed ? View.INVISIBLE : View.GONE}" /> diff --git a/app/src/main/res/layout/settings_video_fragment.xml b/app/src/main/res/layout/settings_video_fragment.xml index e1d08a581..c50870e2d 100644 --- a/app/src/main/res/layout/settings_video_fragment.xml +++ b/app/src/main/res/layout/settings_video_fragment.xml @@ -11,6 +11,9 @@ + + android:visibility="@{sharedMainViewModel.canSlidingPaneBeClosed ? View.INVISIBLE : View.GONE}" /> diff --git a/app/src/main/res/navigation-sw533dp/chat_nav_graph.xml b/app/src/main/res/navigation-sw533dp/chat_nav_graph.xml deleted file mode 100644 index b073b3b01..000000000 --- a/app/src/main/res/navigation-sw533dp/chat_nav_graph.xml +++ /dev/null @@ -1,87 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/navigation-sw533dp/contacts_nav_graph.xml b/app/src/main/res/navigation-sw533dp/contacts_nav_graph.xml deleted file mode 100644 index 5c1c9a794..000000000 --- a/app/src/main/res/navigation-sw533dp/contacts_nav_graph.xml +++ /dev/null @@ -1,47 +0,0 @@ - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/navigation-sw533dp/history_nav_graph.xml b/app/src/main/res/navigation-sw533dp/history_nav_graph.xml deleted file mode 100644 index d10270905..000000000 --- a/app/src/main/res/navigation-sw533dp/history_nav_graph.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/navigation/chat_nav_graph.xml b/app/src/main/res/navigation/chat_nav_graph.xml index 0383787db..2a3b2abab 100644 --- a/app/src/main/res/navigation/chat_nav_graph.xml +++ b/app/src/main/res/navigation/chat_nav_graph.xml @@ -3,7 +3,13 @@ xmlns:tools="http://schemas.android.com/tools" xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/chat_nav_graph.xml" - app:startDestination="@id/detailChatRoomFragment"> + app:startDestination="@id/emptyChatFragment"> + + + android:label="ChatRoomCreationFragment" > + + + + + + + + + app:startDestination="@id/emptyContactFragment"> + + - + + + + + \ No newline at end of file diff --git a/app/src/main/res/navigation/history_nav_graph.xml b/app/src/main/res/navigation/history_nav_graph.xml index a4100bb5b..d10270905 100644 --- a/app/src/main/res/navigation/history_nav_graph.xml +++ b/app/src/main/res/navigation/history_nav_graph.xml @@ -3,22 +3,22 @@ xmlns:tools="http://schemas.android.com/tools" xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/history_nav_graph.xml" - app:startDestination="@id/detailCallLogFragment"> + app:startDestination="@id/emptyFragment"> + + + android:label="DetailCallLogFragment" /> - - - - - + \ No newline at end of file diff --git a/app/src/main/res/navigation/main_nav_graph.xml b/app/src/main/res/navigation/main_nav_graph.xml index 15c1055fd..9e6204476 100644 --- a/app/src/main/res/navigation/main_nav_graph.xml +++ b/app/src/main/res/navigation/main_nav_graph.xml @@ -19,12 +19,6 @@ - - + - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - + - + - + - + - - + \ No newline at end of file