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