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 345524ee..68b8d02f 100644 --- a/app/src/main/kotlin/com/simplemobiletools/dialer/activities/CallActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/dialer/activities/CallActivity.kt @@ -11,7 +11,9 @@ import android.os.Handler import android.os.PowerManager import android.telecom.Call import android.telecom.CallAudioState +import android.view.MotionEvent import android.view.WindowManager +import android.widget.ImageView import com.simplemobiletools.commons.extensions.* import com.simplemobiletools.commons.helpers.MINUTE_SECONDS import com.simplemobiletools.commons.helpers.isOreoMr1Plus @@ -45,6 +47,8 @@ class CallActivity : SimpleActivity() { private var callDuration = 0 private val callContactAvatarHelper by lazy { CallContactAvatarHelper(this) } private val callDurationHelper by lazy { (application as App).callDurationHelper } + private var dragDownX = 0f + private var stopAnimation = false override fun onCreate(savedInstanceState: Bundle?) { supportActionBar?.hide() @@ -94,13 +98,7 @@ class CallActivity : SimpleActivity() { } private fun initButtons() { - call_decline.setOnClickListener { - endCall() - } - - call_accept.setOnClickListener { - acceptCall() - } + handleSwipe() call_toggle_microphone.setOnClickListener { toggleMicrophone() @@ -145,6 +143,115 @@ class CallActivity : SimpleActivity() { call_sim_id.setTextColor(config.textColor.getContrastColor()) } + @SuppressLint("ClickableViewAccessibility") + private fun handleSwipe() { + var minDragX = 0f + var maxDragX = 0f + var initialDraggableX = 0f + var initialLeftArrowX = 0f + var initialRightArrowX = 0f + var initialLeftArrowScaleX = 0f + var initialLeftArrowScaleY = 0f + var initialRightArrowScaleX = 0f + var initialRightArrowScaleY = 0f + var leftArrowTranslation = 0f + var rightArrowTranslation = 0f + + call_accept.onGlobalLayout { + minDragX = call_decline.left.toFloat() + maxDragX = call_accept.left.toFloat() + initialDraggableX = call_draggable.left.toFloat() + initialLeftArrowX = call_left_arrow.x + initialRightArrowX = call_right_arrow.x + initialLeftArrowScaleX = call_left_arrow.scaleX + initialLeftArrowScaleY = call_left_arrow.scaleY + initialRightArrowScaleX = call_right_arrow.scaleX + initialRightArrowScaleY = call_right_arrow.scaleY + leftArrowTranslation = -call_decline.x + rightArrowTranslation = call_decline.x + + call_left_arrow.applyColorFilter(getColor(R.color.md_red_400)) + call_right_arrow.applyColorFilter(getColor(R.color.md_green_400)) + + startArrowAnimation(call_left_arrow, initialLeftArrowX, initialLeftArrowScaleX, initialLeftArrowScaleY, leftArrowTranslation) + startArrowAnimation(call_right_arrow, initialRightArrowX, initialRightArrowScaleX, initialRightArrowScaleY, rightArrowTranslation) + } + + var lock = false + call_draggable.setOnTouchListener { v, event -> + when (event.action) { + MotionEvent.ACTION_DOWN -> { + dragDownX = event.x + call_draggable_background.animate().alpha(0f) + stopAnimation = true + call_left_arrow.animate().alpha(0f) + call_right_arrow.animate().alpha(0f) + lock = false + } + MotionEvent.ACTION_UP, MotionEvent.ACTION_CANCEL -> { + dragDownX = 0f + call_draggable.animate().x(initialDraggableX).withEndAction { + call_draggable_background.animate().alpha(0.2f) + } + call_draggable.setImageDrawable(getDrawable(R.drawable.ic_phone_down_vector)) + call_left_arrow.animate().alpha(1f) + call_right_arrow.animate().alpha(1f) + stopAnimation = false + startArrowAnimation(call_left_arrow, initialLeftArrowX, initialLeftArrowScaleX, initialLeftArrowScaleY, leftArrowTranslation) + startArrowAnimation(call_right_arrow, initialRightArrowX, initialRightArrowScaleX, initialRightArrowScaleY, rightArrowTranslation) + } + MotionEvent.ACTION_MOVE -> { + call_draggable.x = Math.min(maxDragX, Math.max(minDragX, event.rawX - dragDownX)) + when { + call_draggable.x >= maxDragX - 50f -> { + if (!lock) { + lock = true + call_draggable.performHapticFeedback() + acceptCall() + } + } + call_draggable.x <= minDragX + 50f -> { + if (!lock) { + lock = true + call_draggable.performHapticFeedback() + endCall() + } + } + call_draggable.x > initialDraggableX -> { + lock = false + call_draggable.setImageDrawable(getDrawable(R.drawable.ic_phone_green_vector)) + } + call_draggable.x <= initialDraggableX -> { + lock = false + call_draggable.setImageDrawable(getDrawable(R.drawable.ic_phone_down_red_vector)) + } + } + } + } + true + } + } + + private fun startArrowAnimation(arrow: ImageView, initialX: Float, initialScaleX: Float, initialScaleY: Float, translation: Float) { + arrow.apply { + alpha = 1f + x = initialX + scaleX = initialScaleX + scaleY = initialScaleY + animate() + .alpha(0f) + .translationX(translation) + .scaleXBy(-0.5f) + .scaleYBy(-0.5f) + .setDuration(1000) + .withEndAction { + if (!stopAnimation) { + startArrowAnimation(this, initialX, initialScaleX, initialScaleY, translation) + } + } + } + } + private fun dialpadPressed(char: Char) { CallManager.keypad(char) dialpad_input.addCharacter(char) diff --git a/app/src/main/res/drawable/pulsing_background.xml b/app/src/main/res/drawable/pulsing_background.xml new file mode 100644 index 00000000..ccabadb0 --- /dev/null +++ b/app/src/main/res/drawable/pulsing_background.xml @@ -0,0 +1,12 @@ + + + + + + + diff --git a/app/src/main/res/layout/activity_call.xml b/app/src/main/res/layout/activity_call.xml index 94ed695f..d3c369b1 100644 --- a/app/src/main/res/layout/activity_call.xml +++ b/app/src/main/res/layout/activity_call.xml @@ -160,13 +160,15 @@ android:id="@+id/call_decline" android:layout_width="@dimen/incoming_call_button_size" android:layout_height="@dimen/incoming_call_button_size" + android:clickable="false" android:contentDescription="@string/decline_call" + android:padding="@dimen/medium_margin" android:src="@drawable/ic_call_decline" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintHorizontal_bias="0.15" + app:layout_constraintBottom_toBottomOf="@+id/call_draggable" + app:layout_constraintEnd_toStartOf="@+id/call_draggable" + app:layout_constraintHorizontal_bias="0.5" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toTopOf="parent" + app:layout_constraintTop_toTopOf="@+id/call_draggable" app:layout_constraintVertical_bias="0.85" /> + + + + + + + + - \ No newline at end of file + diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index ab3c43c5..3c5cb417 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -61,4 +61,4 @@ Haven't found some strings? There's more at https://github.com/SimpleMobileTools/Simple-Commons/tree/master/commons/src/main/res --> - \ No newline at end of file + diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index f34a1572..058957e1 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -84,4 +84,4 @@ Haven't found some strings? There's more at https://github.com/SimpleMobileTools/Simple-Commons/tree/master/commons/src/main/res --> - \ No newline at end of file + diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index ecc82a44..45c4654d 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -55,7 +55,7 @@ Oproepgeschiedenis: opeenvolgende items van hetzelfde nummer groeperen Standaard het toetsenblok openen bij starten - Nabijheidssensor uitschakelen tijdens bellenv + Nabijheidssensor uitschakelen tijdens bellen diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index f3eff41e..962f91ba 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -84,4 +84,4 @@ Haven't found some strings? There's more at https://github.com/SimpleMobileTools/Simple-Commons/tree/master/commons/src/main/res --> - \ No newline at end of file + diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 2d1e7295..5d8eb1fd 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -84,4 +84,4 @@ Haven't found some strings? There's more at https://github.com/SimpleMobileTools/Simple-Commons/tree/master/commons/src/main/res --> - \ No newline at end of file + diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index 0646f0b3..bbefcc88 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -84,4 +84,4 @@ Bazı dizeleri bulamadınız mı? Burada daha fazlası var: https://github.com/SimpleMobileTools/Simple-Commons/tree/master/commons/src/main/res --> - \ No newline at end of file + diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index b809fc68..b9bd7898 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -84,4 +84,4 @@ Haven't found some strings? There's more at https://github.com/SimpleMobileTools/Simple-Commons/tree/master/commons/src/main/res --> - \ No newline at end of file + diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index 30f5684e..74be41d0 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -1,6 +1,7 @@ 60dp + 50dp 72dp 30dp 120dp