diff --git a/app/src/main/kotlin/com/simplemobiletools/dialer/activities/CallActivity.kt b/app/src/main/kotlin/com/simplemobiletools/dialer/activities/CallActivity.kt index d871f581..56694c6e 100644 --- a/app/src/main/kotlin/com/simplemobiletools/dialer/activities/CallActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/dialer/activities/CallActivity.kt @@ -17,6 +17,8 @@ import android.telecom.CallAudioState import android.view.MotionEvent import android.view.View import android.view.WindowManager +import android.view.animation.AccelerateDecelerateInterpolator +import android.view.animation.OvershootInterpolator import android.widget.ImageView import androidx.core.view.children import com.simplemobiletools.commons.extensions.* @@ -35,7 +37,6 @@ import kotlin.math.min class CallActivity : SimpleActivity() { companion object { - private const val ANIMATION_DURATION = 250L fun getStartIntent(context: Context): Intent { val openAppIntent = Intent(context, CallActivity::class.java) openAppIntent.flags = Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT or Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_REORDER_TO_FRONT @@ -44,7 +45,7 @@ class CallActivity : SimpleActivity() { } private var isSpeakerOn = false - private var isMicrophoneOn = true + private var isMicrophoneOff = false private var isCallEnded = false private var callContact: CallContact? = null private var proximityWakeLock: PowerManager.WakeLock? = null @@ -55,6 +56,7 @@ class CallActivity : SimpleActivity() { private var dragDownX = 0f private var stopAnimation = false private var viewsUnderDialpad = arrayListOf>() + private var dialpadHeight = 0f override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -185,13 +187,20 @@ class CallActivity : SimpleActivity() { dialpad_hashtag_holder.setOnClickListener { dialpadPressed('#') } dialpad_wrapper.setBackgroundColor(getProperBackgroundColor()) - arrayOf( - call_toggle_microphone, call_toggle_speaker, call_dialpad, dialpad_close, - call_sim_image, call_toggle_hold, call_add, call_swap, call_merge, call_manage - ).forEach { + arrayOf(dialpad_close, call_sim_image).forEach { it.applyColorFilter(getProperTextColor()) } + val bgColor = getProperBackgroundColor() + val inactiveColor = getInactiveButtonColor() + arrayOf( + call_toggle_microphone, call_toggle_speaker, call_dialpad, + call_toggle_hold, call_add, call_swap, call_merge, call_manage + ).forEach { + it.applyColorFilter(bgColor.getContrastColor()) + it.background.applyColorFilter(inactiveColor) + } + arrayOf( call_toggle_microphone, call_toggle_speaker, call_dialpad, call_toggle_hold, call_add, call_swap, call_merge, call_manage @@ -206,6 +215,10 @@ class CallActivity : SimpleActivity() { call_sim_id.setTextColor(getProperTextColor().getContrastColor()) dialpad_input.disableKeyboard() + + dialpad_wrapper.onGlobalLayout { + dialpadHeight = dialpad_wrapper.height.toFloat() + } } @SuppressLint("ClickableViewAccessibility") @@ -371,8 +384,8 @@ class CallActivity : SimpleActivity() { private fun toggleSpeaker() { isSpeakerOn = !isSpeakerOn - val drawable = if (isSpeakerOn) R.drawable.ic_speaker_on_vector else R.drawable.ic_speaker_off_vector - call_toggle_speaker.setImageDrawable(getDrawable(drawable)) + toggleButtonColor(call_toggle_speaker, isSpeakerOn) + audioManager.isSpeakerphoneOn = isSpeakerOn val newRoute = if (isSpeakerOn) CallAudioState.ROUTE_SPEAKER else CallAudioState.ROUTE_EARPIECE @@ -387,12 +400,11 @@ class CallActivity : SimpleActivity() { } private fun toggleMicrophone() { - isMicrophoneOn = !isMicrophoneOn - val drawable = if (isMicrophoneOn) R.drawable.ic_microphone_vector else R.drawable.ic_microphone_off_vector - call_toggle_microphone.setImageDrawable(getDrawable(drawable)) - audioManager.isMicrophoneMute = !isMicrophoneOn - CallManager.inCallService?.setMuted(!isMicrophoneOn) - call_toggle_microphone.contentDescription = getString(if (isMicrophoneOn) R.string.turn_microphone_off else R.string.turn_microphone_on) + isMicrophoneOff = !isMicrophoneOff + toggleButtonColor(call_toggle_microphone, isMicrophoneOff) + audioManager.isMicrophoneMute = isMicrophoneOff + CallManager.inCallService?.setMuted(isMicrophoneOff) + call_toggle_microphone.contentDescription = getString(if (isMicrophoneOff) R.string.turn_microphone_on else R.string.turn_microphone_off) } private fun toggleDialpadVisibility() { @@ -404,31 +416,48 @@ class CallActivity : SimpleActivity() { } private fun showDialpad() { - dialpad_wrapper.animate().withStartAction { dialpad_wrapper.beVisible() }.alpha(1f) + dialpad_wrapper.apply { + translationY = dialpadHeight + alpha = 0f + animate() + .withStartAction { beVisible() } + .setInterpolator(AccelerateDecelerateInterpolator()) + .setDuration(200L) + .alpha(1f) + .translationY(0f) + .start() + } + viewsUnderDialpad.clear() viewsUnderDialpad.addAll(findVisibleViewsUnderDialpad()) viewsUnderDialpad.forEach { (view, _) -> view.run { - animate().scaleX(0f).alpha(0f).withEndAction { beGone() }.duration = ANIMATION_DURATION - animate().scaleY(0f).alpha(0f).withEndAction { beGone() }.duration = ANIMATION_DURATION + animate().scaleX(0f).alpha(0f).withEndAction { beGone() }.duration = 250L + animate().scaleY(0f).alpha(0f).withEndAction { beGone() }.duration = 250L } } } private fun hideDialpad() { - dialpad_wrapper.animate().alpha(0f).withEndAction { dialpad_wrapper.beGone() } + dialpad_wrapper.animate() + .withEndAction { dialpad_wrapper.beGone() } + .setInterpolator(AccelerateDecelerateInterpolator()) + .setDuration(200L) + .alpha(0f) + .translationY(dialpadHeight) + .start() + viewsUnderDialpad.forEach { (view, alpha) -> view.run { - animate().withStartAction { beVisible() }.scaleX(1f).alpha(alpha).duration = ANIMATION_DURATION - animate().withStartAction { beVisible() }.scaleY(1f).alpha(alpha).duration = ANIMATION_DURATION + animate().withStartAction { beVisible() }.setInterpolator(OvershootInterpolator()).scaleX(1f).alpha(alpha).duration = 250L + animate().withStartAction { beVisible() }.setInterpolator(OvershootInterpolator()).scaleY(1f).alpha(alpha).duration = 250L } } } private fun toggleHold() { val isOnHold = CallManager.toggleHold() - val drawable = if (isOnHold) R.drawable.ic_pause_crossed_vector else R.drawable.ic_pause_vector - call_toggle_hold.setImageDrawable(getDrawable(drawable)) + toggleButtonColor(call_toggle_hold, isOnHold) call_toggle_hold.contentDescription = getString(if (isOnHold) R.string.resume_call else R.string.hold_call) hold_status_label.beVisibleIf(isOnHold) } @@ -689,4 +718,19 @@ class CallActivity : SimpleActivity() { alpha = if (enabled) 1.0f else LOWER_ALPHA } } + + private fun getActiveButtonColor() = getProperPrimaryColor() + + private fun getInactiveButtonColor() = getProperTextColor().adjustAlpha(0.10f) + + private fun toggleButtonColor(view: ImageView, enabled: Boolean) { + if (enabled) { + val color = getActiveButtonColor() + view.background.applyColorFilter(color) + view.applyColorFilter(color.getContrastColor()) + } else { + view.background.applyColorFilter(getInactiveButtonColor()) + view.applyColorFilter(getProperBackgroundColor().getContrastColor()) + } + } } diff --git a/app/src/main/res/drawable/circle_button_background_ripple.xml b/app/src/main/res/drawable/circle_button_background_ripple.xml new file mode 100644 index 00000000..92073d65 --- /dev/null +++ b/app/src/main/res/drawable/circle_button_background_ripple.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_speaker_off_vector.xml b/app/src/main/res/drawable/ic_speaker_off_vector.xml deleted file mode 100644 index 4a1da552..00000000 --- a/app/src/main/res/drawable/ic_speaker_off_vector.xml +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/app/src/main/res/layout/activity_call.xml b/app/src/main/res/layout/activity_call.xml index afb50536..a51bbff0 100644 --- a/app/src/main/res/layout/activity_call.xml +++ b/app/src/main/res/layout/activity_call.xml @@ -163,10 +163,10 @@ android:id="@+id/call_toggle_microphone" android:layout_width="@dimen/dialpad_button_size" android:layout_height="@dimen/dialpad_button_size" - android:background="?attr/selectableItemBackgroundBorderless" + android:background="@drawable/circle_background" android:contentDescription="@string/turn_microphone_off" - android:padding="@dimen/medium_margin" - android:src="@drawable/ic_microphone_vector" + android:padding="@dimen/activity_margin" + android:src="@drawable/ic_microphone_off_vector" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toStartOf="@+id/call_toggle_speaker" app:layout_constraintStart_toStartOf="parent" @@ -177,10 +177,10 @@ android:id="@+id/call_toggle_speaker" android:layout_width="@dimen/dialpad_button_size" android:layout_height="@dimen/dialpad_button_size" - android:background="?attr/selectableItemBackgroundBorderless" + android:background="@drawable/circle_background" android:contentDescription="@string/turn_speaker_on" - android:padding="@dimen/medium_margin" - android:src="@drawable/ic_speaker_off_vector" + android:padding="@dimen/activity_margin" + android:src="@drawable/ic_speaker_on_vector" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toStartOf="@+id/call_dialpad" app:layout_constraintStart_toEndOf="@+id/call_toggle_microphone" @@ -191,9 +191,9 @@ android:id="@+id/call_dialpad" android:layout_width="@dimen/dialpad_button_size" android:layout_height="@dimen/dialpad_button_size" - android:background="?attr/selectableItemBackgroundBorderless" + android:background="@drawable/circle_button_background_ripple" android:contentDescription="@string/show_dialpad" - android:padding="@dimen/medium_margin" + android:padding="@dimen/activity_margin" android:src="@drawable/ic_dialpad_vector" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" @@ -205,10 +205,10 @@ android:id="@+id/call_toggle_hold" android:layout_width="@dimen/dialpad_button_size" android:layout_height="@dimen/dialpad_button_size" - android:layout_marginTop="@dimen/bigger_margin" - android:background="?attr/selectableItemBackgroundBorderless" + android:layout_marginTop="@dimen/big_margin" + android:background="@drawable/circle_background" android:contentDescription="@string/hold_call" - android:padding="10dp" + android:padding="@dimen/activity_margin" android:src="@drawable/ic_pause_vector" app:layout_constraintEnd_toEndOf="@+id/call_toggle_microphone" app:layout_constraintStart_toStartOf="@+id/call_toggle_microphone" @@ -218,10 +218,10 @@ android:id="@+id/call_add" android:layout_width="@dimen/dialpad_button_size" android:layout_height="@dimen/dialpad_button_size" - android:layout_marginTop="@dimen/bigger_margin" - android:background="?attr/selectableItemBackgroundBorderless" + android:layout_marginTop="@dimen/big_margin" + android:background="@drawable/circle_button_background_ripple" android:contentDescription="@string/call_add" - android:padding="10dp" + android:padding="@dimen/activity_margin" android:src="@drawable/ic_add_call_vector" app:layout_constraintEnd_toEndOf="@+id/call_toggle_speaker" app:layout_constraintStart_toStartOf="@+id/call_toggle_speaker" @@ -231,10 +231,10 @@ android:id="@+id/call_manage" android:layout_width="@dimen/dialpad_button_size" android:layout_height="@dimen/dialpad_button_size" - android:layout_marginTop="@dimen/bigger_margin" - android:background="?attr/selectableItemBackgroundBorderless" + android:layout_marginTop="@dimen/big_margin" + android:background="@drawable/circle_button_background_ripple" android:contentDescription="@string/conference_manage" - android:padding="10dp" + android:padding="@dimen/activity_margin" android:src="@drawable/ic_people_vector" android:visibility="gone" app:layout_constraintEnd_toEndOf="@+id/call_dialpad" @@ -246,10 +246,10 @@ android:id="@+id/call_swap" android:layout_width="@dimen/dialpad_button_size" android:layout_height="@dimen/dialpad_button_size" - android:layout_marginTop="@dimen/bigger_margin" - android:background="?attr/selectableItemBackgroundBorderless" + android:layout_marginTop="@dimen/big_margin" + android:background="@drawable/circle_button_background_ripple" android:contentDescription="@string/call_swap" - android:padding="@dimen/medium_margin" + android:padding="@dimen/activity_margin" android:src="@drawable/ic_call_swap_vector" app:layout_constraintEnd_toEndOf="@+id/call_toggle_microphone" app:layout_constraintHorizontal_bias="0.5" @@ -260,10 +260,10 @@ android:id="@+id/call_merge" android:layout_width="@dimen/dialpad_button_size" android:layout_height="@dimen/dialpad_button_size" - android:layout_marginTop="@dimen/bigger_margin" - android:background="?attr/selectableItemBackgroundBorderless" + android:layout_marginTop="@dimen/big_margin" + android:background="@drawable/circle_button_background_ripple" android:contentDescription="@string/call_merge" - android:padding="@dimen/medium_margin" + android:padding="@dimen/activity_margin" android:src="@drawable/ic_call_merge_vector" app:layout_constraintEnd_toEndOf="@+id/call_toggle_speaker" app:layout_constraintHorizontal_bias="0.5" @@ -428,8 +428,9 @@ android:id="@+id/dialpad_wrapper" android:layout_width="match_parent" android:layout_height="wrap_content" + android:elevation="@dimen/medium_margin" android:orientation="vertical" - android:visibility="gone" + android:visibility="invisible" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintStart_toStartOf="parent"> diff --git a/app/src/main/res/layout/item_recent_call.xml b/app/src/main/res/layout/item_recent_call.xml index 9e6d371c..0e35bccf 100644 --- a/app/src/main/res/layout/item_recent_call.xml +++ b/app/src/main/res/layout/item_recent_call.xml @@ -26,6 +26,7 @@ android:layout_marginEnd="@dimen/small_margin" android:padding="@dimen/small_margin" android:src="@drawable/ic_person_vector" + app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> @@ -33,7 +34,8 @@ android:id="@+id/item_recents_name" android:layout_width="0dp" android:layout_height="wrap_content" - android:layout_marginEnd="0dp" + android:layout_marginStart="@dimen/small_margin" + android:layout_marginEnd="@dimen/small_margin" android:ellipsize="end" android:maxLines="1" android:textSize="@dimen/bigger_text_size" @@ -44,8 +46,9 @@ + app:layout_constraintTop_toTopOf="@+id/item_recents_date_time" + tools:visibility="visible" /> - 60dp + 72dp 50dp 50dp 72dp