From 78bb9662286e3ccf4054fbeca16203962cf9b4a8 Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Wed, 4 Nov 2020 10:22:25 +0100 Subject: [PATCH] Added animation to options menu in call --- .../call/fragments/ControlsFragment.kt | 46 ++++--- .../call/viewmodels/ControlsViewModel.kt | 5 + .../activities/main/fragments/TabsFragment.kt | 22 ++-- .../layout-land/call_controls_fragment.xml | 2 +- .../res/layout/call_controls_fragment.xml | 6 +- .../main/res/layout/call_primary_buttons.xml | 10 +- .../res/layout/call_secondary_buttons.xml | 118 +++++++++--------- app/src/main/res/values/dimen.xml | 2 + 8 files changed, 117 insertions(+), 94 deletions(-) diff --git a/app/src/main/java/org/linphone/activities/call/fragments/ControlsFragment.kt b/app/src/main/java/org/linphone/activities/call/fragments/ControlsFragment.kt index b84bcd00e..1ce93b273 100644 --- a/app/src/main/java/org/linphone/activities/call/fragments/ControlsFragment.kt +++ b/app/src/main/java/org/linphone/activities/call/fragments/ControlsFragment.kt @@ -27,8 +27,8 @@ import android.content.Intent import android.content.pm.PackageManager.PERMISSION_GRANTED import android.os.Bundle import android.os.SystemClock -import android.view.View import android.view.animation.LinearInterpolator +import android.widget.LinearLayout import android.widget.TextView import androidx.lifecycle.ViewModelProvider import org.linphone.LinphoneApplication.Companion.coreContext @@ -59,7 +59,26 @@ class ControlsFragment : GenericFragment() { override fun getLayoutId(): Int = R.layout.call_controls_fragment private val bounceAnimator: ValueAnimator by lazy { - ValueAnimator.ofFloat(resources.getDimension(R.dimen.tabs_fragment_unread_count_bounce_offset), 0f) + ValueAnimator.ofFloat(resources.getDimension(R.dimen.tabs_fragment_unread_count_bounce_offset), 0f).apply { + addUpdateListener { + val value = it.animatedValue as Float + view?.findViewById(R.id.chat_unread_count)?.translationY = -value + } + interpolator = LinearInterpolator() + duration = 250 + repeatMode = ValueAnimator.REVERSE + repeatCount = ValueAnimator.INFINITE + } + } + + private val optionsMenuAnimator: ValueAnimator by lazy { + ValueAnimator.ofFloat(resources.getDimension(R.dimen.call_options_menu_translate_y), 0f).apply { + addUpdateListener { + val value = it.animatedValue as Float + view?.findViewById(R.id.options_menu)?.translationY = value + } + duration = if (corePreferences.enableAnimations) 500 else 0 + } } override fun onActivityCreated(savedInstanceState: Bundle?) { @@ -140,6 +159,16 @@ class ControlsFragment : GenericFragment() { } }) + controlsViewModel.toggleOptionsMenuEvent.observe(viewLifecycleOwner, { + it.consume { open -> + if (open) { + optionsMenuAnimator.start() + } else { + optionsMenuAnimator.reverse() + } + } + }) + controlsViewModel.somethingClickedEvent.observe(viewLifecycleOwner, { it.consume { sharedViewModel.resetHiddenInterfaceTimerInVideoCallEvent.value = Event(true) @@ -151,19 +180,6 @@ class ControlsFragment : GenericFragment() { } } - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) - - bounceAnimator.addUpdateListener { - val value = it.animatedValue as Float - view.findViewById(R.id.chat_unread_count).translationY = -value - } - bounceAnimator.interpolator = LinearInterpolator() - bounceAnimator.duration = 250 - bounceAnimator.repeatMode = ValueAnimator.REVERSE - bounceAnimator.repeatCount = ValueAnimator.INFINITE - } - override fun onStart() { super.onStart() diff --git a/app/src/main/java/org/linphone/activities/call/viewmodels/ControlsViewModel.kt b/app/src/main/java/org/linphone/activities/call/viewmodels/ControlsViewModel.kt index 29ebe417f..30b719bfa 100644 --- a/app/src/main/java/org/linphone/activities/call/viewmodels/ControlsViewModel.kt +++ b/app/src/main/java/org/linphone/activities/call/viewmodels/ControlsViewModel.kt @@ -83,6 +83,10 @@ class ControlsViewModel : ViewModel() { MutableLiveData>() } + val toggleOptionsMenuEvent: MutableLiveData> by lazy { + MutableLiveData>() + } + val somethingClickedEvent = MutableLiveData>() val chatAllowed = !LinphoneApplication.corePreferences.disableChat @@ -234,6 +238,7 @@ class ControlsViewModel : ViewModel() { fun toggleOptionsMenu() { somethingClickedEvent.value = Event(true) optionsVisibility.value = optionsVisibility.value != true + toggleOptionsMenuEvent.value = Event(optionsVisibility.value ?: true) } fun toggleNumpadVisibility() { diff --git a/app/src/main/java/org/linphone/activities/main/fragments/TabsFragment.kt b/app/src/main/java/org/linphone/activities/main/fragments/TabsFragment.kt index 1b1dc0b43..e79ee1fa0 100644 --- a/app/src/main/java/org/linphone/activities/main/fragments/TabsFragment.kt +++ b/app/src/main/java/org/linphone/activities/main/fragments/TabsFragment.kt @@ -42,7 +42,17 @@ class TabsFragment : GenericFragment(), NavController.OnDes override fun getLayoutId(): Int = R.layout.tabs_fragment private val bounceAnimator: ValueAnimator by lazy { - ValueAnimator.ofFloat(resources.getDimension(R.dimen.tabs_fragment_unread_count_bounce_offset), 0f) + ValueAnimator.ofFloat(resources.getDimension(R.dimen.tabs_fragment_unread_count_bounce_offset), 0f).apply { + addUpdateListener { + val value = it.animatedValue as Float + binding.historyUnreadCount.translationY = -value + binding.chatUnreadCount.translationY = -value + } + interpolator = LinearInterpolator() + duration = 250 + repeatMode = ValueAnimator.REVERSE + repeatCount = ValueAnimator.INFINITE + } } override fun onActivityCreated(savedInstanceState: Bundle?) { @@ -70,16 +80,6 @@ class TabsFragment : GenericFragment(), NavController.OnDes binding.setChatClickListener { navigateToChatRooms() } - - bounceAnimator.addUpdateListener { - val value = it.animatedValue as Float - binding.historyUnreadCount.translationY = -value - binding.chatUnreadCount.translationY = -value - } - bounceAnimator.interpolator = LinearInterpolator() - bounceAnimator.duration = 250 - bounceAnimator.repeatMode = ValueAnimator.REVERSE - bounceAnimator.repeatCount = ValueAnimator.INFINITE } override fun onStart() { diff --git a/app/src/main/res/layout-land/call_controls_fragment.xml b/app/src/main/res/layout-land/call_controls_fragment.xml index 577a94474..e09b37488 100644 --- a/app/src/main/res/layout-land/call_controls_fragment.xml +++ b/app/src/main/res/layout-land/call_controls_fragment.xml @@ -160,7 +160,7 @@ layout="@layout/call_primary_buttons" bind:viewModel="@{controlsViewModel}" android:layout_width="match_parent" - android:layout_height="60dp" + android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_toLeftOf="@id/vertical_divider"/> diff --git a/app/src/main/res/layout/call_controls_fragment.xml b/app/src/main/res/layout/call_controls_fragment.xml index a60eaa472..09f589cea 100644 --- a/app/src/main/res/layout/call_controls_fragment.xml +++ b/app/src/main/res/layout/call_controls_fragment.xml @@ -160,7 +160,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_above="@id/primary_buttons_row" - android:layout_marginBottom="60dp" + android:layout_marginBottom="@dimen/call_button_size" android:layout_gravity="bottom" android:background="?attr/backgroundColor" android:orientation="vertical" @@ -251,7 +251,7 @@ layout="@layout/call_primary_buttons" bind:viewModel="@{controlsViewModel}" android:layout_width="match_parent" - android:layout_height="60dp" + android:layout_height="wrap_content" android:layout_alignParentBottom="true"/> - + @@ -31,7 +32,7 @@ @@ -62,7 +63,7 @@ android:enabled="@{viewModel.isMuteMicrophoneEnabled}" android:contentDescription="@{viewModel.isMicrophoneMuted ? @string/content_description_disable_mic_mute : @string/content_description_enable_mic_mute}" android:layout_width="match_parent" - android:layout_height="60dp" + android:layout_height="@dimen/call_button_size" android:layout_toRightOf="@id/left_vertical_divider_2" android:layout_alignParentBottom="true" android:background="?attr/button_background_drawable" @@ -93,7 +94,7 @@ android:visibility="@{viewModel.audioRoutesEnabled ? View.GONE : View.VISIBLE}" android:contentDescription="@{viewModel.isSpeakerSelected ? @string/content_description_disable_speaker : @string/content_description_enable_speaker}" android:layout_width="match_parent" - android:layout_height="60dp" + android:layout_height="@dimen/call_button_size" android:layout_alignParentBottom="true" android:background="?attr/button_background_drawable" android:padding="15dp" @@ -106,7 +107,7 @@ android:contentDescription="@string/content_description_toggle_audio_menu" android:id="@+id/audio_route" android:layout_width="match_parent" - android:layout_height="60dp" + android:layout_height="@dimen/call_button_size" android:layout_alignParentBottom="true" android:background="?attr/button_background_drawable" android:padding="15dp" @@ -119,7 +120,7 @@ android:contentDescription="@string/content_description_use_bluetooth_headset" android:id="@+id/route_bluetooth" android:layout_width="match_parent" - android:layout_height="60dp" + android:layout_height="@dimen/call_button_size" android:layout_above="@id/audio_route" android:background="?attr/button_background_drawable" android:padding="15dp" @@ -132,7 +133,7 @@ android:contentDescription="@string/content_description_use_earpiece" android:id="@+id/route_earpiece" android:layout_width="match_parent" - android:layout_height="60dp" + android:layout_height="@dimen/call_button_size" android:layout_above="@id/route_bluetooth" android:background="?attr/button_background_drawable" android:padding="15dp" @@ -144,7 +145,7 @@ android:onClick="@{() -> viewModel.forceSpeakerAudioRoute()}" android:contentDescription="@string/content_description_use_speaker" android:layout_width="match_parent" - android:layout_height="60dp" + android:layout_height="@dimen/call_button_size" android:layout_above="@id/route_earpiece" android:background="?attr/button_background_drawable" android:padding="15dp" @@ -154,70 +155,69 @@ + + + + + + + + + + + + - - - - - - - - diff --git a/app/src/main/res/values/dimen.xml b/app/src/main/res/values/dimen.xml index edcbcc26e..2dc5acdf8 100644 --- a/app/src/main/res/values/dimen.xml +++ b/app/src/main/res/values/dimen.xml @@ -12,4 +12,6 @@ 5dp 5dp 35dp + 60dp + 300dp \ No newline at end of file