Skip to content

Commit

Permalink
Only using AttributionSource for compile SDK 31 and above
Browse files Browse the repository at this point in the history
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 <utzcoz@outlook.com>
  • Loading branch information
utzcoz committed Nov 27, 2021
1 parent 155ef89 commit bb36cda
Show file tree
Hide file tree
Showing 3 changed files with 25 additions and 12 deletions.
2 changes: 1 addition & 1 deletion integration_tests/compat-target29/build.gradle
Expand Up @@ -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"
}
Expand Up @@ -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<Context>();

@Test
fun `Initialize LocationManager succeed`() {
val application = ApplicationProvider.getApplicationContext<Context>()
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();
}
}
Expand Up @@ -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;
Expand All @@ -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.
Expand Down Expand Up @@ -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)
Expand Down

0 comments on commit bb36cda

Please sign in to comment.