From bb36cda71131b177cf3d06f4a90b433662c957bf Mon Sep 17 00:00:00 2001 From: utzcoz Date: Thu, 25 Nov 2021 00:25:45 +0800 Subject: [PATCH] Only using AttributionSource for compile SDK 31 and above We have tried to use Object to replace AttributionSource as type of second input parameter for noteProxyOpNoThrow(int, AttributeSource, String, bool) to make sure ShadowAppOpsManager can be loaded and used when compile SDK is less than 31. But changed method's siganture doesn't match origin method signature, and it will be used as shadow method. To fix this problem, this CL uses looseSignatures for ShadowAppOpsManager, and chagnes all input parameters' type to Object to meet looseSignatures' requirement. Signed-off-by: utzcoz --- .../compat-target29/build.gradle | 2 +- .../target29/Target29CompatibilityTest.kt | 10 +++++++- .../shadows/ShadowAppOpsManager.java | 25 +++++++++++-------- 3 files changed, 25 insertions(+), 12 deletions(-) diff --git a/integration_tests/compat-target29/build.gradle b/integration_tests/compat-target29/build.gradle index 414cebd09b5..f452c2d6060 100644 --- a/integration_tests/compat-target29/build.gradle +++ b/integration_tests/compat-target29/build.gradle @@ -13,7 +13,7 @@ dependencies { testCompileOnly AndroidSdk.Q.coordinates testRuntime AndroidSdk.Q.coordinates - testImplementation("androidx.test:core:$axtVersion") + testImplementation "androidx.test:core:$axtVersion" testImplementation "junit:junit:$junitVersion" testImplementation "com.google.truth:truth:$truthVersion" } \ No newline at end of file diff --git a/integration_tests/compat-target29/src/test/java/org/robolectric/integration/compat/target29/Target29CompatibilityTest.kt b/integration_tests/compat-target29/src/test/java/org/robolectric/integration/compat/target29/Target29CompatibilityTest.kt index a44accf2be2..2bea90de386 100644 --- a/integration_tests/compat-target29/src/test/java/org/robolectric/integration/compat/target29/Target29CompatibilityTest.kt +++ b/integration_tests/compat-target29/src/test/java/org/robolectric/integration/compat/target29/Target29CompatibilityTest.kt @@ -5,14 +5,22 @@ import androidx.test.core.app.ApplicationProvider import com.google.common.truth.Truth.assertThat import org.junit.Test import org.junit.runner.RunWith +import org.robolectric.Robolectric import org.robolectric.RobolectricTestRunner @RunWith(RobolectricTestRunner::class) class Target29CompatibilityTest { + private val application = ApplicationProvider.getApplicationContext(); + @Test fun `Initialize LocationManager succeed`() { - val application = ApplicationProvider.getApplicationContext() val locationManager = application.getSystemService(Context.LOCATION_SERVICE) assertThat(locationManager).isNotNull() } + + @Test + fun `Initialize AppOpsManager succeed`() { + val appOpsManager = application.getSystemService(Context.APP_OPS_SERVICE); + assertThat(appOpsManager).isNotNull(); + } } diff --git a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowAppOpsManager.java b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowAppOpsManager.java index 0891a016300..d2222d676c7 100644 --- a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowAppOpsManager.java +++ b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowAppOpsManager.java @@ -30,8 +30,10 @@ import android.util.ArrayMap; import android.util.LongSparseArray; import android.util.LongSparseLongArray; +import androidx.annotation.RequiresApi; import com.android.internal.app.IAppOpsService; import com.google.auto.value.AutoValue; +import com.google.common.base.Preconditions; import com.google.common.collect.HashMultimap; import com.google.common.collect.ImmutableList; import com.google.common.collect.Multimap; @@ -57,7 +59,7 @@ import org.robolectric.util.ReflectionHelpers; import org.robolectric.util.ReflectionHelpers.ClassParameter; -@Implements(value = AppOpsManager.class) +@Implements(value = AppOpsManager.class, looseSignatures = true) public class ShadowAppOpsManager { // OpEntry fields that the shadow doesn't currently allow the test to configure. @@ -394,18 +396,21 @@ protected int noteProxyOpNoThrow( return checkOpNoThrow(op, proxiedUid, proxiedPackageName); } + @RequiresApi(api = Build.VERSION_CODES.S) @Implementation(minSdk = Build.VERSION_CODES.S) protected int noteProxyOpNoThrow( - int op, - AttributionSource attributionSource, - String message, - boolean ignoredSkipProxyOperation) { + Object op, Object attributionSource, Object message, Object ignoredSkipProxyOperation) { + Preconditions.checkArgument(op instanceof Integer); + Preconditions.checkArgument(attributionSource instanceof AttributionSource); + Preconditions.checkArgument(message == null || message instanceof String); + Preconditions.checkArgument(ignoredSkipProxyOperation instanceof Boolean); + AttributionSource castedAttributionSource = (AttributionSource) attributionSource; return noteProxyOpNoThrow( - op, - attributionSource.getNextPackageName(), - attributionSource.getNextUid(), - attributionSource.getNextAttributionTag(), - message); + (int) op, + castedAttributionSource.getNextPackageName(), + castedAttributionSource.getNextUid(), + castedAttributionSource.getNextAttributionTag(), + (String) message); } @Implementation(minSdk = KITKAT)