Skip to content

Commit 72d57f3

Browse files
cranberry-platypuslukstbit
authored andcommitted
fix: Handle deprecation of overridePendingTransition (API 34)
The API was updated with a parameter specifying whether the animation was used for opening or closing the activity. https://developer.android.com/reference/android/app/Activity#overrideActivityTransition(int,%20int,%20int) Fixes 14558
1 parent d49d9b4 commit 72d57f3

5 files changed

Lines changed: 84 additions & 20 deletions

File tree

AnkiDroid/src/main/java/com/ichi2/anim/ActivityTransitionAnimation.kt

Lines changed: 26 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -6,37 +6,50 @@ import android.app.Activity
66
import android.content.Context
77
import android.os.Parcelable
88
import android.util.LayoutDirection
9+
import androidx.annotation.AnimRes
910
import com.ichi2.anim.ActivityTransitionAnimation.getInverseTransition
1011
import com.ichi2.anki.R
12+
import com.ichi2.anki.compat.CompatHelper
1113
import kotlinx.parcelize.Parcelize
1214

1315
object ActivityTransitionAnimation {
14-
@Suppress("DEPRECATION", "deprecated in API34 for predictive back, must plumb through new open/close parameter")
16+
/**
17+
* @param open when `true`, overrides the animation for entering this activity.
18+
* When `false`, overrides the animation for closing this activity
19+
*/
1520
fun slide(
1621
activity: Activity,
1722
direction: Direction,
23+
open: Boolean,
1824
) {
25+
fun overrideTransition(
26+
@AnimRes enter: Int,
27+
@AnimRes exit: Int,
28+
) {
29+
CompatHelper.compat.overrideTransition(activity, enter, exit, open)
30+
}
31+
1932
when (direction) {
2033
Direction.START ->
2134
if (isRightToLeft(activity)) {
22-
activity.overridePendingTransition(R.anim.slide_right_in, R.anim.slide_right_out)
35+
overrideTransition(R.anim.slide_right_in, R.anim.slide_right_out)
2336
} else {
24-
activity.overridePendingTransition(R.anim.slide_left_in, R.anim.slide_left_out)
37+
overrideTransition(R.anim.slide_left_in, R.anim.slide_left_out)
2538
}
2639
Direction.END ->
2740
if (isRightToLeft(activity)) {
28-
activity.overridePendingTransition(R.anim.slide_left_in, R.anim.slide_left_out)
41+
overrideTransition(R.anim.slide_left_in, R.anim.slide_left_out)
2942
} else {
30-
activity.overridePendingTransition(R.anim.slide_right_in, R.anim.slide_right_out)
43+
overrideTransition(R.anim.slide_right_in, R.anim.slide_right_out)
3144
}
32-
Direction.RIGHT -> activity.overridePendingTransition(R.anim.slide_right_in, R.anim.slide_right_out)
33-
Direction.LEFT -> activity.overridePendingTransition(R.anim.slide_left_in, R.anim.slide_left_out)
34-
Direction.FADE -> activity.overridePendingTransition(R.anim.fade_in, R.anim.fade_out)
35-
Direction.UP -> activity.overridePendingTransition(R.anim.slide_up_in, R.anim.slide_up_out)
36-
Direction.DOWN -> activity.overridePendingTransition(R.anim.slide_down_in, R.anim.slide_down_out)
37-
Direction.NONE -> activity.overridePendingTransition(R.anim.none, R.anim.none)
38-
Direction.DEFAULT -> {
39-
}
45+
46+
Direction.RIGHT -> overrideTransition(R.anim.slide_right_in, R.anim.slide_right_out)
47+
Direction.LEFT -> overrideTransition(R.anim.slide_left_in, R.anim.slide_left_out)
48+
Direction.FADE -> overrideTransition(R.anim.fade_in, R.anim.fade_out)
49+
Direction.UP -> overrideTransition(R.anim.slide_up_in, R.anim.slide_up_out)
50+
Direction.DOWN -> overrideTransition(R.anim.slide_down_in, R.anim.slide_down_out)
51+
Direction.NONE -> overrideTransition(R.anim.none, R.anim.none)
52+
Direction.DEFAULT -> { }
4053
}
4154
}
4255

AnkiDroid/src/main/java/com/ichi2/anki/AnkiActivity.kt

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -347,7 +347,7 @@ open class AnkiActivity(
347347
) {
348348
enableIntentAnimation(intent)
349349
super.startActivity(intent)
350-
enableActivityAnimation(animation)
350+
enableActivityAnimation(animation, open = true)
351351
}
352352

353353
override fun finish() {
@@ -357,15 +357,19 @@ open class AnkiActivity(
357357
fun finishWithAnimation(animation: Direction) {
358358
Timber.i("finishWithAnimation %s", animation)
359359
super.finish()
360-
enableActivityAnimation(animation)
360+
enableActivityAnimation(animation, open = false)
361361
}
362362

363363
private fun disableIntentAnimation(intent: Intent) {
364364
intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION)
365365
}
366366

367-
private fun disableActivityAnimation() {
368-
ActivityTransitionAnimation.slide(this, NONE)
367+
/**
368+
* @param open when `true`, overrides the animation for entering this activity.
369+
* When `false`, overrides the animation for closing this activity
370+
*/
371+
private fun disableActivityAnimation(open: Boolean) {
372+
ActivityTransitionAnimation.slide(this, NONE, open)
369373
}
370374

371375
@KotlinCleanup("Maybe rename this? This only disables the animation conditionally")
@@ -375,11 +379,18 @@ open class AnkiActivity(
375379
}
376380
}
377381

378-
private fun enableActivityAnimation(animation: Direction) {
382+
/**
383+
* @param open when `true`, overrides the animation for entering this activity.
384+
* When `false`, overrides the animation for closing this activity
385+
*/
386+
private fun enableActivityAnimation(
387+
animation: Direction,
388+
open: Boolean,
389+
) {
379390
if (animationDisabled()) {
380-
disableActivityAnimation()
391+
disableActivityAnimation(open)
381392
} else {
382-
ActivityTransitionAnimation.slide(this, animation)
393+
ActivityTransitionAnimation.slide(this, animation, open)
383394
}
384395
}
385396

compat/src/main/java/com/ichi2/anki/compat/BaseCompat.kt

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
package com.ichi2.anki.compat
55

6+
import android.app.Activity
67
import android.content.Context
78
import android.content.Intent
89
import android.content.pm.PackageInfo
@@ -17,6 +18,7 @@ import android.os.Environment
1718
import android.os.Vibrator
1819
import android.provider.MediaStore
1920
import android.view.View
21+
import androidx.annotation.AnimRes
2022
import androidx.appcompat.widget.TooltipCompat
2123
import com.ichi2.anki.common.utils.annotation.KotlinCleanup
2224
import timber.log.Timber
@@ -39,6 +41,18 @@ open class BaseCompat : Compat {
3941
TooltipCompat.setTooltipText(view, view.contentDescription)
4042
}
4143

44+
override fun overrideTransition(
45+
activity: Activity,
46+
@AnimRes enter: Int,
47+
@AnimRes exit: Int,
48+
open: Boolean,
49+
) {
50+
activity.overridePendingTransition(
51+
enter,
52+
exit,
53+
)
54+
}
55+
4256
// Until API 26 just specify time, after that specify effect also
4357
override fun vibrate(
4458
context: Context,

compat/src/main/java/com/ichi2/anki/compat/Compat.kt

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
package com.ichi2.anki.compat
66

7+
import android.app.Activity
78
import android.content.Context
89
import android.content.Intent
910
import android.content.pm.PackageInfo
@@ -17,6 +18,7 @@ import android.net.Uri
1718
import android.os.Bundle
1819
import android.os.Environment
1920
import android.view.View
21+
import androidx.annotation.AnimRes
2022
import java.io.File
2123
import java.io.FileNotFoundException
2224
import java.io.IOException
@@ -73,6 +75,13 @@ interface Compat {
7375

7476
fun getMediaRecorder(context: Context): MediaRecorder
7577

78+
fun overrideTransition(
79+
activity: Activity,
80+
@AnimRes enter: Int,
81+
@AnimRes exit: Int,
82+
open: Boolean,
83+
)
84+
7685
fun resolveActivity(
7786
packageManager: PackageManager,
7887
intent: Intent,

compat/src/main/java/com/ichi2/anki/compat/CompatV34.kt

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@
22

33
package com.ichi2.anki.compat
44

5+
import android.app.Activity
56
import android.view.MotionEvent
7+
import androidx.annotation.AnimRes
68
import androidx.annotation.RequiresApi
79

810
@RequiresApi(34)
@@ -13,4 +15,19 @@ open class CompatV34 : CompatV33() {
1315
override val AXIS_GESTURE_SCROLL_X_DISTANCE = MotionEvent.AXIS_GESTURE_SCROLL_X_DISTANCE
1416
override val AXIS_GESTURE_SCROLL_Y_DISTANCE = MotionEvent.AXIS_GESTURE_SCROLL_Y_DISTANCE
1517
override val AXIS_GESTURE_PINCH_SCALE_FACTOR = MotionEvent.AXIS_GESTURE_PINCH_SCALE_FACTOR
18+
19+
override fun overrideTransition(
20+
activity: Activity,
21+
@AnimRes enter: Int,
22+
@AnimRes exit: Int,
23+
open: Boolean,
24+
) {
25+
val ty =
26+
if (open) {
27+
Activity.OVERRIDE_TRANSITION_OPEN
28+
} else {
29+
Activity.OVERRIDE_TRANSITION_CLOSE
30+
}
31+
activity.overrideActivityTransition(ty, enter, exit)
32+
}
1633
}

0 commit comments

Comments
 (0)