commit | b1f75946c20ce1a659c7fd057111dffe0bdc20d1 | [log] [tgz] |
---|---|---|
author | Omar Ismail | Fri May 31 22:12:45 2024 +0000 |
committer | Gerrit Code Review | Fri May 31 22:12:45 2024 +0000 |
tree | 7fe50d3760a7bcb21683a81b83b2776bd4ee79ee | |
parent | 45d98ad55749dbe4979651c5c49f8f2e333eec31 [diff] | |
parent | 57a51cd7e7678f63c9e371fa35c61c8187296e16 [diff] |
Merge changes Ieda50068,Ifb308a7d into androidx-main * changes: Migrate profileinstaller to use ktfmt Migrate privacysandbox to use ktfmt
diff --git a/gradle.properties b/gradle.properties index b5a9b11..517546b 100644 --- a/gradle.properties +++ b/gradle.properties
@@ -48,7 +48,7 @@ androidx.unpinComposeCompiler=false # Prefix of projects that are opted-in to use ktfmt -androidx.ktfmt.optin=:a,:b,:camera,:car,:collection,:concurrent,:constraintlayout,:core,:customview,:d,:e,:f,:g,:h,:i,:j,:k,:l,:n,:paging,:palette,:preference +androidx.ktfmt.optin=:a,:b,:camera,:car,:collection,:concurrent,:constraintlayout,:core,:customview,:d,:e,:f,:g,:h,:i,:j,:k,:l,:n,:p # Disable features we do not use android.defaults.buildfeatures.aidl=false android.defaults.buildfeatures.buildconfig=false
diff --git a/privacysandbox/activity/activity-client/src/androidTest/java/androidx/privacysandbox/activity/client/CreateSdkActivityLauncherTest.kt b/privacysandbox/activity/activity-client/src/androidTest/java/androidx/privacysandbox/activity/client/CreateSdkActivityLauncherTest.kt index 969a525..81843c6 100644 --- a/privacysandbox/activity/activity-client/src/androidTest/java/androidx/privacysandbox/activity/client/CreateSdkActivityLauncherTest.kt +++ b/privacysandbox/activity/activity-client/src/androidTest/java/androidx/privacysandbox/activity/client/CreateSdkActivityLauncherTest.kt
@@ -41,11 +41,9 @@ @SmallTest @SdkSuppress(minSdkVersion = Build.VERSION_CODES.UPSIDE_DOWN_CAKE, codeName = "UpsideDownCake") class CreateSdkActivityLauncherTest { - @get:Rule - var activityScenarioRule = ActivityScenarioRule(TestActivity::class.java) + @get:Rule var activityScenarioRule = ActivityScenarioRule(TestActivity::class.java) - @get:Rule - var intentsRule = IntentsRule() + @get:Rule var intentsRule = IntentsRule() private val sdkSandboxActivityMatcher = hasAction(`is`("android.app.sdksandbox.action.START_SANDBOXED_ACTIVITY"))
diff --git a/privacysandbox/activity/activity-client/src/main/java/androidx/privacysandbox/activity/client/SdkActivityLaunchers.kt b/privacysandbox/activity/activity-client/src/main/java/androidx/privacysandbox/activity/client/SdkActivityLaunchers.kt index 01e5c50..6b0d608 100644 --- a/privacysandbox/activity/activity-client/src/main/java/androidx/privacysandbox/activity/client/SdkActivityLaunchers.kt +++ b/privacysandbox/activity/activity-client/src/main/java/androidx/privacysandbox/activity/client/SdkActivityLaunchers.kt
@@ -40,29 +40,27 @@ * activity as a starting context. * * @param T the current activity from which new SDK activities will be launched. If this activity is - * destroyed any further SDK activity launches will simply be ignored. - * @param allowLaunch predicate called each time an activity is about to be launched by the - * SDK, the activity will only be launched if it returns true. + * destroyed any further SDK activity launches will simply be ignored. + * @param allowLaunch predicate called each time an activity is about to be launched by the SDK, the + * activity will only be launched if it returns true. */ -funT.createSdkActivityLauncher( - allowLaunch: () -> Boolean -): LocalSdkActivityLauncher- where T : Activity, T : LifecycleOwner { +fun T.createSdkActivityLauncher(allowLaunch: () -> Boolean): LocalSdkActivityLauncher +T : Activity, +T : LifecycleOwner { val cancellationJob = Job(parent = lifecycleScope.coroutineContext[Job]) - val launcher = LocalSdkActivityLauncherImpl( - activity = this, - allowLaunch = allowLaunch, - onDispose = { cancellationJob.cancel() }, - ) - cancellationJob.invokeOnCompletion { - launcher.dispose() - } + val launcher = + LocalSdkActivityLauncherImpl( + activity = this, + allowLaunch = allowLaunch, + onDispose = { cancellationJob.cancel() }, + ) + cancellationJob.invokeOnCompletion { launcher.dispose() } return launcher } /** - * Returns a [Bundle] with the information necessary to recreate this launcher. - * Possibly in a different process. + * Returns a [Bundle] with the information necessary to recreate this launcher. Possibly in a + * different process. */ fun SdkActivityLauncher.toLauncherInfo(): Bundle { val binderDelegate = SdkActivityLauncherBinderDelegate(this) @@ -102,17 +100,15 @@ private val stateReference: AtomicReferencewhere ?> = AtomicReference?>( - LocalLauncherState( - activity, - allowLaunch, - SdkSandboxManagerCompat.from(activity), - onDispose + LocalLauncherState( + activity, + allowLaunch, + SdkSandboxManagerCompat.from(activity), + onDispose + ) ) - ) - override suspend fun launchSdkActivity( - sdkActivityHandlerToken: IBinder - ): Boolean { + override suspend fun launchSdkActivity(sdkActivityHandlerToken: IBinder): Boolean { val state = stateReference.get() ?: return false return withContext(Dispatchers.Main.immediate) { state.run { @@ -126,9 +122,7 @@ } override fun dispose() { - stateReference.getAndSet(null)?.run { - onDispose() - } + stateReference.getAndSet(null)?.run { onDispose() } } } @@ -145,12 +139,13 @@ requireNotNull(callback) coroutineScope.launch { - val accepted = try { - launcher.launchSdkActivity(sdkActivityHandlerToken) - } catch (t: Throwable) { - callback.onLaunchError(t.message ?: "Unknown error launching SDK activity.") - return@launch - } + val accepted = + try { + launcher.launchSdkActivity(sdkActivityHandlerToken) + } catch (t: Throwable) { + callback.onLaunchError(t.message ?: "Unknown error launching SDK activity.") + return@launch + } if (accepted) { callback.onLaunchAccepted(sdkActivityHandlerToken)
diff --git a/privacysandbox/activity/activity-core/src/main/java/androidx/privacysandbox/activity/core/ProtocolConstants.kt b/privacysandbox/activity/activity-core/src/main/java/androidx/privacysandbox/activity/core/ProtocolConstants.kt index b0936c5..3cef90e 100644 --- a/privacysandbox/activity/activity-core/src/main/java/androidx/privacysandbox/activity/core/ProtocolConstants.kt +++ b/privacysandbox/activity/activity-core/src/main/java/androidx/privacysandbox/activity/core/ProtocolConstants.kt
@@ -20,8 +20,8 @@ /** * Constants shared between Activity library artifacts to establish an IPC protocol across library - * versions. Adding new constants is allowed, but **never change the value of a constant** or - * you'll break compatibility between library versions. + * versions. Adding new constants is allowed, but **never change the value of a constant** or you'll + * break compatibility between library versions. */ @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP) object ProtocolConstants {
diff --git a/privacysandbox/activity/activity-core/src/main/java/androidx/privacysandbox/activity/core/SdkActivityLauncher.kt b/privacysandbox/activity/activity-core/src/main/java/androidx/privacysandbox/activity/core/SdkActivityLauncher.kt index 9b3f4da..99dddac 100644 --- a/privacysandbox/activity/activity-core/src/main/java/androidx/privacysandbox/activity/core/SdkActivityLauncher.kt +++ b/privacysandbox/activity/activity-core/src/main/java/androidx/privacysandbox/activity/core/SdkActivityLauncher.kt
@@ -22,12 +22,12 @@ * Interface that allows SDKs running in the Privacy Sandbox to launch activities. * * Apps can create launchers by calling - * [createActivityLauncher][androidx.privacysandbox.activity.client.createSdkActivityLauncher] - * from one of their activities. + * [createActivityLauncher][androidx.privacysandbox.activity.client.createSdkActivityLauncher] from + * one of their activities. * * To send an [SdkActivityLauncher] to another process, they can call - * [toLauncherInfo][androidx.privacysandbox.activity.client.toLauncherInfo] - * and send the resulting bundle. + * [toLauncherInfo][androidx.privacysandbox.activity.client.toLauncherInfo] and send the resulting + * bundle. * * SDKs can create launchers from an app-provided bundle by calling * [fromLauncherInfo][androidx.privacysandbox.activity.provider.SdkActivityLauncherFactory.fromLauncherInfo].
diff --git a/privacysandbox/activity/activity-provider/src/androidTest/java/androidx/privacysandbox/activity/provider/SdkActivityLauncherBundlingTest.kt b/privacysandbox/activity/activity-provider/src/androidTest/java/androidx/privacysandbox/activity/provider/SdkActivityLauncherBundlingTest.kt index 4659813..2b9365d 100644 --- a/privacysandbox/activity/activity-provider/src/androidTest/java/androidx/privacysandbox/activity/provider/SdkActivityLauncherBundlingTest.kt +++ b/privacysandbox/activity/activity-provider/src/androidTest/java/androidx/privacysandbox/activity/provider/SdkActivityLauncherBundlingTest.kt
@@ -63,8 +63,7 @@ var tokensReceived = mutableListOf() - override suspend fun launchSdkActivity(sdkActivityHandlerToken: IBinder): - Boolean { + override suspend fun launchSdkActivity(sdkActivityHandlerToken: IBinder): Boolean { tokensReceived.add(sdkActivityHandlerToken) return allowActivityLaunches }
diff --git a/privacysandbox/activity/activity-provider/src/main/java/androidx/privacysandbox/activity/provider/SdkActivityLauncherFactory.kt b/privacysandbox/activity/activity-provider/src/main/java/androidx/privacysandbox/activity/provider/SdkActivityLauncherFactory.kt index c6ae8f1..78ef7cf 100644 --- a/privacysandbox/activity/activity-provider/src/main/java/androidx/privacysandbox/activity/provider/SdkActivityLauncherFactory.kt +++ b/privacysandbox/activity/activity-provider/src/main/java/androidx/privacysandbox/activity/provider/SdkActivityLauncherFactory.kt
@@ -31,22 +31,23 @@ /** * Creates a [SdkActivityLauncher] using the given [launcherInfo] Bundle. * - * You can create such a Bundle by calling [toLauncherInfo][androidx.privacysandbox.activity.client.toLauncherInfo]. - * A [launcherInfo] is expected to have a valid SdkActivityLauncher Binder with - * `"sdkActivityLauncherBinderKey"` for a key, [IllegalArgumentException] is thrown otherwise. + * You can create such a Bundle by calling + * [toLauncherInfo][androidx.privacysandbox.activity.client.toLauncherInfo]. A [launcherInfo] is + * expected to have a valid SdkActivityLauncher Binder with `"sdkActivityLauncherBinderKey"` for + * a key, [IllegalArgumentException] is thrown otherwise. */ @JvmStatic fun fromLauncherInfo(launcherInfo: Bundle): SdkActivityLauncher { - val remote: ISdkActivityLauncher? = ISdkActivityLauncher.Stub.asInterface( - launcherInfo.getBinder(SDK_ACTIVITY_LAUNCHER_BINDER_KEY) - ) + val remote: ISdkActivityLauncher? = + ISdkActivityLauncher.Stub.asInterface( + launcherInfo.getBinder(SDK_ACTIVITY_LAUNCHER_BINDER_KEY) + ) requireNotNull(remote) { "Invalid SdkActivityLauncher info bundle." } return SdkActivityLauncherProxy(remote) } - private class SdkActivityLauncherProxy( - private val remote: ISdkActivityLauncher - ) : SdkActivityLauncher { + private class SdkActivityLauncherProxy(private val remote: ISdkActivityLauncher) : + SdkActivityLauncher { override suspend fun launchSdkActivity(sdkActivityHandlerToken: IBinder): Boolean = suspendCancellableCoroutine { remote.launchSdkActivity( @@ -63,7 +64,8 @@ override fun onLaunchError(message: String?) { it.resumeWithException(RuntimeException(message)) } - }) + } + ) } } }
diff --git a/privacysandbox/ads/ads-adservices-java/src/androidTest/java/androidx/privacysandbox/ads/adservices/java/adid/AdIdManagerFuturesTest.kt b/privacysandbox/ads/ads-adservices-java/src/androidTest/java/androidx/privacysandbox/ads/adservices/java/adid/AdIdManagerFuturesTest.kt index e2e0c9d..dcf44e7d 100644 --- a/privacysandbox/ads/ads-adservices-java/src/androidTest/java/androidx/privacysandbox/ads/adservices/java/adid/AdIdManagerFuturesTest.kt +++ b/privacysandbox/ads/ads-adservices-java/src/androidTest/java/androidx/privacysandbox/ads/adservices/java/adid/AdIdManagerFuturesTest.kt
@@ -64,9 +64,8 @@ if (mValidAdExtServicesSdkExtVersionS || mValidAdExtServicesSdkExtVersionR) { // setup a mockitoSession to return the mocked manager // when the static method .get() is called - mSession = ExtendedMockito.mockitoSession() - .mockStatic(AdIdManager::class.java) - .startMocking() + mSession = + ExtendedMockito.mockitoSession().mockStatic(AdIdManager::class.java).startMocking() } } @@ -78,27 +77,34 @@ @Test @SdkSuppress(maxSdkVersion = 33, minSdkVersion = 30) fun testAdIdOlderVersions() { - Assume.assumeFalse("maxSdkVersion = API 33 ext 3 or API 31/32 ext 8 or API 30 ext 10", + Assume.assumeFalse( + "maxSdkVersion = API 33 ext 3 or API 31/32 ext 8 or API 30 ext 10", VersionCompatUtil.isTestableVersion( /* minAdServicesVersion=*/ 4, /* minExtServicesVersionS=*/ 9, - /* minExtServicesVersionR=*/ 11)) + /* minExtServicesVersionR=*/ 11 + ) + ) Truth.assertThat(AdIdManagerFutures.from(mContext)).isEqualTo(null) } @Test fun testAdIdAsync() { - Assume.assumeTrue("minSdkVersion = API 33 ext 4 or API 31/32 ext 9 or API 30 ext 11", + Assume.assumeTrue( + "minSdkVersion = API 33 ext 4 or API 31/32 ext 9 or API 30 ext 11", VersionCompatUtil.isTestableVersion( /* minAdServicesVersion= */ 4, /* minExtServicesVersionS=*/ 9, - /* minExtServicesVersionR=*/ 11)) - - val adIdManager = mockAdIdManager( - mContext, - mValidAdExtServicesSdkExtVersionS || mValidAdExtServicesSdkExtVersionR + /* minExtServicesVersionR=*/ 11 + ) ) + val adIdManager = + mockAdIdManager( + mContext, + mValidAdExtServicesSdkExtVersionS || mValidAdExtServicesSdkExtVersionR + ) + when (mValidAdExtServicesSdkExtVersionR) { true -> setupResponseR(adIdManager) false -> setupResponseSPlus(adIdManager) @@ -122,18 +128,13 @@ companion object { private lateinit var mContext: Context - private fun mockAdIdManager( - spyContext: Context, - isExtServices: Boolean - ): AdIdManager { + private fun mockAdIdManager(spyContext: Context, isExtServices: Boolean): AdIdManager { val adIdManager = Mockito.mock(AdIdManager::class.java) // mock the .get() method if using extServices version, otherwise mock getSystemService if (isExtServices) { - `when`(AdIdManager.get(any())) - .thenReturn(adIdManager) + `when`(AdIdManager.get(any())).thenReturn(adIdManager) } else { - `when`(spyContext.getSystemService( - AdIdManager::class.java)).thenReturn(adIdManager) + `when`(spyContext.getSystemService(AdIdManager::class.java)).thenReturn(adIdManager) } return adIdManager } @@ -143,13 +144,14 @@ val adId = android.adservices.adid.AdId("1234", false) val answer = { args: InvocationOnMock -> assertNotEquals(Looper.getMainLooper(), Looper.myLooper()) - val receiver = args.getArgument< - OutcomeReceiver>(1) + val receiver = + args.getArgument>(1) receiver.onResult(adId) null } Mockito.doAnswer(answer) - .`when`(adIdManager).getAdId( + .`when`(adIdManager) + .getAdId( any(), any>() ) @@ -160,13 +162,18 @@ val adId = android.adservices.adid.AdId("1234", false) val answer = { args: InvocationOnMock -> assertNotEquals(Looper.getMainLooper(), Looper.myLooper()) - val receiver = args.getArgument< - AdServicesOutcomeReceiver>(1) + val receiver = + args.getArgument< + AdServicesOutcomeReceiver+ >( + 1 + ) receiver.onResult(adId) null } Mockito.doAnswer(answer) - .`when`(adIdManager).getAdId( + .`when`(adIdManager) + .getAdId( any (), any>() ) @@ -174,18 +181,20 @@ private fun verifyOnR(adIdManager: AdIdManager) { // Verify that the compat code was invoked correctly. - Mockito.verify(adIdManager).getAdId( - any(), - any>() - ) + Mockito.verify(adIdManager) + .getAdId( + any(), + any>() + ) } private fun verifyOnSPlus(adIdManager: AdIdManager) { // Verify that the compat code was invoked correctly. - Mockito.verify(adIdManager).getAdId( - any(), - any>() - ) + Mockito.verify(adIdManager) + .getAdId( + any(), + any>() + ) } private fun verifyResponse(adId: androidx.privacysandbox.ads.adservices.adid.AdId) {
diff --git a/privacysandbox/ads/ads-adservices-java/src/androidTest/java/androidx/privacysandbox/ads/adservices/java/adselection/AdSelectionManagerFuturesTest.kt b/privacysandbox/ads/ads-adservices-java/src/androidTest/java/androidx/privacysandbox/ads/adservices/java/adselection/AdSelectionManagerFuturesTest.kt index e7f6741..0710cc3 100644 --- a/privacysandbox/ads/ads-adservices-java/src/androidTest/java/androidx/privacysandbox/ads/adservices/java/adselection/AdSelectionManagerFuturesTest.kt +++ b/privacysandbox/ads/ads-adservices-java/src/androidTest/java/androidx/privacysandbox/ads/adservices/java/adselection/AdSelectionManagerFuturesTest.kt
@@ -79,10 +79,11 @@ if (mValidAdExtServicesSdkExtVersion) { // setup a mockitoSession to return the mocked manager // when the static method .get() is called - mSession = ExtendedMockito.mockitoSession() - .mockStatic(android.adservices.adselection.AdSelectionManager::class.java) - .strictness(Strictness.LENIENT) - .startMocking() + mSession = + ExtendedMockito.mockitoSession() + .mockStatic(android.adservices.adselection.AdSelectionManager::class.java) + .strictness(Strictness.LENIENT) + .startMocking() } } @@ -94,10 +95,13 @@ @Test @SdkSuppress(maxSdkVersion = 34, minSdkVersion = 30) fun testAdSelectionOlderVersions() { - Assume.assumeFalse("maxSdkVersion = API 33/34 ext 3 or API 31/32 ext 8", + Assume.assumeFalse( + "maxSdkVersion = API 33/34 ext 3 or API 31/32 ext 8", VersionCompatUtil.isTestableVersion( /* minAdServicesVersion=*/ 4, - /* minExtServicesVersion=*/ 9)) + /* minExtServicesVersion=*/ 9 + ) + ) Truth.assertThat(from(mContext)).isEqualTo(null) } @@ -105,88 +109,109 @@ @SdkSuppress(maxSdkVersion = 34, minSdkVersion = 31) fun testUpdateAdCounterHistogramOlderVersions() { /* AdServices or ExtServices are present */ - Assume.assumeTrue("minSdkVersion = API 33 ext 4 or API 31/32 ext 9", - VersionCompatUtil.isTestableVersion( - /* minAdServicesVersion= */ 4, - /* minExtServicesVersion=*/ 9)) - - /* API is not available */ - Assume.assumeFalse("maxSdkVersion = API 33/34 ext 7 or API 31/32 ext 8", + Assume.assumeTrue( + "minSdkVersion = API 33 ext 4 or API 31/32 ext 9", VersionCompatUtil.isTestableVersion( - /* minAdServicesVersion=*/ 8, - /* minExtServicesVersion=*/ 9)) - - val managerCompat = from(mContext) - val updateAdCounterHistogramRequest = UpdateAdCounterHistogramRequest( - adSelectionId, - adEventType, - seller + /* minAdServicesVersion= */ 4, + /* minExtServicesVersion=*/ 9 + ) ) + /* API is not available */ + Assume.assumeFalse( + "maxSdkVersion = API 33/34 ext 7 or API 31/32 ext 8", + VersionCompatUtil.isTestableVersion( + /* minAdServicesVersion=*/ 8, + /* minExtServicesVersion=*/ 9 + ) + ) + + val managerCompat = from(mContext) + val updateAdCounterHistogramRequest = + UpdateAdCounterHistogramRequest(adSelectionId, adEventType, seller) + // Verify that it throws an exception - val exception = assertThrows(ExecutionException::class.java) { - managerCompat!!.updateAdCounterHistogramAsync(updateAdCounterHistogramRequest).get() - }.hasCauseThat() + val exception = + assertThrows(ExecutionException::class.java) { + managerCompat!! + .updateAdCounterHistogramAsync(updateAdCounterHistogramRequest) + .get() + } + .hasCauseThat() exception.isInstanceOf(UnsupportedOperationException::class.java) - exception.hasMessageThat().contains("API is unsupported. Min version is API 33 ext 8 or " + - "API 31/32 ext 9") + exception + .hasMessageThat() + .contains("API is unsupported. Min version is API 33 ext 8 or " + "API 31/32 ext 9") } @Test @SdkSuppress(maxSdkVersion = 34, minSdkVersion = 31) fun testReportEventOlderVersions() { /* AdServices or ExtServices are present */ - Assume.assumeTrue("minSdkVersion = API 33 ext 4 or API 31/32 ext 9", - VersionCompatUtil.isTestableVersion( - /* minAdServicesVersion= */ 4, - /* minExtServicesVersion=*/ 9)) - - /* API is not available */ - Assume.assumeFalse("maxSdkVersion = API 33/34 ext 7 or API 31/32 ext 8", + Assume.assumeTrue( + "minSdkVersion = API 33 ext 4 or API 31/32 ext 9", VersionCompatUtil.isTestableVersion( - /* minAdServicesVersion=*/ 8, - /* minExtServicesVersion=*/ 9)) - - val managerCompat = from(mContext) - val reportEventRequest = ReportEventRequest( - adSelectionId, - eventKey, - eventData, - reportingDestinations + /* minAdServicesVersion= */ 4, + /* minExtServicesVersion=*/ 9 + ) ) + /* API is not available */ + Assume.assumeFalse( + "maxSdkVersion = API 33/34 ext 7 or API 31/32 ext 8", + VersionCompatUtil.isTestableVersion( + /* minAdServicesVersion=*/ 8, + /* minExtServicesVersion=*/ 9 + ) + ) + + val managerCompat = from(mContext) + val reportEventRequest = + ReportEventRequest(adSelectionId, eventKey, eventData, reportingDestinations) + // Verify that it throws an exception - val exception = assertThrows(ExecutionException::class.java) { - managerCompat!!.reportEventAsync(reportEventRequest).get() - }.hasCauseThat() + val exception = + assertThrows(ExecutionException::class.java) { + managerCompat!!.reportEventAsync(reportEventRequest).get() + } + .hasCauseThat() exception.isInstanceOf(UnsupportedOperationException::class.java) - exception.hasMessageThat().contains("API is unsupported. Min version is API 33 ext 8 or " + - "API 31/32 ext 9") + exception + .hasMessageThat() + .contains("API is unsupported. Min version is API 33 ext 8 or " + "API 31/32 ext 9") } @Test @SdkSuppress(maxSdkVersion = 34, minSdkVersion = 31) fun testGetAdSelectionDataOlderVersions() { /* AdServices or ExtServices are present */ - Assume.assumeTrue("minSdkVersion = API 33 ext 4 or API 31/32 ext 9", - VersionCompatUtil.isTestableVersion( - /* minAdServicesVersion= */ 4, - /* minExtServicesVersion=*/ 9)) + Assume.assumeTrue( + "minSdkVersion = API 33 ext 4 or API 31/32 ext 9", + VersionCompatUtil.isTestableVersion( + /* minAdServicesVersion= */ 4, + /* minExtServicesVersion=*/ 9 + ) + ) /* API is not available */ - Assume.assumeFalse("maxSdkVersion = API 31-34 ext 9", + Assume.assumeFalse( + "maxSdkVersion = API 31-34 ext 9", VersionCompatUtil.isTestableVersion( /* minAdServicesVersion=*/ 10, - /* minExtServicesVersion=*/ 10)) + /* minExtServicesVersion=*/ 10 + ) + ) mockAdSelectionManager(mContext, mValidAdExtServicesSdkExtVersion) val managerCompat = from(mContext) val getAdSelectionDataRequest = GetAdSelectionDataRequest(seller) // Verify that it throws an exception - val exception = assertThrows(ExecutionException::class.java) { - managerCompat!!.getAdSelectionDataAsync(getAdSelectionDataRequest).get() - }.hasCauseThat() + val exception = + assertThrows(ExecutionException::class.java) { + managerCompat!!.getAdSelectionDataAsync(getAdSelectionDataRequest).get() + } + .hasCauseThat() exception.isInstanceOf(UnsupportedOperationException::class.java) exception.hasMessageThat().contains("API is not available. Min version is API 31 ext 10") } @@ -195,28 +220,35 @@ @SdkSuppress(maxSdkVersion = 34, minSdkVersion = 31) fun testPersistAdSelectionResultOlderVersions() { /* AdServices or ExtServices are present */ - Assume.assumeTrue("minSdkVersion = API 33 ext 4 or API 31/32 ext 9", - VersionCompatUtil.isTestableVersion( - /* minAdServicesVersion= */ 4, - /* minExtServicesVersion=*/ 9)) + Assume.assumeTrue( + "minSdkVersion = API 33 ext 4 or API 31/32 ext 9", + VersionCompatUtil.isTestableVersion( + /* minAdServicesVersion= */ 4, + /* minExtServicesVersion=*/ 9 + ) + ) /* API is not available */ - Assume.assumeFalse("maxSdkVersion = API 31-34 ext 9", + Assume.assumeFalse( + "maxSdkVersion = API 31-34 ext 9", VersionCompatUtil.isTestableVersion( /* minAdServicesVersion=*/ 10, - /* minExtServicesVersion=*/ 10)) + /* minExtServicesVersion=*/ 10 + ) + ) mockAdSelectionManager(mContext, mValidAdExtServicesSdkExtVersion) val managerCompat = from(mContext) - val persistAdSelectionResultRequest = PersistAdSelectionResultRequest( - adSelectionId, - seller, - adSelectionData - ) + val persistAdSelectionResultRequest = + PersistAdSelectionResultRequest(adSelectionId, seller, adSelectionData) // Verify that it throws an exception - val exception = assertThrows(ExecutionException::class.java) { - managerCompat!!.persistAdSelectionResultAsync(persistAdSelectionResultRequest).get() - }.hasCauseThat() + val exception = + assertThrows(ExecutionException::class.java) { + managerCompat!! + .persistAdSelectionResultAsync(persistAdSelectionResultRequest) + .get() + } + .hasCauseThat() exception.isInstanceOf(UnsupportedOperationException::class.java) exception.hasMessageThat().contains("API is not available. Min version is API 31 ext 10") } @@ -225,62 +257,82 @@ @SdkSuppress(maxSdkVersion = 34, minSdkVersion = 31) fun testReportImpressionOlderVersions() { /* AdServices or ExtServices are present */ - Assume.assumeTrue("minSdkVersion = API 33 ext 4 or API 31/32 ext 9", - VersionCompatUtil.isTestableVersion( - /* minAdServicesVersion= */ 4, - /* minExtServicesVersion=*/ 9)) + Assume.assumeTrue( + "minSdkVersion = API 33 ext 4 or API 31/32 ext 9", + VersionCompatUtil.isTestableVersion( + /* minAdServicesVersion= */ 4, + /* minExtServicesVersion=*/ 9 + ) + ) /* API is not available */ - Assume.assumeFalse("maxSdkVersion = API 31-34 ext 9", + Assume.assumeFalse( + "maxSdkVersion = API 31-34 ext 9", VersionCompatUtil.isTestableVersion( /* minAdServicesVersion=*/ 10, - /* minExtServicesVersion=*/ 10)) + /* minExtServicesVersion=*/ 10 + ) + ) mockAdSelectionManager(mContext, mValidAdExtServicesSdkExtVersion) val managerCompat = from(mContext) val reportImpressionRequest = ReportImpressionRequest(adSelectionId) // Verify that it throws an exception - val exception = assertThrows(ExecutionException::class.java) { - managerCompat!!.reportImpressionAsync(reportImpressionRequest).get() - }.hasCauseThat() + val exception = + assertThrows(ExecutionException::class.java) { + managerCompat!!.reportImpressionAsync(reportImpressionRequest).get() + } + .hasCauseThat() exception.isInstanceOf(UnsupportedOperationException::class.java) - exception.hasMessageThat().contains("adSelectionConfig is mandatory for" + - "API versions lower than ext 10") + exception + .hasMessageThat() + .contains("adSelectionConfig is mandatory for" + "API versions lower than ext 10") } @Test @SdkSuppress(maxSdkVersion = 34, minSdkVersion = 31) fun testSelectAdsFromOutcomesOlderVersions() { /* AdServices or ExtServices are present */ - Assume.assumeTrue("minSdkVersion = API 33 ext 4 or API 31/32 ext 9", + Assume.assumeTrue( + "minSdkVersion = API 33 ext 4 or API 31/32 ext 9", VersionCompatUtil.isTestableVersion( /* minAdServicesVersion= */ 4, - /* minExtServicesVersion=*/ 9)) + /* minExtServicesVersion=*/ 9 + ) + ) /* API is not available */ - Assume.assumeFalse("maxSdkVersion = API 31-34 ext 9", + Assume.assumeFalse( + "maxSdkVersion = API 31-34 ext 9", VersionCompatUtil.isTestableVersion( /* minAdServicesVersion=*/ 10, - /* minExtServicesVersion=*/ 10)) + /* minExtServicesVersion=*/ 10 + ) + ) mockAdSelectionManager(mContext, mValidAdExtServicesSdkExtVersion) val managerCompat = from(mContext) // Verify that it throws an exception - val exception = assertThrows(ExecutionException::class.java) { - managerCompat!!.selectAdsAsync(adSelectionFromOutcomesConfig).get() - }.hasCauseThat() + val exception = + assertThrows(ExecutionException::class.java) { + managerCompat!!.selectAdsAsync(adSelectionFromOutcomesConfig).get() + } + .hasCauseThat() exception.isInstanceOf(UnsupportedOperationException::class.java) exception.hasMessageThat().contains("API is not available. Min version is API 31 ext 10") } @Test fun testSelectAds() { - Assume.assumeTrue("minSdkVersion = API 33 ext 4 or API 31/32 ext 9", + Assume.assumeTrue( + "minSdkVersion = API 33 ext 4 or API 31/32 ext 9", VersionCompatUtil.isTestableVersion( /* minAdServicesVersion= */ 4, - /* minExtServicesVersion=*/ 9)) + /* minExtServicesVersion=*/ 9 + ) + ) val adSelectionManager = mockAdSelectionManager(mContext, mValidAdExtServicesSdkExtVersion) setupAdSelectionResponse(adSelectionManager) @@ -294,8 +346,8 @@ verifyResponse(result.get()) // Verify that the compat code was invoked correctly. - val captor = ArgumentCaptor.forClass( - android.adservices.adselection.AdSelectionConfig::class.java) + val captor = + ArgumentCaptor.forClass(android.adservices.adselection.AdSelectionConfig::class.java) verify(adSelectionManager).selectAds(captor.capture(), any(), any()) // Verify that the request that the compat code makes to the platform is correct. @@ -304,10 +356,13 @@ @Test fun testSelectAdsFromOutcomes() { - Assume.assumeTrue("minSdkVersion = API 31 ext 10", + Assume.assumeTrue( + "minSdkVersion = API 31 ext 10", VersionCompatUtil.isTestableVersion( /* minAdServicesVersion= */ 10, - /* minExtServicesVersion=*/ 10)) + /* minExtServicesVersion=*/ 10 + ) + ) val adSelectionManager = mockAdSelectionManager(mContext, mValidAdExtServicesSdkExtVersion) setupAdSelectionFromOutcomesResponse(adSelectionManager) @@ -321,8 +376,10 @@ verifyResponse(result.get()) // Verify that the compat code was invoked correctly. - val captor = ArgumentCaptor.forClass( - android.adservices.adselection.AdSelectionFromOutcomesConfig::class.java) + val captor = + ArgumentCaptor.forClass( + android.adservices.adselection.AdSelectionFromOutcomesConfig::class.java + ) verify(adSelectionManager).selectAds(captor.capture(), any(), any()) // Verify that the request that the compat code makes to the platform is correct. @@ -332,10 +389,13 @@ @Test @SuppressWarnings("NewApi") fun testReportImpression() { - Assume.assumeTrue("minSdkVersion = API 33 ext 4 or API 31/32 ext 9", + Assume.assumeTrue( + "minSdkVersion = API 33 ext 4 or API 31/32 ext 9", VersionCompatUtil.isTestableVersion( /* minAdServicesVersion= */ 4, - /* minExtServicesVersion=*/ 9)) + /* minExtServicesVersion=*/ 9 + ) + ) val adSelectionManager = mockAdSelectionManager(mContext, mValidAdExtServicesSdkExtVersion) setupAdSelectionResponse(adSelectionManager) @@ -346,8 +406,10 @@ managerCompat!!.reportImpressionAsync(reportImpressionRequest).get() // Verify that the compat code was invoked correctly. - val captor = ArgumentCaptor.forClass( - android.adservices.adselection.ReportImpressionRequest::class.java) + val captor = + ArgumentCaptor.forClass( + android.adservices.adselection.ReportImpressionRequest::class.java + ) verify(adSelectionManager).reportImpression(captor.capture(), any(), any()) // Verify that the request that the compat code makes to the platform is correct. @@ -356,19 +418,19 @@ @Test fun testUpdateAdCounterHistogram() { - Assume.assumeTrue("minSdkVersion = API 33 ext 8 or API 31/32 ext 9", + Assume.assumeTrue( + "minSdkVersion = API 33 ext 8 or API 31/32 ext 9", VersionCompatUtil.isTestableVersion( /* minAdServicesVersion= */ 8, - /* minExtServicesVersion=*/ 9)) + /* minExtServicesVersion=*/ 9 + ) + ) val adSelectionManager = mockAdSelectionManager(mContext, mValidAdExtServicesSdkExtVersion) setupUpdateAdCounterHistogramResponse(adSelectionManager) val managerCompat = from(mContext) - val updateAdCounterHistogramRequest = UpdateAdCounterHistogramRequest( - adSelectionId, - adEventType, - seller - ) + val updateAdCounterHistogramRequest = + UpdateAdCounterHistogramRequest(adSelectionId, adEventType, seller) // Actually invoke the compat code. runBlocking { @@ -376,8 +438,10 @@ } // Verify that the compat code was invoked correctly. - val captor = ArgumentCaptor.forClass( - android.adservices.adselection.UpdateAdCounterHistogramRequest::class.java) + val captor = + ArgumentCaptor.forClass( + android.adservices.adselection.UpdateAdCounterHistogramRequest::class.java + ) verify(adSelectionManager).updateAdCounterHistogram(captor.capture(), any(), any()) // Verify that the request that the compat code makes to the platform is correct. @@ -386,30 +450,32 @@ @Test fun testReportEvent() { - Assume.assumeTrue("minSdkVersion = API 33 ext 8 or API 31/32 ext 9", + Assume.assumeTrue( + "minSdkVersion = API 33 ext 8 or API 31/32 ext 9", VersionCompatUtil.isTestableVersion( /* minAdServicesVersion= */ 8, - /* minExtServicesVersion=*/ 9)) + /* minExtServicesVersion=*/ 9 + ) + ) val adSelectionManager = mockAdSelectionManager(mContext, mValidAdExtServicesSdkExtVersion) setupReportEventResponse(adSelectionManager) val managerCompat = from(mContext) - val reportEventRequest = ReportEventRequest( - adSelectionId, - eventKey, - eventData, - reportingDestinations, - inputEvent - ) + val reportEventRequest = + ReportEventRequest( + adSelectionId, + eventKey, + eventData, + reportingDestinations, + inputEvent + ) // Actually invoke the compat code. - runBlocking { - managerCompat!!.reportEventAsync(reportEventRequest) - } + runBlocking { managerCompat!!.reportEventAsync(reportEventRequest) } // Verify that the compat code was invoked correctly. - val captor = ArgumentCaptor.forClass( - android.adservices.adselection.ReportEventRequest::class.java) + val captor = + ArgumentCaptor.forClass(android.adservices.adselection.ReportEventRequest::class.java) verify(adSelectionManager).reportEvent(captor.capture(), any(), any()) // Verify that the request that the compat code makes to the platform is correct. @@ -418,20 +484,20 @@ @Test fun testPersistAdSelectionResult() { - Assume.assumeTrue("minSdkVersion = API 31 ext 10", + Assume.assumeTrue( + "minSdkVersion = API 31 ext 10", VersionCompatUtil.isTestableVersion( /* minAdServicesVersion= */ 10, - /* minExtServicesVersion=*/ 10)) + /* minExtServicesVersion=*/ 10 + ) + ) val adSelectionManager = mockAdSelectionManager(mContext, mValidAdExtServicesSdkExtVersion) setupGetAdSelectionResponse(adSelectionManager) val managerCompat = from(mContext) - val persistAdSelectionResultRequest = PersistAdSelectionResultRequest( - adSelectionId, - seller, - adSelectionData - ) + val persistAdSelectionResultRequest = + PersistAdSelectionResultRequest(adSelectionId, seller, adSelectionData) // Actually invoke the compat code. val result = runBlocking { @@ -439,8 +505,10 @@ } // Verify that the compat code was invoked correctly. - val captor = ArgumentCaptor.forClass( - android.adservices.adselection.PersistAdSelectionResultRequest::class.java) + val captor = + ArgumentCaptor.forClass( + android.adservices.adselection.PersistAdSelectionResultRequest::class.java + ) verify(adSelectionManager).persistAdSelectionResult(captor.capture(), any(), any()) // Verify that the request that the compat code makes to the platform is correct. @@ -466,14 +534,16 @@ private val perBuyerSignals: Map= mutableMapOf(Pair(seller, sellerSignals)) private val trustedScoringSignalsUri: Uri = Uri.parse("www.xyz.com") - private val adSelectionConfig = AdSelectionConfig( - seller, - decisionLogicUri, - customAudienceBuyers, - adSelectionSignals, - sellerSignals, - perBuyerSignals, - trustedScoringSignalsUri) + private val adSelectionConfig = + AdSelectionConfig( + seller, + decisionLogicUri, + customAudienceBuyers, + adSelectionSignals, + sellerSignals, + perBuyerSignals, + trustedScoringSignalsUri + ) private const val adEventType = FrequencyCapFilters.AD_EVENT_TYPE_VIEW private const val eventKey = "click" private const val eventData = "{\"key\":\"value\"}" @@ -483,12 +553,13 @@ private val inputEvent: InputEvent = KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_1) private val adSelectionIds: List= listOf(10, 11, 12) private val selectionLogicUri: Uri = Uri.parse("www.abc.com") - private val adSelectionFromOutcomesConfig = AdSelectionFromOutcomesConfig( - seller, - adSelectionIds, - adSelectionSignals, - selectionLogicUri - ) + private val adSelectionFromOutcomesConfig = + AdSelectionFromOutcomesConfig( + seller, + adSelectionIds, + adSelectionSignals, + selectionLogicUri + ) // Response. private val renderUri = Uri.parse("render-uri.com") @@ -504,8 +575,11 @@ `when`(android.adservices.adselection.AdSelectionManager.get(any())) .thenReturn(adSelectionManager) } else { - `when`(spyContext.getSystemService( - android.adservices.adselection.AdSelectionManager::class.java)) + `when`( + spyContext.getSystemService( + android.adservices.adselection.AdSelectionManager::class.java + ) + ) .thenReturn(adSelectionManager) } return adSelectionManager @@ -516,22 +590,27 @@ ) { // Set up the response that AdSelectionManager will return when the compat code calls // it. - val response = android.adservices.adselection.AdSelectionOutcome.Builder() - .setAdSelectionId(adSelectionId) - .setRenderUri(renderUri) - .build() + val response = + android.adservices.adselection.AdSelectionOutcome.Builder() + .setAdSelectionId(adSelectionId) + .setRenderUri(renderUri) + .build() val answer = { args: InvocationOnMock -> - val receiver = args.getArgument- android.adservices.adselection.AdSelectionOutcome, Exception>>(2) + val receiver = + args.getArgument< + OutcomeReceiver< + android.adservices.adselection.AdSelectionOutcome, + Exception + > + >( + 2 + ) receiver.onResult(response) null } doAnswer(answer) - .`when`(adSelectionManager).selectAds( - any (), - any(), - any() - ) + .`when`(adSelectionManager) + .selectAds(any(), any(), any()) val answer2 = { args: InvocationOnMock -> val receiver = args.getArgument>(2) @@ -546,18 +625,27 @@ ) { // Set up the response that AdSelectionManager will return when the compat code calls // it. - val response = android.adservices.adselection.AdSelectionOutcome.Builder() - .setAdSelectionId(adSelectionId) - .setRenderUri(renderUri) - .build() + val response = + android.adservices.adselection.AdSelectionOutcome.Builder() + .setAdSelectionId(adSelectionId) + .setRenderUri(renderUri) + .build() val answer = { args: InvocationOnMock -> - val receiver = args.getArgument- android.adservices.adselection.AdSelectionOutcome, Exception>>(2) + val receiver = + args.getArgument< + OutcomeReceiver< + android.adservices.adselection.AdSelectionOutcome, + Exception + > + >( + 2 + ) receiver.onResult(response) null } doAnswer(answer) - .`when`(adSelectionManager).selectAds( + .`when`(adSelectionManager) + .selectAds( any (), any(), any() @@ -575,11 +663,8 @@ null } doAnswer(answer) - .`when`(adSelectionManager).updateAdCounterHistogram( - any(), - any(), - any() - ) + .`when`(adSelectionManager) + .updateAdCounterHistogram(any(), any(), any()) } private fun setupReportEventResponse( @@ -592,12 +677,7 @@ receiver.onResult(Object()) null } - doAnswer(answer) - .`when`(adSelectionManager).reportEvent( - any(), - any(), - any() - ) + doAnswer(answer).`when`(adSelectionManager).reportEvent(any(), any(), any()) } private fun setupGetAdSelectionResponse( @@ -605,18 +685,27 @@ ) { // There is no way to create a GetAdSelectionDataOutcome instance outside of adservices - val response2 = android.adservices.adselection.AdSelectionOutcome.Builder() - .setAdSelectionId(adSelectionId) - .setRenderUri(renderUri) - .build() + val response2 = + android.adservices.adselection.AdSelectionOutcome.Builder() + .setAdSelectionId(adSelectionId) + .setRenderUri(renderUri) + .build() val answer2 = { args: InvocationOnMock -> - val receiver = args.getArgument- android.adservices.adselection.AdSelectionOutcome, Exception>>(2) + val receiver = + args.getArgument< + OutcomeReceiver< + android.adservices.adselection.AdSelectionOutcome, + Exception + > + >( + 2 + ) receiver.onResult(response2) null } doAnswer(answer2) - .`when`(adSelectionManager).persistAdSelectionResult(any(), any(), any()) + .`when`(adSelectionManager) + .persistAdSelectionResult(any(), any(), any()) } private fun verifyRequest(request: android.adservices.adselection.AdSelectionConfig) { @@ -635,13 +724,8 @@ Assert.assertEquals(expectedRequest, request) } - private fun verifyResponse( - outcome: AdSelectionOutcome - ) { - val expectedOutcome = - AdSelectionOutcome( - adSelectionId, - renderUri) + private fun verifyResponse(outcome: AdSelectionOutcome) { + val expectedOutcome = AdSelectionOutcome(adSelectionId, renderUri) Assert.assertEquals(expectedOutcome, outcome) } @@ -650,15 +734,24 @@ val adTechIdentifier = android.adservices.common.AdTechIdentifier.fromString(adId) return android.adservices.adselection.AdSelectionConfig.Builder() .setAdSelectionSignals( - android.adservices.common.AdSelectionSignals.fromString(adSelectionSignalsStr)) + android.adservices.common.AdSelectionSignals.fromString(adSelectionSignalsStr) + ) .setCustomAudienceBuyers(listOf(adTechIdentifier)) .setDecisionLogicUri(decisionLogicUri) - .setPerBuyerSignals(mutableMapOf(Pair( - adTechIdentifier, - android.adservices.common.AdSelectionSignals.fromString(sellerSignalsStr)))) + .setPerBuyerSignals( + mutableMapOf( + Pair( + adTechIdentifier, + android.adservices.common.AdSelectionSignals.fromString( + sellerSignalsStr + ) + ) + ) + ) .setSeller(adTechIdentifier) .setSellerSignals( - android.adservices.common.AdSelectionSignals.fromString(sellerSignalsStr)) + android.adservices.common.AdSelectionSignals.fromString(sellerSignalsStr) + ) .setTrustedScoringSignalsUri(trustedScoringSignalsUri) .build() } @@ -679,9 +772,11 @@ private fun verifyReportImpressionRequest( request: android.adservices.adselection.ReportImpressionRequest ) { - val expectedRequest = android.adservices.adselection.ReportImpressionRequest( - adSelectionId, - getPlatformAdSelectionConfig()) + val expectedRequest = + android.adservices.adselection.ReportImpressionRequest( + adSelectionId, + getPlatformAdSelectionConfig() + ) Assert.assertEquals(expectedRequest.adSelectionId, request.adSelectionId) Assert.assertEquals(expectedRequest.adSelectionConfig, request.adSelectionConfig) } @@ -690,9 +785,13 @@ request: android.adservices.adselection.UpdateAdCounterHistogramRequest ) { val adTechIdentifier = android.adservices.common.AdTechIdentifier.fromString(adId) - val expectedRequest = android.adservices.adselection.UpdateAdCounterHistogramRequest - .Builder(adSelectionId, adEventType, adTechIdentifier) - .build() + val expectedRequest = + android.adservices.adselection.UpdateAdCounterHistogramRequest.Builder( + adSelectionId, + adEventType, + adTechIdentifier + ) + .build() Assert.assertEquals(expectedRequest, request) } @@ -700,40 +799,42 @@ request: android.adservices.adselection.ReportEventRequest ) { val checkInputEvent = VersionCompatUtil.isTestableVersion(10, 10) - val expectedRequestBuilder = android.adservices.adselection.ReportEventRequest.Builder( - adSelectionId, - eventKey, - eventData, - reportingDestinations) + val expectedRequestBuilder = + android.adservices.adselection.ReportEventRequest.Builder( + adSelectionId, + eventKey, + eventData, + reportingDestinations + ) - if (checkInputEvent) - expectedRequestBuilder.setInputEvent(inputEvent) + if (checkInputEvent) expectedRequestBuilder.setInputEvent(inputEvent) val expectedRequest = expectedRequestBuilder.build() Assert.assertEquals(expectedRequest.adSelectionId, request.adSelectionId) Assert.assertEquals(expectedRequest.key, request.key) Assert.assertEquals(expectedRequest.data, request.data) - Assert.assertEquals(expectedRequest.reportingDestinations, - request.reportingDestinations) - if (checkInputEvent) - Assert.assertEquals(expectedRequest.inputEvent, - request.inputEvent) + Assert.assertEquals( + expectedRequest.reportingDestinations, + request.reportingDestinations + ) + if (checkInputEvent) Assert.assertEquals(expectedRequest.inputEvent, request.inputEvent) } private fun verifyPersistAdSelectionResultRequest( request: android.adservices.adselection.PersistAdSelectionResultRequest ) { val adTechIdentifier = android.adservices.common.AdTechIdentifier.fromString(adId) - val expectedRequest = android.adservices.adselection.PersistAdSelectionResultRequest - .Builder() - .setAdSelectionId(adSelectionId) - .setSeller(adTechIdentifier) - .setAdSelectionResult(adSelectionData) - .build() + val expectedRequest = + android.adservices.adselection.PersistAdSelectionResultRequest.Builder() + .setAdSelectionId(adSelectionId) + .setSeller(adTechIdentifier) + .setAdSelectionResult(adSelectionData) + .build() Assert.assertEquals(expectedRequest.adSelectionId, request.adSelectionId) Assert.assertEquals(expectedRequest.seller, request.seller) - Assert.assertTrue(expectedRequest.adSelectionResult - .contentEquals(request.adSelectionResult)) + Assert.assertTrue( + expectedRequest.adSelectionResult.contentEquals(request.adSelectionResult) + ) } } }
diff --git a/privacysandbox/ads/ads-adservices-java/src/androidTest/java/androidx/privacysandbox/ads/adservices/java/appsetid/AppSetIdManagerFuturesTest.kt b/privacysandbox/ads/ads-adservices-java/src/androidTest/java/androidx/privacysandbox/ads/adservices/java/appsetid/AppSetIdManagerFuturesTest.kt index b92fa9a..4642a51 100644 --- a/privacysandbox/ads/ads-adservices-java/src/androidTest/java/androidx/privacysandbox/ads/adservices/java/appsetid/AppSetIdManagerFuturesTest.kt +++ b/privacysandbox/ads/ads-adservices-java/src/androidTest/java/androidx/privacysandbox/ads/adservices/java/appsetid/AppSetIdManagerFuturesTest.kt
@@ -61,9 +61,10 @@ if (mValidAdExtServicesSdkExtVersion) { // setup a mockitoSession to return the mocked manager // when the static method .get() is called - mSession = ExtendedMockito.mockitoSession() - .mockStatic(android.adservices.appsetid.AppSetIdManager::class.java) - .startMocking() + mSession = + ExtendedMockito.mockitoSession() + .mockStatic(android.adservices.appsetid.AppSetIdManager::class.java) + .startMocking() } } @@ -75,19 +76,25 @@ @Test @SdkSuppress(maxSdkVersion = 33, minSdkVersion = 30) fun testAppSetIdOlderVersions() { - Assume.assumeFalse("maxSdkVersion = API 33 ext 3 or API 31/32 ext 8", + Assume.assumeFalse( + "maxSdkVersion = API 33 ext 3 or API 31/32 ext 8", VersionCompatUtil.isTestableVersion( /* minAdServicesVersion=*/ 4, - /* minExtServicesVersion=*/ 9)) + /* minExtServicesVersion=*/ 9 + ) + ) assertThat(AppSetIdManagerFutures.from(mContext)).isEqualTo(null) } @Test fun testAppSetIdAsync() { - Assume.assumeTrue("minSdkVersion = API 33 ext 4 or API 31/32 ext 9", + Assume.assumeTrue( + "minSdkVersion = API 33 ext 4 or API 31/32 ext 9", VersionCompatUtil.isTestableVersion( /* minAdServicesVersion= */ 4, - /* minExtServicesVersion=*/ 9)) + /* minExtServicesVersion=*/ 9 + ) + ) val appSetIdManager = mockAppSetIdManager(mContext, mValidAdExtServicesSdkExtVersion) setupResponse(appSetIdManager) @@ -117,8 +124,11 @@ `when`(android.adservices.appsetid.AppSetIdManager.get(ArgumentMatchers.any())) .thenReturn(appSetIdManager) } else { - `when`(spyContext.getSystemService( - android.adservices.appsetid.AppSetIdManager::class.java)) + `when`( + spyContext.getSystemService( + android.adservices.appsetid.AppSetIdManager::class.java + ) + ) .thenReturn(appSetIdManager) } return appSetIdManager @@ -126,21 +136,23 @@ private fun setupResponse(appSetIdManager: android.adservices.appsetid.AppSetIdManager) { // Set up the response that AdIdManager will return when the compat code calls it. - val appSetId = android.adservices.appsetid.AppSetId( - "1234", - android.adservices.appsetid.AppSetId.SCOPE_APP) + val appSetId = + android.adservices.appsetid.AppSetId( + "1234", + android.adservices.appsetid.AppSetId.SCOPE_APP + ) val answer = { args: InvocationOnMock -> assertNotEquals(Looper.getMainLooper(), Looper.myLooper()) - val receiver = args.getArgument< - OutcomeReceiver>(1) + val receiver = + args.getArgument< + OutcomeReceiver+ >( + 1 + ) receiver.onResult(appSetId) null } - doAnswer(answer) - .`when`(appSetIdManager).getAppSetId( - any(), - any() - ) + doAnswer(answer).`when`(appSetIdManager).getAppSetId(any(), any()) } private fun verifyResponse(appSetId: AppSetId) {
diff --git a/privacysandbox/ads/ads-adservices-java/src/androidTest/java/androidx/privacysandbox/ads/adservices/java/customaudience/CustomAudienceManagerFuturesTest.kt b/privacysandbox/ads/ads-adservices-java/src/androidTest/java/androidx/privacysandbox/ads/adservices/java/customaudience/CustomAudienceManagerFuturesTest.kt index d95d88a..9877196 100644 --- a/privacysandbox/ads/ads-adservices-java/src/androidTest/java/androidx/privacysandbox/ads/adservices/java/customaudience/CustomAudienceManagerFuturesTest.kt +++ b/privacysandbox/ads/ads-adservices-java/src/androidTest/java/androidx/privacysandbox/ads/adservices/java/customaudience/CustomAudienceManagerFuturesTest.kt
@@ -73,10 +73,11 @@ if (mValidAdExtServicesSdkExtVersion) { // setup a mockitoSession to return the mocked manager // when the static method .get() is called - mSession = ExtendedMockito.mockitoSession() - .mockStatic(android.adservices.customaudience.CustomAudienceManager::class.java) - .strictness(Strictness.LENIENT) - .startMocking() + mSession = + ExtendedMockito.mockitoSession() + .mockStatic(android.adservices.customaudience.CustomAudienceManager::class.java) + .strictness(Strictness.LENIENT) + .startMocking() } } @@ -88,10 +89,13 @@ @Test @SdkSuppress(maxSdkVersion = 33, minSdkVersion = 30) fun testOlderVersions() { - Assume.assumeFalse("maxSdkVersion = API 33 ext 3 or API 31/32 ext 8", + Assume.assumeFalse( + "maxSdkVersion = API 33 ext 3 or API 31/32 ext 8", VersionCompatUtil.isTestableVersion( /* minAdServicesVersion=*/ 4, - /* minExtServicesVersion=*/ 9)) + /* minExtServicesVersion=*/ 9 + ) + ) Truth.assertThat(from(mContext)).isEqualTo(null) } @@ -99,43 +103,55 @@ @SdkSuppress(maxSdkVersion = 34, minSdkVersion = 31) fun testFetchAndJoinCustomAudienceOlderVersions() { /* AdServices or ExtServices are present */ - Assume.assumeTrue("minSdkVersion = API 33 ext 4 or API 31/32 ext 9", - VersionCompatUtil.isTestableVersion( - /* minAdServicesVersion= */ 4, - /* minExtServicesVersion=*/ 9)) + Assume.assumeTrue( + "minSdkVersion = API 33 ext 4 or API 31/32 ext 9", + VersionCompatUtil.isTestableVersion( + /* minAdServicesVersion= */ 4, + /* minExtServicesVersion=*/ 9 + ) + ) /* API is not available */ - Assume.assumeFalse("maxSdkVersion = API 31-34 ext 9", + Assume.assumeFalse( + "maxSdkVersion = API 31-34 ext 9", VersionCompatUtil.isTestableVersion( /* minAdServicesVersion=*/ 10, - /* minExtServicesVersion=*/ 10)) + /* minExtServicesVersion=*/ 10 + ) + ) mockCustomAudienceManager(mContext, mValidAdExtServicesSdkExtVersion) val managerCompat = from(mContext) // Actually invoke the compat code. - val request = FetchAndJoinCustomAudienceRequest( - uri, - name, - activationTime, - expirationTime, - userBiddingSignals - ) + val request = + FetchAndJoinCustomAudienceRequest( + uri, + name, + activationTime, + expirationTime, + userBiddingSignals + ) // Verify that it throws an exception - val exception = assertThrows(ExecutionException::class.java) { - managerCompat!!.fetchAndJoinCustomAudienceAsync(request).get() - }.hasCauseThat() + val exception = + assertThrows(ExecutionException::class.java) { + managerCompat!!.fetchAndJoinCustomAudienceAsync(request).get() + } + .hasCauseThat() exception.isInstanceOf(UnsupportedOperationException::class.java) exception.hasMessageThat().contains("API is not available. Min version is API 31 ext 10") } @Test fun testJoinCustomAudience() { - Assume.assumeTrue("minSdkVersion = API 33 ext 4 or API 31/32 ext 9", + Assume.assumeTrue( + "minSdkVersion = API 33 ext 4 or API 31/32 ext 9", VersionCompatUtil.isTestableVersion( /* minAdServicesVersion= */ 4, - /* minExtServicesVersion=*/ 9)) + /* minExtServicesVersion=*/ 9 + ) + ) val customAudienceManager = mockCustomAudienceManager(mContext, mValidAdExtServicesSdkExtVersion) @@ -143,19 +159,21 @@ val managerCompat = from(mContext) // Actually invoke the compat code. - val customAudience = CustomAudience.Builder(buyer, name, uri, uri, ads) - .setActivationTime(Instant.now()) - .setExpirationTime(Instant.now()) - .setUserBiddingSignals(userBiddingSignals) - .setTrustedBiddingData(trustedBiddingSignals) - .build() + val customAudience = + CustomAudience.Builder(buyer, name, uri, uri, ads) + .setActivationTime(Instant.now()) + .setExpirationTime(Instant.now()) + .setUserBiddingSignals(userBiddingSignals) + .setTrustedBiddingData(trustedBiddingSignals) + .build() val request = JoinCustomAudienceRequest(customAudience) managerCompat!!.joinCustomAudienceAsync(request).get() // Verify that the compat code was invoked correctly. - val captor = ArgumentCaptor.forClass( - android.adservices.customaudience.JoinCustomAudienceRequest::class.java - ) + val captor = + ArgumentCaptor.forClass( + android.adservices.customaudience.JoinCustomAudienceRequest::class.java + ) verify(customAudienceManager).joinCustomAudience(captor.capture(), any(), any()) // Verify that the request that the compat code makes to the platform is correct. @@ -164,10 +182,13 @@ @Test fun testFetchAndJoinCustomAudience() { - Assume.assumeTrue("minSdkVersion = API 31 ext 10", + Assume.assumeTrue( + "minSdkVersion = API 31 ext 10", VersionCompatUtil.isTestableVersion( /* minAdServicesVersion= */ 10, - /* minExtServicesVersion=*/ 10)) + /* minExtServicesVersion=*/ 10 + ) + ) val customAudienceManager = mockCustomAudienceManager(mContext, mValidAdExtServicesSdkExtVersion) @@ -175,19 +196,21 @@ val managerCompat = from(mContext) // Actually invoke the compat code. - val request = FetchAndJoinCustomAudienceRequest( - uri, - name, - activationTime, - expirationTime, - userBiddingSignals - ) + val request = + FetchAndJoinCustomAudienceRequest( + uri, + name, + activationTime, + expirationTime, + userBiddingSignals + ) managerCompat!!.fetchAndJoinCustomAudienceAsync(request).get() // Verify that the compat code was invoked correctly. - val captor = ArgumentCaptor.forClass( - android.adservices.customaudience.FetchAndJoinCustomAudienceRequest::class.java - ) + val captor = + ArgumentCaptor.forClass( + android.adservices.customaudience.FetchAndJoinCustomAudienceRequest::class.java + ) verify(customAudienceManager).fetchAndJoinCustomAudience(captor.capture(), any(), any()) // Verify that the request that the compat code makes to the platform is correct. @@ -196,10 +219,13 @@ @Test fun testLeaveCustomAudience() { - Assume.assumeTrue("minSdkVersion = API 33 ext 4 or API 31/32 ext 9", + Assume.assumeTrue( + "minSdkVersion = API 33 ext 4 or API 31/32 ext 9", VersionCompatUtil.isTestableVersion( /* minAdServicesVersion= */ 4, - /* minExtServicesVersion=*/ 9)) + /* minExtServicesVersion=*/ 9 + ) + ) val customAudienceManager = mockCustomAudienceManager(mContext, mValidAdExtServicesSdkExtVersion) @@ -211,9 +237,10 @@ managerCompat!!.leaveCustomAudienceAsync(request).get() // Verify that the compat code was invoked correctly. - val captor = ArgumentCaptor.forClass( - android.adservices.customaudience.LeaveCustomAudienceRequest::class.java - ) + val captor = + ArgumentCaptor.forClass( + android.adservices.customaudience.LeaveCustomAudienceRequest::class.java + ) verify(customAudienceManager).leaveCustomAudience(captor.capture(), any(), any()) // Verify that the request that the compat code makes to the platform is correct. @@ -267,7 +294,8 @@ receiver.onResult(Object()) null } - doAnswer(answer).`when`(customAudienceManager) + doAnswer(answer) + .`when`(customAudienceManager) .fetchAndJoinCustomAudience(any(), any(), any()) } @@ -283,20 +311,25 @@ .setTrustedBiddingKeys(keys) .setTrustedBiddingUri(uri) .build() - val customAudience = android.adservices.customaudience.CustomAudience.Builder() - .setBuyer(adtechIdentifier) - .setName(name) - .setActivationTime(Instant.now()) - .setExpirationTime(Instant.now()) - .setBiddingLogicUri(uri) - .setDailyUpdateUri(uri) - .setUserBiddingSignals(userBiddingSignals) - .setTrustedBiddingData(trustedBiddingSignals) - .setAds(listOf(android.adservices.common.AdData.Builder() - .setRenderUri(uri) - .setMetadata(metadata) - .build())) - .build() + val customAudience = + android.adservices.customaudience.CustomAudience.Builder() + .setBuyer(adtechIdentifier) + .setName(name) + .setActivationTime(Instant.now()) + .setExpirationTime(Instant.now()) + .setBiddingLogicUri(uri) + .setDailyUpdateUri(uri) + .setUserBiddingSignals(userBiddingSignals) + .setTrustedBiddingData(trustedBiddingSignals) + .setAds( + listOf( + android.adservices.common.AdData.Builder() + .setRenderUri(uri) + .setMetadata(metadata) + .build() + ) + ) + .build() val expectedRequest = android.adservices.customaudience.JoinCustomAudienceRequest.Builder() @@ -304,47 +337,74 @@ .build() // Verify that the actual request matches the expected one. - Truth.assertThat(expectedRequest.customAudience.ads.size == - joinCustomAudienceRequest.customAudience.ads.size).isTrue() - Truth.assertThat(expectedRequest.customAudience.ads[0].renderUri == - joinCustomAudienceRequest.customAudience.ads[0].renderUri).isTrue() - Truth.assertThat(expectedRequest.customAudience.ads[0].metadata == - joinCustomAudienceRequest.customAudience.ads[0].metadata).isTrue() - Truth.assertThat(expectedRequest.customAudience.biddingLogicUri == - joinCustomAudienceRequest.customAudience.biddingLogicUri).isTrue() - Truth.assertThat(expectedRequest.customAudience.buyer.toString() == - joinCustomAudienceRequest.customAudience.buyer.toString()).isTrue() - Truth.assertThat(expectedRequest.customAudience.dailyUpdateUri == - joinCustomAudienceRequest.customAudience.dailyUpdateUri).isTrue() - Truth.assertThat(expectedRequest.customAudience.name == - joinCustomAudienceRequest.customAudience.name).isTrue() - Truth.assertThat(trustedBiddingSignals.trustedBiddingKeys == - joinCustomAudienceRequest.customAudience.trustedBiddingData!!.trustedBiddingKeys) - .isTrue() - Truth.assertThat(trustedBiddingSignals.trustedBiddingUri == - joinCustomAudienceRequest.customAudience.trustedBiddingData!!.trustedBiddingUri) + Truth.assertThat( + expectedRequest.customAudience.ads.size == + joinCustomAudienceRequest.customAudience.ads.size + ) .isTrue() Truth.assertThat( - joinCustomAudienceRequest.customAudience.userBiddingSignals!!.toString() == - signals).isTrue() + expectedRequest.customAudience.ads[0].renderUri == + joinCustomAudienceRequest.customAudience.ads[0].renderUri + ) + .isTrue() + Truth.assertThat( + expectedRequest.customAudience.ads[0].metadata == + joinCustomAudienceRequest.customAudience.ads[0].metadata + ) + .isTrue() + Truth.assertThat( + expectedRequest.customAudience.biddingLogicUri == + joinCustomAudienceRequest.customAudience.biddingLogicUri + ) + .isTrue() + Truth.assertThat( + expectedRequest.customAudience.buyer.toString() == + joinCustomAudienceRequest.customAudience.buyer.toString() + ) + .isTrue() + Truth.assertThat( + expectedRequest.customAudience.dailyUpdateUri == + joinCustomAudienceRequest.customAudience.dailyUpdateUri + ) + .isTrue() + Truth.assertThat( + expectedRequest.customAudience.name == + joinCustomAudienceRequest.customAudience.name + ) + .isTrue() + Truth.assertThat( + trustedBiddingSignals.trustedBiddingKeys == + joinCustomAudienceRequest.customAudience.trustedBiddingData!! + .trustedBiddingKeys + ) + .isTrue() + Truth.assertThat( + trustedBiddingSignals.trustedBiddingUri == + joinCustomAudienceRequest.customAudience.trustedBiddingData!! + .trustedBiddingUri + ) + .isTrue() + Truth.assertThat( + joinCustomAudienceRequest.customAudience.userBiddingSignals!!.toString() == + signals + ) + .isTrue() } private fun verifyFetchAndJoinCustomAudienceRequest( fetchAndJoinCustomAudienceRequest: - android.adservices.customaudience.FetchAndJoinCustomAudienceRequest + android.adservices.customaudience.FetchAndJoinCustomAudienceRequest ) { // Set up the request that we expect the compat code to invoke. - val userBiddingSignals = android.adservices.common.AdSelectionSignals.fromString( - signals - ) - val expectedRequest = android.adservices.customaudience - .FetchAndJoinCustomAudienceRequest - .Builder(uri) - .setName(name) - .setActivationTime(activationTime) - .setExpirationTime(expirationTime) - .setUserBiddingSignals(userBiddingSignals) - .build() + val userBiddingSignals = + android.adservices.common.AdSelectionSignals.fromString(signals) + val expectedRequest = + android.adservices.customaudience.FetchAndJoinCustomAudienceRequest.Builder(uri) + .setName(name) + .setActivationTime(activationTime) + .setExpirationTime(expirationTime) + .setUserBiddingSignals(userBiddingSignals) + .build() // Verify that the actual request matches the expected one. Truth.assertThat(expectedRequest == fetchAndJoinCustomAudienceRequest).isTrue() @@ -356,11 +416,11 @@ // Set up the request that we expect the compat code to invoke. val adtechIdentifier = android.adservices.common.AdTechIdentifier.fromString(adtech) - val expectedRequest = android.adservices.customaudience.LeaveCustomAudienceRequest - .Builder() - .setBuyer(adtechIdentifier) - .setName(name) - .build() + val expectedRequest = + android.adservices.customaudience.LeaveCustomAudienceRequest.Builder() + .setBuyer(adtechIdentifier) + .setName(name) + .build() // Verify that the actual request matches the expected one. Truth.assertThat(expectedRequest == leaveCustomAudienceRequest).isTrue()
diff --git a/privacysandbox/ads/ads-adservices-java/src/androidTest/java/androidx/privacysandbox/ads/adservices/java/measurement/MeasurementManagerFuturesTest.kt b/privacysandbox/ads/ads-adservices-java/src/androidTest/java/androidx/privacysandbox/ads/adservices/java/measurement/MeasurementManagerFuturesTest.kt index c27d458..363191c 100644 --- a/privacysandbox/ads/ads-adservices-java/src/androidTest/java/androidx/privacysandbox/ads/adservices/java/measurement/MeasurementManagerFuturesTest.kt +++ b/privacysandbox/ads/ads-adservices-java/src/androidTest/java/androidx/privacysandbox/ads/adservices/java/measurement/MeasurementManagerFuturesTest.kt
@@ -87,10 +87,11 @@ if (mValidExtServicesVersion) { // setup a mockitoSession to return the mocked manager // when the static method .get() is called - mSession = ExtendedMockito.mockitoSession() - .mockStatic(android.adservices.measurement.MeasurementManager::class.java) - .strictness(Strictness.LENIENT) - .startMocking() + mSession = + ExtendedMockito.mockitoSession() + .mockStatic(android.adservices.measurement.MeasurementManager::class.java) + .strictness(Strictness.LENIENT) + .startMocking() } } @@ -102,21 +103,27 @@ @Test @SdkSuppress(maxSdkVersion = 33, minSdkVersion = 30) fun testMeasurementOlderVersions() { - Assume.assumeFalse("maxSdkVersion = API 33 ext 4 or API 31/32 ext 8 or API 30 ext 10", + Assume.assumeFalse( + "maxSdkVersion = API 33 ext 4 or API 31/32 ext 8 or API 30 ext 10", VersionCompatUtil.isTestableVersion( /* minAdServicesVersion=*/ 5, /* minExtServicesVersionS=*/ 9, - /* minExtServicesVersionR=*/ 11)) + /* minExtServicesVersionR=*/ 11 + ) + ) assertThat(from(mContext)).isEqualTo(null) } @Test @SdkSuppress(minSdkVersion = 31) fun testDeleteRegistrationsAsyncOnSPlus() { - Assume.assumeTrue("minSdkVersion = API 33 ext 5 or API 31/32 ext 9", + Assume.assumeTrue( + "minSdkVersion = API 33 ext 5 or API 31/32 ext 9", VersionCompatUtil.isTestableVersion( /* minAdServicesVersion= */ 5, - /* minExtServicesVersion=*/ 9)) + /* minExtServicesVersion=*/ 9 + ) + ) val mMeasurementManager = mockMeasurementManager(mContext, mValidAdExtServicesSdkExtVersionS) @@ -129,32 +136,36 @@ assertNotEquals(Looper.myLooper(), Looper.getMainLooper()) null } - doAnswer(answer).`when`(mMeasurementManager).deleteRegistrations( - any(), - any(), - any>() - ) + doAnswer(answer) + .`when`(mMeasurementManager) + .deleteRegistrations( + any(), + any(), + any>() + ) // Actually invoke the compat code. - val request = DeletionRequest( - DeletionRequest.DELETION_MODE_ALL, - DeletionRequest.MATCH_BEHAVIOR_DELETE, - Instant.now(), - Instant.now(), - listOf(uri1), - listOf(uri1)) + val request = + DeletionRequest( + DeletionRequest.DELETION_MODE_ALL, + DeletionRequest.MATCH_BEHAVIOR_DELETE, + Instant.now(), + Instant.now(), + listOf(uri1), + listOf(uri1) + ) managerCompat!!.deleteRegistrationsAsync(request).get() // Verify that the compat code was invoked correctly. - val captor = ArgumentCaptor.forClass( - android.adservices.measurement.DeletionRequest::class.java - ) - verify(mMeasurementManager).deleteRegistrations( - captor.capture(), - any(), - any>() - ) + val captor = + ArgumentCaptor.forClass(android.adservices.measurement.DeletionRequest::class.java) + verify(mMeasurementManager) + .deleteRegistrations( + captor.capture(), + any(), + any>() + ) // Verify that the request that the compat code makes to the platform is correct. verifyDeletionRequest(captor.value) @@ -163,10 +174,13 @@ @Test @SdkSuppress(minSdkVersion = 31) fun testRegisterSourceAsyncOnSPlus() { - Assume.assumeTrue("minSdkVersion = API 33 ext 5 or API 31/32 ext 9", + Assume.assumeTrue( + "minSdkVersion = API 33 ext 5 or API 31/32 ext 9", VersionCompatUtil.isTestableVersion( /* minAdServicesVersion= */ 5, - /* minExtServicesVersion=*/ 9)) + /* minExtServicesVersion=*/ 9 + ) + ) val mMeasurementManager = mockMeasurementManager(mContext, mValidAdExtServicesSdkExtVersionS) @@ -179,12 +193,14 @@ receiver.onResult(Object()) null } - doAnswer(answer).`when`(mMeasurementManager).registerSource( - any(), - any(), - any(), - any>() - ) + doAnswer(answer) + .`when`(mMeasurementManager) + .registerSource( + any(), + any(), + any(), + any>() + ) // Actually invoke the compat code. managerCompat!!.registerSourceAsync(uri1, inputEvent).get() @@ -192,11 +208,13 @@ // Verify that the compat code was invoked correctly. val captor1 = ArgumentCaptor.forClass(Uri::class.java) val captor2 = ArgumentCaptor.forClass(InputEvent::class.java) - verify(mMeasurementManager).registerSource( - captor1.capture(), - captor2.capture(), - any(), - any>()) + verify(mMeasurementManager) + .registerSource( + captor1.capture(), + captor2.capture(), + any(), + any>() + ) // Verify that the request that the compat code makes to the platform is correct. assertThat(captor1.value == uri1) @@ -206,10 +224,13 @@ @Test @SdkSuppress(minSdkVersion = 31) fun testRegisterTriggerAsyncOnSPlus() { - Assume.assumeTrue("minSdkVersion = API 33 ext 5 or API 31/32 ext 9", + Assume.assumeTrue( + "minSdkVersion = API 33 ext 5 or API 31/32 ext 9", VersionCompatUtil.isTestableVersion( /* minAdServicesVersion= */ 5, - /* minExtServicesVersion=*/ 9)) + /* minExtServicesVersion=*/ 9 + ) + ) val mMeasurementManager = mockMeasurementManager(mContext, mValidAdExtServicesSdkExtVersionS) @@ -221,7 +242,8 @@ receiver.onResult(Object()) null } - doAnswer(answer).`when`(mMeasurementManager) + doAnswer(answer) + .`when`(mMeasurementManager) .registerTrigger(any(), any // Actually invoke the compat code. @@ -229,10 +251,12 @@ // Verify that the compat code was invoked correctly. val captor1 = ArgumentCaptor.forClass(Uri::class.java) - verify(mMeasurementManager).registerTrigger( - captor1.capture(), - any(), any >()) (), - any>()) + verify(mMeasurementManager) + .registerTrigger( + captor1.capture(), + any(), + any>() + ) // Verify that the request that the compat code makes to the platform is correct. assertThat(captor1.value == uri1) @@ -241,10 +265,13 @@ @Test @SdkSuppress(minSdkVersion = 31) fun testRegisterWebSourceAsyncOnSPlus() { - Assume.assumeTrue("minSdkVersion = API 33 ext 5 or API 31/32 ext 9", + Assume.assumeTrue( + "minSdkVersion = API 33 ext 5 or API 31/32 ext 9", VersionCompatUtil.isTestableVersion( /* minAdServicesVersion= */ 5, - /* minExtServicesVersion=*/ 9)) + /* minExtServicesVersion=*/ 9 + ) + ) val mMeasurementManager = mockMeasurementManager(mContext, mValidAdExtServicesSdkExtVersionS) @@ -256,27 +283,33 @@ receiver.onResult(Object()) null } - doAnswer(answer).`when`(mMeasurementManager).registerWebSource( - any(), - any(), - any>() - ) + doAnswer(answer) + .`when`(mMeasurementManager) + .registerWebSource( + any(), + any(), + any>() + ) - val request = WebSourceRegistrationRequest.Builder( - listOf(WebSourceParams(uri2, false)), uri1) - .setAppDestination(appDestination) - .build() + val request = + WebSourceRegistrationRequest.Builder(listOf(WebSourceParams(uri2, false)), uri1) + .setAppDestination(appDestination) + .build() // Actually invoke the compat code. managerCompat!!.registerWebSourceAsync(request).get() // Verify that the compat code was invoked correctly. - val captor1 = ArgumentCaptor.forClass( - android.adservices.measurement.WebSourceRegistrationRequest::class.java) - verify(mMeasurementManager).registerWebSource( - captor1.capture(), - any(), - any>()) + val captor1 = + ArgumentCaptor.forClass( + android.adservices.measurement.WebSourceRegistrationRequest::class.java + ) + verify(mMeasurementManager) + .registerWebSource( + captor1.capture(), + any(), + any>() + ) // Verify that the request that the compat code makes to the platform is correct. val actualRequest = captor1.value @@ -290,10 +323,13 @@ @Test @SdkSuppress(minSdkVersion = 31) fun testRegisterWebTriggerAsyncOnSPlus() { - Assume.assumeTrue("minSdkVersion = API 33 ext 5 or API 31/32 ext 9", + Assume.assumeTrue( + "minSdkVersion = API 33 ext 5 or API 31/32 ext 9", VersionCompatUtil.isTestableVersion( /* minAdServicesVersion= */ 5, - /* minExtServicesVersion=*/ 9)) + /* minExtServicesVersion=*/ 9 + ) + ) val mMeasurementManager = mockMeasurementManager(mContext, mValidAdExtServicesSdkExtVersionS) @@ -305,11 +341,13 @@ receiver.onResult(Object()) null } - doAnswer(answer).`when`(mMeasurementManager).registerWebTrigger( - any(), - any(), - any>() - ) + doAnswer(answer) + .`when`(mMeasurementManager) + .registerWebTrigger( + any(), + any(), + any>() + ) val request = WebTriggerRegistrationRequest(listOf(WebTriggerParams(uri1, false)), uri2) @@ -317,12 +355,16 @@ managerCompat!!.registerWebTriggerAsync(request).get() // Verify that the compat code was invoked correctly. - val captor1 = ArgumentCaptor.forClass( - android.adservices.measurement.WebTriggerRegistrationRequest::class.java) - verify(mMeasurementManager).registerWebTrigger( - captor1.capture(), - any(), - any>()) + val captor1 = + ArgumentCaptor.forClass( + android.adservices.measurement.WebTriggerRegistrationRequest::class.java + ) + verify(mMeasurementManager) + .registerWebTrigger( + captor1.capture(), + any(), + any>() + ) // Verify that the request that the compat code makes to the platform is correct. val actualRequest = captor1.value @@ -335,10 +377,13 @@ @Test @SdkSuppress(minSdkVersion = 31) fun testMeasurementApiStatusAsyncOnSPlus() { - Assume.assumeTrue("minSdkVersion = API 33 ext 5 or API 31/32 ext 9", + Assume.assumeTrue( + "minSdkVersion = API 33 ext 5 or API 31/32 ext 9", VersionCompatUtil.isTestableVersion( /* minAdServicesVersion= */ 5, - /* minExtServicesVersion=*/ 9)) + /* minExtServicesVersion=*/ 9 + ) + ) val mMeasurementManager = mockMeasurementManager(mContext, mValidAdExtServicesSdkExtVersionS) @@ -351,7 +396,8 @@ receiver.onResult(state) null } - doAnswer(answer).`when`(mMeasurementManager) + doAnswer(answer) + .`when`(mMeasurementManager) .getMeasurementApiStatus(any(), any // Actually invoke the compat code. @@ -359,10 +405,8 @@ result.get() // Verify that the compat code was invoked correctly. - verify(mMeasurementManager).getMeasurementApiStatus( - any>()) (), - any>() - ) + verify(mMeasurementManager) + .getMeasurementApiStatus(any(), any // Verify that the result. assertThat(result.get() == state) @@ -372,10 +416,13 @@ @Test @SdkSuppress(minSdkVersion = 31) fun testRegisterSourceAsync_allSuccessOnSPlus() { - Assume.assumeTrue("minSdkVersion = API 33 ext 5 or API 31/32 ext 9", + Assume.assumeTrue( + "minSdkVersion = API 33 ext 5 or API 31/32 ext 9", VersionCompatUtil.isTestableVersion( /* minAdServicesVersion= */ 5, - /* minExtServicesVersion=*/ 9)) + /* minExtServicesVersion=*/ 9 + ) + ) val mMeasurementManager = mockMeasurementManager(mContext, mValidAdExtServicesSdkExtVersionS) @@ -388,7 +435,8 @@ receiver.onResult(Object()) null } - doAnswer(successCallback).`when`(mMeasurementManager) + doAnswer(successCallback) + .`when`(mMeasurementManager) .registerSource( any>()) (), any(), @@ -397,32 +445,38 @@ ) // Actually invoke the compat code. - val request = SourceRegistrationRequest.Builder(listOf(uri1, uri2)) - .setInputEvent(inputEvent) - .build() + val request = + SourceRegistrationRequest.Builder(listOf(uri1, uri2)).setInputEvent(inputEvent).build() managerCompat!!.registerSourceAsync(request).get() // Verify that the compat code was invoked correctly. - verify(mMeasurementManager).registerSource( - eq(uri1), - eq(inputEvent), - any(), - any>()) - verify(mMeasurementManager).registerSource( - eq(uri2), - eq(inputEvent), - any(), - any>()) + verify(mMeasurementManager) + .registerSource( + eq(uri1), + eq(inputEvent), + any(), + any>() + ) + verify(mMeasurementManager) + .registerSource( + eq(uri2), + eq(inputEvent), + any(), + any>() + ) } @ExperimentalFeatures.RegisterSourceOptIn @Test @SdkSuppress(minSdkVersion = 31) fun testRegisterSource_15thOf20Fails_atLeast15thExecutesOnSPlus() { - Assume.assumeTrue("minSdkVersion = API 33 ext 5 or API 31/32 ext 9", + Assume.assumeTrue( + "minSdkVersion = API 33 ext 5 or API 31/32 ext 9", VersionCompatUtil.isTestableVersion( /* minAdServicesVersion= */ 5, - /* minExtServicesVersion=*/ 9)) + /* minExtServicesVersion=*/ 9 + ) + ) val mMeasurementManager = mockMeasurementManager(mContext, mValidAdExtServicesSdkExtVersionS) @@ -442,36 +496,39 @@ null } - val uris = (1..20).map { i -> - val uri = Uri.parse("www.uri$i.com") - if (i == 15) { - doAnswer(errorCallback).`when`(mMeasurementManager) - .registerSource( - eq(uri), - any(), - any(), - any>() - ) - } else { - doAnswer(successCallback).`when`(mMeasurementManager) - .registerSource( - eq(uri), - any(), - any(), - any>() - ) - } - uri - }.toList() + val uris = + (1..20) + .map { i -> + val uri = Uri.parse("www.uri$i.com") + if (i == 15) { + doAnswer(errorCallback) + .`when`(mMeasurementManager) + .registerSource( + eq(uri), + any(), + any(), + any>() + ) + } else { + doAnswer(successCallback) + .`when`(mMeasurementManager) + .registerSource( + eq(uri), + any(), + any(), + any>() + ) + } + uri + } + .toList() val request = SourceRegistrationRequest(uris, mockInputEvent) // Actually invoke the compat code. runBlocking { try { - withContext(Dispatchers.Main) { - managerCompat!!.registerSourceAsync(request).get() - } + withContext(Dispatchers.Main) { managerCompat!!.registerSourceAsync(request).get() } fail("Expected failure.") } catch (e: ExecutionException) { assertTrue(e.cause!! is IllegalArgumentException) @@ -483,18 +540,20 @@ // registerSource gets called 1-20 times. We cannot predict the exact number because // uri15 would crash asynchronously. Other uris may succeed and those threads on default // dispatcher won't crash. - verify(mMeasurementManager, atLeastOnce()).registerSource( - any(), - eq(mockInputEvent), - any(), - any>() - ) - verify(mMeasurementManager, atMost(20)).registerSource( - any(), - eq(mockInputEvent), - any(), - any>() - ) + verify(mMeasurementManager, atLeastOnce()) + .registerSource( + any(), + eq(mockInputEvent), + any(), + any>() + ) + verify(mMeasurementManager, atMost(20)) + .registerSource( + any(), + eq(mockInputEvent), + any(), + any>() + ) } @Test @@ -513,32 +572,36 @@ assertNotEquals(Looper.myLooper(), Looper.getMainLooper()) null } - doAnswer(answer).`when`(mMeasurementManager).deleteRegistrations( - any(), - any(), - any>() - ) + doAnswer(answer) + .`when`(mMeasurementManager) + .deleteRegistrations( + any(), + any(), + any>() + ) // Actually invoke the compat code. - val request = DeletionRequest( - DeletionRequest.DELETION_MODE_ALL, - DeletionRequest.MATCH_BEHAVIOR_DELETE, - Instant.now(), - Instant.now(), - listOf(uri1), - listOf(uri1)) + val request = + DeletionRequest( + DeletionRequest.DELETION_MODE_ALL, + DeletionRequest.MATCH_BEHAVIOR_DELETE, + Instant.now(), + Instant.now(), + listOf(uri1), + listOf(uri1) + ) managerCompat!!.deleteRegistrationsAsync(request).get() // Verify that the compat code was invoked correctly. - val captor = ArgumentCaptor.forClass( - android.adservices.measurement.DeletionRequest::class.java - ) - verify(mMeasurementManager).deleteRegistrations( - captor.capture(), - any(), - any>() - ) + val captor = + ArgumentCaptor.forClass(android.adservices.measurement.DeletionRequest::class.java) + verify(mMeasurementManager) + .deleteRegistrations( + captor.capture(), + any(), + any>() + ) // Verify that the request that the compat code makes to the platform is correct. verifyDeletionRequest(captor.value) @@ -560,12 +623,14 @@ receiver.onResult(Object()) null } - doAnswer(answer).`when`(mMeasurementManager).registerSource( - any(), - any(), - any(), - any>() - ) + doAnswer(answer) + .`when`(mMeasurementManager) + .registerSource( + any(), + any(), + any(), + any>() + ) // Actually invoke the compat code. managerCompat!!.registerSourceAsync(uri1, inputEvent).get() @@ -573,11 +638,13 @@ // Verify that the compat code was invoked correctly. val captor1 = ArgumentCaptor.forClass(Uri::class.java) val captor2 = ArgumentCaptor.forClass(InputEvent::class.java) - verify(mMeasurementManager).registerSource( - captor1.capture(), - captor2.capture(), - any(), - any>()) + verify(mMeasurementManager) + .registerSource( + captor1.capture(), + captor2.capture(), + any(), + any>() + ) // Verify that the request that the compat code makes to the platform is correct. assertThat(captor1.value == uri1) @@ -599,21 +666,25 @@ receiver.onResult(Object()) null } - doAnswer(answer).`when`(mMeasurementManager) + doAnswer(answer) + .`when`(mMeasurementManager) .registerTrigger( any(), any(), - any>()) + any>() + ) // Actually invoke the compat code. managerCompat!!.registerTriggerAsync(uri1).get() // Verify that the compat code was invoked correctly. val captor1 = ArgumentCaptor.forClass(Uri::class.java) - verify(mMeasurementManager).registerTrigger( - captor1.capture(), - any(), - any>()) + verify(mMeasurementManager) + .registerTrigger( + captor1.capture(), + any(), + any>() + ) // Verify that the request that the compat code makes to the platform is correct. assertThat(captor1.value == uri1) @@ -634,27 +705,33 @@ receiver.onResult(Object()) null } - doAnswer(answer).`when`(mMeasurementManager).registerWebSource( - any(), - any(), - any>() - ) + doAnswer(answer) + .`when`(mMeasurementManager) + .registerWebSource( + any(), + any(), + any>() + ) - val request = WebSourceRegistrationRequest.Builder( - listOf(WebSourceParams(uri2, false)), uri1) - .setAppDestination(appDestination) - .build() + val request = + WebSourceRegistrationRequest.Builder(listOf(WebSourceParams(uri2, false)), uri1) + .setAppDestination(appDestination) + .build() // Actually invoke the compat code. managerCompat!!.registerWebSourceAsync(request).get() // Verify that the compat code was invoked correctly. - val captor1 = ArgumentCaptor.forClass( - android.adservices.measurement.WebSourceRegistrationRequest::class.java) - verify(mMeasurementManager).registerWebSource( - captor1.capture(), - any(), - any>()) + val captor1 = + ArgumentCaptor.forClass( + android.adservices.measurement.WebSourceRegistrationRequest::class.java + ) + verify(mMeasurementManager) + .registerWebSource( + captor1.capture(), + any(), + any>() + ) // Verify that the request that the compat code makes to the platform is correct. val actualRequest = captor1.value @@ -680,11 +757,13 @@ receiver.onResult(Object()) null } - doAnswer(answer).`when`(mMeasurementManager).registerWebTrigger( - any(), - any(), - any>() - ) + doAnswer(answer) + .`when`(mMeasurementManager) + .registerWebTrigger( + any(), + any(), + any>() + ) val request = WebTriggerRegistrationRequest(listOf(WebTriggerParams(uri1, false)), uri2) @@ -692,12 +771,16 @@ managerCompat!!.registerWebTriggerAsync(request).get() // Verify that the compat code was invoked correctly. - val captor1 = ArgumentCaptor.forClass( - android.adservices.measurement.WebTriggerRegistrationRequest::class.java) - verify(mMeasurementManager).registerWebTrigger( - captor1.capture(), - any(), - any>()) + val captor1 = + ArgumentCaptor.forClass( + android.adservices.measurement.WebTriggerRegistrationRequest::class.java + ) + verify(mMeasurementManager) + .registerWebTrigger( + captor1.capture(), + any(), + any>() + ) // Verify that the request that the compat code makes to the platform is correct. val actualRequest = captor1.value @@ -723,20 +806,23 @@ receiver.onResult(state) null } - doAnswer(answer).`when`(mMeasurementManager) + doAnswer(answer) + .`when`(mMeasurementManager) .getMeasurementApiStatus( any(), - any>()) + any>() + ) // Actually invoke the compat code. val result = managerCompat!!.getMeasurementApiStatusAsync() result.get() // Verify that the compat code was invoked correctly. - verify(mMeasurementManager).getMeasurementApiStatus( - any(), - any>() - ) + verify(mMeasurementManager) + .getMeasurementApiStatus( + any(), + any>() + ) // Verify that the result. assertThat(result.get() == state) @@ -759,7 +845,8 @@ receiver.onResult(Object()) null } - doAnswer(successCallback).`when`(mMeasurementManager) + doAnswer(successCallback) + .`when`(mMeasurementManager) .registerSource( any(), any(), @@ -768,22 +855,25 @@ ) // Actually invoke the compat code. - val request = SourceRegistrationRequest.Builder(listOf(uri1, uri2)) - .setInputEvent(inputEvent) - .build() + val request = + SourceRegistrationRequest.Builder(listOf(uri1, uri2)).setInputEvent(inputEvent).build() managerCompat!!.registerSourceAsync(request).get() // Verify that the compat code was invoked correctly. - verify(mMeasurementManager).registerSource( - eq(uri1), - eq(inputEvent), - any(), - any>()) - verify(mMeasurementManager).registerSource( - eq(uri2), - eq(inputEvent), - any(), - any>()) + verify(mMeasurementManager) + .registerSource( + eq(uri1), + eq(inputEvent), + any(), + any>() + ) + verify(mMeasurementManager) + .registerSource( + eq(uri2), + eq(inputEvent), + any(), + any>() + ) } @ExperimentalFeatures.RegisterSourceOptIn @@ -810,36 +900,39 @@ null } - val uris = (1..20).map { i -> - val uri = Uri.parse("www.uri$i.com") - if (i == 15) { - doAnswer(errorCallback).`when`(mMeasurementManager) - .registerSource( - eq(uri), - any(), - any(), - any>() - ) - } else { - doAnswer(successCallback).`when`(mMeasurementManager) - .registerSource( - eq(uri), - any(), - any(), - any>() - ) - } - uri - }.toList() + val uris = + (1..20) + .map { i -> + val uri = Uri.parse("www.uri$i.com") + if (i == 15) { + doAnswer(errorCallback) + .`when`(mMeasurementManager) + .registerSource( + eq(uri), + any(), + any(), + any>() + ) + } else { + doAnswer(successCallback) + .`when`(mMeasurementManager) + .registerSource( + eq(uri), + any(), + any(), + any>() + ) + } + uri + } + .toList() val request = SourceRegistrationRequest(uris, mockInputEvent) // Actually invoke the compat code. runBlocking { try { - withContext(Dispatchers.Main) { - managerCompat!!.registerSourceAsync(request).get() - } + withContext(Dispatchers.Main) { managerCompat!!.registerSourceAsync(request).get() } fail("Expected failure.") } catch (e: ExecutionException) { assertTrue(e.cause!! is IllegalArgumentException) @@ -851,18 +944,20 @@ // registerSource gets called 1-20 times. We cannot predict the exact number because // uri15 would crash asynchronously. Other uris may succeed and those threads on default // dispatcher won't crash. - verify(mMeasurementManager, atLeastOnce()).registerSource( - any(), - eq(mockInputEvent), - any(), - any>() - ) - verify(mMeasurementManager, atMost(20)).registerSource( - any(), - eq(mockInputEvent), - any(), - any>() - ) + verify(mMeasurementManager, atLeastOnce()) + .registerSource( + any(), + eq(mockInputEvent), + any(), + any>() + ) + verify(mMeasurementManager, atMost(20)) + .registerSource( + any(), + eq(mockInputEvent), + any(), + any>() + ) } @SdkSuppress(minSdkVersion = 30) @@ -891,10 +986,11 @@ private fun verifyDeletionRequest(request: android.adservices.measurement.DeletionRequest) { // Set up the request that we expect the compat code to invoke. - val expectedRequest = android.adservices.measurement.DeletionRequest.Builder() - .setDomainUris(listOf(uri1)) - .setOriginUris(listOf(uri1)) - .build() + val expectedRequest = + android.adservices.measurement.DeletionRequest.Builder() + .setDomainUris(listOf(uri1)) + .setOriginUris(listOf(uri1)) + .build() assertThat(HashSet(request.domainUris) == HashSet(expectedRequest.domainUris)) assertThat(HashSet(request.originUris) == HashSet(expectedRequest.originUris))
diff --git a/privacysandbox/ads/ads-adservices-java/src/androidTest/java/androidx/privacysandbox/ads/adservices/java/topics/TopicsManagerFuturesTest.kt b/privacysandbox/ads/ads-adservices-java/src/androidTest/java/androidx/privacysandbox/ads/adservices/java/topics/TopicsManagerFuturesTest.kt index 95d181d..6742aa6 100644 --- a/privacysandbox/ads/ads-adservices-java/src/androidTest/java/androidx/privacysandbox/ads/adservices/java/topics/TopicsManagerFuturesTest.kt +++ b/privacysandbox/ads/ads-adservices-java/src/androidTest/java/androidx/privacysandbox/ads/adservices/java/topics/TopicsManagerFuturesTest.kt
@@ -64,10 +64,11 @@ if (mValidAdExtServicesSdkExtVersion) { // setup a mockitoSession to return the mocked manager // when the static method .get() is called - mSession = ExtendedMockito.mockitoSession() - .mockStatic(android.adservices.topics.TopicsManager::class.java) - .strictness(Strictness.LENIENT) - .startMocking() + mSession = + ExtendedMockito.mockitoSession() + .mockStatic(android.adservices.topics.TopicsManager::class.java) + .strictness(Strictness.LENIENT) + .startMocking() } } @@ -79,40 +80,45 @@ @Test @SdkSuppress(maxSdkVersion = 33, minSdkVersion = 30) fun testTopicsOlderVersions() { - Assume.assumeFalse("maxSdkVersion = API 33 ext 3 or API 31/32 ext 8", + Assume.assumeFalse( + "maxSdkVersion = API 33 ext 3 or API 31/32 ext 8", VersionCompatUtil.isTestableVersion( /* minAdServicesVersion=*/ 4, - /* minExtServicesVersion=*/ 9)) + /* minExtServicesVersion=*/ 9 + ) + ) assertThat(from(mContext)).isEqualTo(null) } @Test @SuppressWarnings("NewApi") fun testTopicsAsync() { - Assume.assumeTrue("minSdkVersion = API 33 ext 4 or API 31/32 ext 9", + Assume.assumeTrue( + "minSdkVersion = API 33 ext 4 or API 31/32 ext 9", VersionCompatUtil.isTestableVersion( /* minAdServicesVersion= */ 4, - /* minExtServicesVersion=*/ 9)) + /* minExtServicesVersion=*/ 9 + ) + ) val topicsManager = mockTopicsManager(mContext, mValidAdExtServicesSdkExtVersion) setupTopicsResponse(topicsManager) val managerCompat = from(mContext) // Actually invoke the compat code. - val request = GetTopicsRequest.Builder() - .setAdsSdkName(mSdkName) - .setShouldRecordObservation(true) - .build() + val request = + GetTopicsRequest.Builder() + .setAdsSdkName(mSdkName) + .setShouldRecordObservation(true) + .build() - val result: ListenableFuture= - managerCompat!!.getTopicsAsync(request) + val result: ListenableFuture= managerCompat!!.getTopicsAsync(request) // Verify that the result of the compat call is correct. verifyResponse(result.get()) // Verify that the compat code was invoked correctly. - val captor = ArgumentCaptor - .forClass(android.adservices.topics.GetTopicsRequest::class.java) + val captor = ArgumentCaptor.forClass(android.adservices.topics.GetTopicsRequest::class.java) verify(topicsManager).getTopics(captor.capture(), any(), any()) // Verify that the request that the compat code makes to the platform is correct. @@ -122,10 +128,13 @@ @Test @SuppressWarnings("NewApi") fun testTopicsAsyncPreviewSupported() { - Assume.assumeTrue("minSdkVersion = API 33 ext 5 or API 31/32 ext 9", + Assume.assumeTrue( + "minSdkVersion = API 33 ext 5 or API 31/32 ext 9", VersionCompatUtil.isTestableVersion( /* minAdServicesVersion= */ 5, - /* minExtServicesVersion=*/ 9)) + /* minExtServicesVersion=*/ 9 + ) + ) val topicsManager = mockTopicsManager(mContext, mValidAdExtServicesSdkExtVersion) setupTopicsResponse(topicsManager) @@ -133,18 +142,18 @@ // Actually invoke the compat Preview API code. val request = - GetTopicsRequest.Builder().setAdsSdkName(mSdkName).setShouldRecordObservation(false) + GetTopicsRequest.Builder() + .setAdsSdkName(mSdkName) + .setShouldRecordObservation(false) .build() - val result: ListenableFuture= - managerCompat!!.getTopicsAsync(request) + val result: ListenableFuture= managerCompat!!.getTopicsAsync(request) // Verify that the result of the compat call is correct. verifyResponse(result.get()) // Verify that the compat code was invoked correctly. - val captor = - ArgumentCaptor.forClass(android.adservices.topics.GetTopicsRequest::class.java) + val captor = ArgumentCaptor.forClass(android.adservices.topics.GetTopicsRequest::class.java) verify(topicsManager).getTopics(captor.capture(), any(), any()) // Verify that the request that the compat code makes to the platform is correct. @@ -175,14 +184,16 @@ val topics = listOf(topic1, topic2) val response = android.adservices.topics.GetTopicsResponse.Builder(topics).build() val answer = { args: InvocationOnMock -> - val receiver = args.getArgument< - OutcomeReceiver>(2) + val receiver = + args.getArgument< + OutcomeReceiver+ >( + 2 + ) receiver.onResult(response) null } - doAnswer(answer).`when`(topicsManager).getTopics( - any(), any(), any() - ) + doAnswer(answer).`when`(topicsManager).getTopics(any(), any(), any()) } private fun verifyRequest(topicsRequest: android.adservices.topics.GetTopicsRequest) { @@ -198,12 +209,15 @@ ) { // Set up the request that we expect the compat code to invoke. val expectedRequest = - android.adservices.topics.GetTopicsRequest.Builder().setAdsSdkName(mSdkName) - .setShouldRecordObservation(false).build() + android.adservices.topics.GetTopicsRequest.Builder() + .setAdsSdkName(mSdkName) + .setShouldRecordObservation(false) + .build() Assert.assertEquals(expectedRequest.adsSdkName, topicsRequest.adsSdkName) Assert.assertEquals( - expectedRequest.shouldRecordObservation(), topicsRequest.shouldRecordObservation() + expectedRequest.shouldRecordObservation(), + topicsRequest.shouldRecordObservation() ) }
diff --git a/privacysandbox/ads/ads-adservices-java/src/main/java/androidx/privacysandbox/ads/adservices/java/adid/AdIdManagerFutures.kt b/privacysandbox/ads/ads-adservices-java/src/main/java/androidx/privacysandbox/ads/adservices/java/adid/AdIdManagerFutures.kt index 96544ec..9490a86 100644 --- a/privacysandbox/ads/ads-adservices-java/src/main/java/androidx/privacysandbox/ads/adservices/java/adid/AdIdManagerFutures.kt +++ b/privacysandbox/ads/ads-adservices-java/src/main/java/androidx/privacysandbox/ads/adservices/java/adid/AdIdManagerFutures.kt
@@ -50,18 +50,18 @@ @DoNotInline @RequiresPermission(AdServicesPermissions.ACCESS_ADSERVICES_AD_ID) override fun getAdIdAsync(): ListenableFuture{ - return CoroutineScope(Dispatchers.Default).async { - mAdIdManager.getAdId() - }.asListenableFuture() + return CoroutineScope(Dispatchers.Default) + .async { mAdIdManager.getAdId() } + .asListenableFuture() } } companion object { /** - * Creates [AdIdManagerFutures]. + * Creates [AdIdManagerFutures]. * - * @return AdIdManagerFutures object. If the device is running an incompatible - * build, the value returned is null. + * @return AdIdManagerFutures object. If the device is running an incompatible build, the + * value returned is null. */ @JvmStatic fun from(context: Context): AdIdManagerFutures? {
diff --git a/privacysandbox/ads/ads-adservices-java/src/main/java/androidx/privacysandbox/ads/adservices/java/adselection/AdSelectionManagerFutures.kt b/privacysandbox/ads/ads-adservices-java/src/main/java/androidx/privacysandbox/ads/adservices/java/adselection/AdSelectionManagerFutures.kt index 0c4a0ed..1a96530 100644 --- a/privacysandbox/ads/ads-adservices-java/src/main/java/androidx/privacysandbox/ads/adservices/java/adselection/AdSelectionManagerFutures.kt +++ b/privacysandbox/ads/ads-adservices-java/src/main/java/androidx/privacysandbox/ads/adservices/java/adselection/AdSelectionManagerFutures.kt
@@ -42,8 +42,8 @@ import kotlinx.coroutines.async /** - * This class provides APIs to select ads and report impressions. - * This class can be used by Java clients. + * This class provides APIs to select ads and report impressions. This class can be used by Java + * clients. */ @OptIn(ExperimentalFeatures.Ext8OptIn::class) abstract class AdSelectionManagerFutures internal constructor() { @@ -53,25 +53,25 @@ * application. * * @param adSelectionConfig the config The input {@code adSelectionConfig} is provided by the - * Ads SDK and the [AdSelectionConfig] object is transferred via a Binder call. For this - * reason, the total size of these objects is bound to the Android IPC limitations. Failures to - * transfer the [AdSelectionConfig] will throws an [TransactionTooLargeException]. + * Ads SDK and the [AdSelectionConfig] object is transferred via a Binder call. For this + * reason, the total size of these objects is bound to the Android IPC limitations. Failures + * to transfer the [AdSelectionConfig] will throws an [TransactionTooLargeException]. * - * The output is passed by the receiver, which either returns an [AdSelectionOutcome] - * for a successful run, or an [Exception] includes the type of the exception thrown and - * the corresponding error message. + * The output is passed by the receiver, which either returns an [AdSelectionOutcome] for a + * successful run, or an [Exception] includes the type of the exception thrown and the + * corresponding error message. * - * If the [IllegalArgumentException] is thrown, it is caused by invalid input argument - * the API received to run the ad selection. + * If the [IllegalArgumentException] is thrown, it is caused by invalid input argument the API + * received to run the ad selection. * * If the [IllegalStateException] is thrown with error message "Failure of AdSelection * services.", it is caused by an internal failure of the ad selection service. * - * If the [TimeoutException] is thrown, it is caused when a timeout is encountered - * during bidding, scoring, or overall selection process to find winning Ad. + * If the [TimeoutException] is thrown, it is caused when a timeout is encountered during + * bidding, scoring, or overall selection process to find winning Ad. * - * If the [LimitExceededException] is thrown, it is caused when the calling package - * exceeds the allowed rate limits and is throttled. + * If the [LimitExceededException] is thrown, it is caused when the calling package exceeds the + * allowed rate limits and is throttled. */ @RequiresPermission(AdServicesPermissions.ACCESS_ADSERVICES_CUSTOM_AUDIENCE) abstract fun selectAdsAsync( @@ -82,28 +82,28 @@ * Selects an ad from the results of previously ran ad selections. * * @param adSelectionFromOutcomesConfig is provided by the Ads SDK and the - * [AdSelectionFromOutcomesConfig] object is transferred via a Binder call. For this reason, the - * total size of these objects is bound to the Android IPC limitations. Failures to transfer the - * [AdSelectionFromOutcomesConfig] will throw an [TransactionTooLargeException]. + * [AdSelectionFromOutcomesConfig] object is transferred via a Binder call. For this reason, + * the total size of these objects is bound to the Android IPC limitations. Failures to + * transfer the [AdSelectionFromOutcomesConfig] will throw an [TransactionTooLargeException]. * - * The output is passed by the receiver, which either returns an [AdSelectionOutcome] - * for a successful run, or an [Exception] includes the type of the exception thrown and - * the corresponding error message. + * The output is passed by the receiver, which either returns an [AdSelectionOutcome] for a + * successful run, or an [Exception] includes the type of the exception thrown and the + * corresponding error message. * - * If the [IllegalArgumentException] is thrown, it is caused by invalid input argument - * the API received to run the ad selection. + * If the [IllegalArgumentException] is thrown, it is caused by invalid input argument the API + * received to run the ad selection. * * If the [IllegalStateException] is thrown with error message "Failure of AdSelection * services.", it is caused by an internal failure of the ad selection service. * - * If the [TimeoutException] is thrown, it is caused when a timeout is encountered - * during bidding, scoring, or overall selection process to find winning Ad. + * If the [TimeoutException] is thrown, it is caused when a timeout is encountered during + * bidding, scoring, or overall selection process to find winning Ad. * - * If the [LimitExceededException] is thrown, it is caused when the calling package - * exceeds the allowed rate limits and is throttled. + * If the [LimitExceededException] is thrown, it is caused when the calling package exceeds the + * allowed rate limits and is throttled. * - * If the [SecurityException] is thrown, it is caused when the caller is not authorized - * or permission is not requested. + * If the [SecurityException] is thrown, it is caused when the caller is not authorized or + * permission is not requested. * * If the [UnsupportedOperationException] is thrown, it is caused when the Android API level and * AdServices module versions don't support this API. @@ -115,25 +115,25 @@ ): ListenableFuture/** - * Report the given impression. The [ReportImpressionRequest] is provided by the Ads SDK. - * The receiver either returns a {@code void} for a successful run, or an [Exception] - * indicates the error. + * Report the given impression. The [ReportImpressionRequest] is provided by the Ads SDK. The + * receiver either returns a {@code void} for a successful run, or an [Exception] indicates the + * error. * - * If the [IllegalArgumentException] is thrown, it is caused by invalid input argument - * the API received to report the impression. + * If the [IllegalArgumentException] is thrown, it is caused by invalid input argument the API + * received to report the impression. * * If the [IllegalStateException] is thrown with error message "Failure of AdSelection * services.", it is caused by an internal failure of the ad selection service. * - * If the [LimitExceededException] is thrown, it is caused when the calling package - * exceeds the allowed rate limits and is throttled. + * If the [LimitExceededException] is thrown, it is caused when the calling package exceeds the + * allowed rate limits and is throttled. * - * If the [SecurityException] is thrown, it is caused when the caller is not authorized - * or permission is not requested. + * If the [SecurityException] is thrown, it is caused when the caller is not authorized or + * permission is not requested. * * If the [UnsupportedOperationException] is thrown, it is caused when the Android API level and - * AdServices module versions don't support [ReportImpressionRequest] with null - * {@code AdSelectionConfig} + * AdServices module versions don't support [ReportImpressionRequest] with null {@code + * AdSelectionConfig} * * @param reportImpressionRequest the request for reporting impression. */ @@ -149,28 +149,28 @@ * when the ad event will be reported. The event reporting could be delayed and reports could be * batched. * - * Using [ReportEventRequest#getKey()], the service will fetch the {@code reportingUri} - * that was registered in {@code registerAdBeacon}. See documentation of [reportImpressionAsync] - * for more details regarding {@code registerAdBeacon}. Then, the service will attach + * Using [ReportEventRequest#getKey()], the service will fetch the {@code reportingUri} that was + * registered in {@code registerAdBeacon}. See documentation of [reportImpressionAsync] for more + * details regarding {@code registerAdBeacon}. Then, the service will attach * [ReportEventRequest#getData()] to the request body of a POST request and send the request. * The body of the POST request will have the {@code content-type} of {@code text/plain}, and * the data will be transmitted in {@code charset=UTF-8}. * - * The output is passed by the receiver, which either returns an empty [Object] for a - * successful run, or an [Exception] includes the type of the exception thrown and the - * corresponding error message. + * The output is passed by the receiver, which either returns an empty [Object] for a successful + * run, or an [Exception] includes the type of the exception thrown and the corresponding error + * message. * - * If the [IllegalArgumentException] is thrown, it is caused by invalid input argument - * the API received to report the ad event. + * If the [IllegalArgumentException] is thrown, it is caused by invalid input argument the API + * received to report the ad event. * * If the [IllegalStateException] is thrown with error message "Failure of AdSelection * services.", it is caused by an internal failure of the ad selection service. * - * If the [LimitExceededException] is thrown, it is caused when the calling package - * exceeds the allowed rate limits and is throttled. + * If the [LimitExceededException] is thrown, it is caused when the calling package exceeds the + * allowed rate limits and is throttled. * - * If the [SecurityException] is thrown, it is caused when the caller is not authorized - * or permission is not requested. + * If the [SecurityException] is thrown, it is caused when the caller is not authorized or + * permission is not requested. * * If the [UnsupportedOperationException] is thrown, it is caused when the Android API level and * AdServices module versions don't support this API. @@ -181,9 +181,7 @@ */ @ExperimentalFeatures.Ext8OptIn @RequiresPermission(AdServicesPermissions.ACCESS_ADSERVICES_CUSTOM_AUDIENCE) - abstract fun reportEventAsync( - reportEventRequest: ReportEventRequest - ): ListenableFuture + abstract fun reportEventAsync(reportEventRequest: ReportEventRequest): ListenableFuture /** * Updates the counter histograms for an ad which was previously selected by a call to @@ -193,16 +191,14 @@ * candidate ads, where ads whose frequency caps are met or exceeded are removed from the * bidding process during ad selection. * - * Counter histograms can only be updated for ads specified by the given {@code - * adSelectionId} returned by a recent call to Protected Audience API ad selection from the same - * caller app. + * Counter histograms can only be updated for ads specified by the given {@code adSelectionId} + * returned by a recent call to Protected Audience API ad selection from the same caller app. * * A [SecurityException] is returned if: - * * - *
the app has not declared the correct permissions in its manifest, or - *the app or entity identified by the {@code callerAdTechIdentifier} are not authorized - * to use the API. + *the app has not declared the correct permissions in its manifest, or + *the app or entity identified by the {@code callerAdTechIdentifier} are not authorized to + * use the API. * * * An [IllegalStateException] is returned if the call does not come from an app with a @@ -220,8 +216,7 @@ */ @ExperimentalFeatures.Ext8OptIn @RequiresPermission(AdServicesPermissions.ACCESS_ADSERVICES_CUSTOM_AUDIENCE) - abstract fun - updateAdCounterHistogramAsync( + abstract fun updateAdCounterHistogramAsync( updateAdCounterHistogramRequest: UpdateAdCounterHistogramRequest ): ListenableFuture@@ -231,27 +226,27 @@ * * Custom audience ads must have a {@code ad_render_id} to be eligible for to be collected. * - * See [AdSelectionManager#persistAdSelectionResult] for how to process the results of - * the ad selection run on server-side with the blob generated by this API. + * See [AdSelectionManager#persistAdSelectionResult] for how to process the results of the ad + * selection run on server-side with the blob generated by this API. * - * The output is passed by the receiver, which either returns an [GetAdSelectionDataOutcome] - * for a successful run, or an [Exception] includes the type of - * the exception thrown and the corresponding error message. + * The output is passed by the receiver, which either returns an [GetAdSelectionDataOutcome] for + * a successful run, or an [Exception] includes the type of the exception thrown and the + * corresponding error message. * - * If the [IllegalArgumentException] is thrown, it is caused by invalid input argument - * the API received to run the ad selection. + * If the [IllegalArgumentException] is thrown, it is caused by invalid input argument the API + * received to run the ad selection. * * If the [IllegalStateException] is thrown with error message "Failure of AdSelection * services.", it is caused by an internal failure of the ad selection service. * - * If the [TimeoutException] is thrown, it is caused when a timeout is encountered - * during bidding, scoring, or overall selection process to find winning Ad. + * If the [TimeoutException] is thrown, it is caused when a timeout is encountered during + * bidding, scoring, or overall selection process to find winning Ad. * - * If the [LimitExceededException] is thrown, it is caused when the calling package - * exceeds the allowed rate limits and is throttled. + * If the [LimitExceededException] is thrown, it is caused when the calling package exceeds the + * allowed rate limits and is throttled. * - * If the [SecurityException] is thrown, it is caused when the caller is not authorized - * or permission is not requested. + * If the [SecurityException] is thrown, it is caused when the caller is not authorized or + * permission is not requested. * * If the [UnsupportedOperationException] is thrown, it is caused when the Android API level and * AdServices module versions don't support this API. @@ -267,27 +262,27 @@ /** * Persists the ad selection results from the server-side. * - * See [AdSelectionManager#getAdSelectionData] for how to generate an encrypted blob to - * run an ad selection on the server side. + * See [AdSelectionManager#getAdSelectionData] for how to generate an encrypted blob to run an + * ad selection on the server side. * - * The output is passed by the receiver, which either returns an [AdSelectionOutcome] - * for a successful run, or an [Exception] includes the type of the exception thrown and - * the corresponding error message. + * The output is passed by the receiver, which either returns an [AdSelectionOutcome] for a + * successful run, or an [Exception] includes the type of the exception thrown and the + * corresponding error message. * - * If the [IllegalArgumentException] is thrown, it is caused by invalid input argument - * the API received to run the ad selection. + * If the [IllegalArgumentException] is thrown, it is caused by invalid input argument the API + * received to run the ad selection. * * If the [IllegalStateException] is thrown with error message "Failure of AdSelection * services.", it is caused by an internal failure of the ad selection service. * - * If the [TimeoutException] is thrown, it is caused when a timeout is encountered - * during bidding, scoring, or overall selection process to find winning Ad. + * If the [TimeoutException] is thrown, it is caused when a timeout is encountered during + * bidding, scoring, or overall selection process to find winning Ad. * - * If the [LimitExceededException] is thrown, it is caused when the calling package - * exceeds the allowed rate limits and is throttled. + * If the [LimitExceededException] is thrown, it is caused when the calling package exceeds the + * allowed rate limits and is throttled. * - * If the [SecurityException] is thrown, it is caused when the caller is not authorized - * or permission is not requested. + * If the [SecurityException] is thrown, it is caused when the caller is not authorized or + * permission is not requested. * * If the [UnsupportedOperationException] is thrown, it is caused when the Android API level and * AdServices module versions don't support this API. @@ -300,17 +295,16 @@ persistAdSelectionResultRequest: PersistAdSelectionResultRequest ): ListenableFuture - private class Api33Ext4JavaImpl( - private val mAdSelectionManager: AdSelectionManager? - ) : AdSelectionManagerFutures() { + private class Api33Ext4JavaImpl(private val mAdSelectionManager: AdSelectionManager?) : + AdSelectionManagerFutures() { @DoNotInline @RequiresPermission(AdServicesPermissions.ACCESS_ADSERVICES_CUSTOM_AUDIENCE) override fun selectAdsAsync( adSelectionConfig: AdSelectionConfig ): ListenableFuture { - return CoroutineScope(Dispatchers.Default).async { - mAdSelectionManager!!.selectAds(adSelectionConfig) - }.asListenableFuture() + return CoroutineScope(Dispatchers.Default) + .async { mAdSelectionManager!!.selectAds(adSelectionConfig) } + .asListenableFuture() } @OptIn(ExperimentalFeatures.Ext10OptIn::class) @@ -319,9 +313,9 @@ override fun selectAdsAsync( adSelectionFromOutcomesConfig: AdSelectionFromOutcomesConfig ): ListenableFuture{ - return CoroutineScope(Dispatchers.Default).async { - mAdSelectionManager!!.selectAds(adSelectionFromOutcomesConfig) - }.asListenableFuture() + return CoroutineScope(Dispatchers.Default) + .async { mAdSelectionManager!!.selectAds(adSelectionFromOutcomesConfig) } + .asListenableFuture() } @DoNotInline @@ -329,9 +323,9 @@ override fun reportImpressionAsync( reportImpressionRequest: ReportImpressionRequest ): ListenableFuture{ - return CoroutineScope(Dispatchers.Default).async { - mAdSelectionManager!!.reportImpression(reportImpressionRequest) - }.asListenableFuture() + return CoroutineScope(Dispatchers.Default) + .async { mAdSelectionManager!!.reportImpression(reportImpressionRequest) } + .asListenableFuture() } @DoNotInline @@ -339,9 +333,11 @@ override fun updateAdCounterHistogramAsync( updateAdCounterHistogramRequest: UpdateAdCounterHistogramRequest ): ListenableFuture{ - return CoroutineScope(Dispatchers.Default).async { - mAdSelectionManager!!.updateAdCounterHistogram(updateAdCounterHistogramRequest) - }.asListenableFuture() + return CoroutineScope(Dispatchers.Default) + .async { + mAdSelectionManager!!.updateAdCounterHistogram(updateAdCounterHistogramRequest) + } + .asListenableFuture() } @OptIn(ExperimentalFeatures.Ext8OptIn::class) @@ -350,9 +346,9 @@ override fun reportEventAsync( reportEventRequest: ReportEventRequest ): ListenableFuture{ - return CoroutineScope(Dispatchers.Default).async { - mAdSelectionManager!!.reportEvent(reportEventRequest) - }.asListenableFuture() + return CoroutineScope(Dispatchers.Default) + .async { mAdSelectionManager!!.reportEvent(reportEventRequest) } + .asListenableFuture() } @OptIn(ExperimentalFeatures.Ext10OptIn::class) @@ -361,9 +357,9 @@ override fun getAdSelectionDataAsync( getAdSelectionDataRequest: GetAdSelectionDataRequest ): ListenableFuture{ - return CoroutineScope(Dispatchers.Default).async { - mAdSelectionManager!!.getAdSelectionData(getAdSelectionDataRequest) - }.asListenableFuture() + return CoroutineScope(Dispatchers.Default) + .async { mAdSelectionManager!!.getAdSelectionData(getAdSelectionDataRequest) } + .asListenableFuture() } @OptIn(ExperimentalFeatures.Ext10OptIn::class) @@ -372,18 +368,20 @@ override fun persistAdSelectionResultAsync( persistAdSelectionResultRequest: PersistAdSelectionResultRequest ): ListenableFuture{ - return CoroutineScope(Dispatchers.Default).async { - mAdSelectionManager!!.persistAdSelectionResult(persistAdSelectionResultRequest) - }.asListenableFuture() + return CoroutineScope(Dispatchers.Default) + .async { + mAdSelectionManager!!.persistAdSelectionResult(persistAdSelectionResultRequest) + } + .asListenableFuture() } } companion object { /** - * Creates [AdSelectionManagerFutures]. + * Creates [AdSelectionManagerFutures]. * - * @return AdSelectionManagerFutures object. If the device is running an incompatible - * build, the value returned is null. + * @return AdSelectionManagerFutures object. If the device is running an incompatible build, + * the value returned is null. */ @JvmStatic fun from(context: Context): AdSelectionManagerFutures? {
diff --git a/privacysandbox/ads/ads-adservices-java/src/main/java/androidx/privacysandbox/ads/adservices/java/appsetid/AppSetIdManagerFutures.kt b/privacysandbox/ads/ads-adservices-java/src/main/java/androidx/privacysandbox/ads/adservices/java/appsetid/AppSetIdManagerFutures.kt index 775548f..0f809dc 100644 --- a/privacysandbox/ads/ads-adservices-java/src/main/java/androidx/privacysandbox/ads/adservices/java/appsetid/AppSetIdManagerFutures.kt +++ b/privacysandbox/ads/ads-adservices-java/src/main/java/androidx/privacysandbox/ads/adservices/java/appsetid/AppSetIdManagerFutures.kt
@@ -41,23 +41,22 @@ */ abstract fun getAppSetIdAsync(): ListenableFuture- private class Api33Ext4JavaImpl( - private val mAppSetIdManager: AppSetIdManager - ) : AppSetIdManagerFutures() { + private class Api33Ext4JavaImpl(private val mAppSetIdManager: AppSetIdManager) : + AppSetIdManagerFutures() { @DoNotInline override fun getAppSetIdAsync(): ListenableFuture { - return CoroutineScope(Dispatchers.Default).async { - mAppSetIdManager.getAppSetId() - }.asListenableFuture() + return CoroutineScope(Dispatchers.Default) + .async { mAppSetIdManager.getAppSetId() } + .asListenableFuture() } } companion object { /** - * Creates [AppSetIdManagerFutures]. + * Creates [AppSetIdManagerFutures]. * - * @return AppSetIdManagerFutures object. If the device is running an incompatible - * build, the value returned is null. + * @return AppSetIdManagerFutures object. If the device is running an incompatible build, + * the value returned is null. */ @JvmStatic fun from(context: Context): AppSetIdManagerFutures? {
diff --git a/privacysandbox/ads/ads-adservices-java/src/main/java/androidx/privacysandbox/ads/adservices/java/customaudience/CustomAudienceManagerFutures.kt b/privacysandbox/ads/ads-adservices-java/src/main/java/androidx/privacysandbox/ads/adservices/java/customaudience/CustomAudienceManagerFutures.kt index ee6d8a3..f64ccbf 100644 --- a/privacysandbox/ads/ads-adservices-java/src/main/java/androidx/privacysandbox/ads/adservices/java/customaudience/CustomAudienceManagerFutures.kt +++ b/privacysandbox/ads/ads-adservices-java/src/main/java/androidx/privacysandbox/ads/adservices/java/customaudience/CustomAudienceManagerFutures.kt
@@ -35,8 +35,8 @@ import kotlinx.coroutines.async /** - * This class provides APIs for app and ad-SDKs to join / leave custom audiences. - * This class can be used by Java clients. + * This class provides APIs for app and ad-SDKs to join / leave custom audiences. This class can be + * used by Java clients. */ abstract class CustomAudienceManagerFutures internal constructor() { @@ -50,32 +50,27 @@ * Note that the ads list can be completely overwritten by the daily background fetch job. * * This call fails with an [SecurityException] if - * *- *
the {@code ownerPackageName} is not calling app's package name and/or - *the buyer is not authorized to use the API. + *the {@code ownerPackageName} is not calling app's package name and/or + *the buyer is not authorized to use the API. * * * This call fails with an [IllegalArgumentException] if - * *- *
the storage limit has been exceeded by the calling application and/or - *any URI parameters in the [CustomAudience] given are not authenticated with the - * [CustomAudience] buyer. + *the storage limit has been exceeded by the calling application and/or + *any URI parameters in the [CustomAudience] given are not authenticated with the + * [CustomAudience] buyer. * * - * This call fails with [LimitExceededException] if the calling package exceeds the - * allowed rate limits and is throttled. + * This call fails with [LimitExceededException] if the calling package exceeds the allowed rate + * limits and is throttled. * - * This call fails with an [IllegalStateException] if an internal service error is - * encountered. + * This call fails with an [IllegalStateException] if an internal service error is encountered. * * @param request The request to join custom audience. */ @RequiresPermission(AdServicesPermissions.ACCESS_ADSERVICES_CUSTOM_AUDIENCE) - abstract fun joinCustomAudienceAsync( - request: JoinCustomAudienceRequest - ): ListenableFuture+ abstract fun joinCustomAudienceAsync(request: JoinCustomAudienceRequest): ListenableFuture /** * Adds the user to the [CustomAudience] fetched from a {@code fetchUri}. @@ -87,22 +82,20 @@ * Note that the ads list can be completely overwritten by the daily background fetch job. * * This call fails with an [SecurityException] if - * * - *
the {@code ownerPackageName} is not calling app's package name and/or - *the buyer is not authorized to use the API. + *the {@code ownerPackageName} is not calling app's package name and/or + *the buyer is not authorized to use the API. * * * This call fails with an [IllegalArgumentException] if - * *- *
the storage limit has been exceeded by the calling application and/or - *any URI parameters in the [CustomAudience] given are not authenticated with the - * [CustomAudience] buyer. + *the storage limit has been exceeded by the calling application and/or + *any URI parameters in the [CustomAudience] given are not authenticated with the + * [CustomAudience] buyer. * * - * This call fails with [LimitExceededException] if the calling package exceeds the - * allowed rate limits and is throttled. + * This call fails with [LimitExceededException] if the calling package exceeds the allowed rate + * limits and is throttled. * * This call fails with an [IllegalStateException] if an internal service error is encountered. * @@ -118,19 +111,17 @@ ): ListenableFuture/** - * Attempts to remove a user from a custom audience by deleting any existing - * [CustomAudience] data, identified by {@code ownerPackageName}, {@code buyer}, and {@code - * name}. + * Attempts to remove a user from a custom audience by deleting any existing [CustomAudience] + * data, identified by {@code ownerPackageName}, {@code buyer}, and {@code name}. * * This call fails with an [SecurityException] if - * * - *
the {@code ownerPackageName} is not calling app's package name; and/or - *the buyer is not authorized to use the API. + *the {@code ownerPackageName} is not calling app's package name; and/or + *the buyer is not authorized to use the API. * * - * This call fails with [LimitExceededException] if the calling package exceeds the - * allowed rate limits and is throttled. + * This call fails with [LimitExceededException] if the calling package exceeds the allowed rate + * limits and is throttled. * * This call does not inform the caller whether the custom audience specified existed in * on-device storage. In other words, it will fail silently when a buyer attempts to leave a @@ -143,17 +134,16 @@ request: LeaveCustomAudienceRequest ): ListenableFuture- private class Api33Ext4JavaImpl( - private val mCustomAudienceManager: CustomAudienceManager? - ) : CustomAudienceManagerFutures() { + private class Api33Ext4JavaImpl(private val mCustomAudienceManager: CustomAudienceManager?) : + CustomAudienceManagerFutures() { @DoNotInline @RequiresPermission(AdServicesPermissions.ACCESS_ADSERVICES_CUSTOM_AUDIENCE) override fun joinCustomAudienceAsync( request: JoinCustomAudienceRequest ): ListenableFuture { - return CoroutineScope(Dispatchers.Default).async { - mCustomAudienceManager!!.joinCustomAudience(request) - }.asListenableFuture() + return CoroutineScope(Dispatchers.Default) + .async { mCustomAudienceManager!!.joinCustomAudience(request) } + .asListenableFuture() } @OptIn(ExperimentalFeatures.Ext10OptIn::class) @@ -162,9 +152,9 @@ override fun fetchAndJoinCustomAudienceAsync( request: FetchAndJoinCustomAudienceRequest ): ListenableFuture{ - return CoroutineScope(Dispatchers.Default).async { - mCustomAudienceManager!!.fetchAndJoinCustomAudience(request) - }.asListenableFuture() + return CoroutineScope(Dispatchers.Default) + .async { mCustomAudienceManager!!.fetchAndJoinCustomAudience(request) } + .asListenableFuture() } @DoNotInline @@ -172,18 +162,18 @@ override fun leaveCustomAudienceAsync( request: LeaveCustomAudienceRequest ): ListenableFuture{ - return CoroutineScope(Dispatchers.Default).async { - mCustomAudienceManager!!.leaveCustomAudience(request) - }.asListenableFuture() + return CoroutineScope(Dispatchers.Default) + .async { mCustomAudienceManager!!.leaveCustomAudience(request) } + .asListenableFuture() } } companion object { /** - * Creates [CustomAudienceManagerFutures]. + * Creates [CustomAudienceManagerFutures]. * - * @return CustomAudienceManagerFutures object. If the device is running an incompatible - * build, the value returned is null. + * @return CustomAudienceManagerFutures object. If the device is running an incompatible + * build, the value returned is null. */ @JvmStatic fun from(context: Context): CustomAudienceManagerFutures? {
diff --git a/privacysandbox/ads/ads-adservices-java/src/main/java/androidx/privacysandbox/ads/adservices/java/internal/CoroutineAdapter.kt b/privacysandbox/ads/ads-adservices-java/src/main/java/androidx/privacysandbox/ads/adservices/java/internal/CoroutineAdapter.kt index b4f03c4..f5a4474 100644 --- a/privacysandbox/ads/ads-adservices-java/src/main/java/androidx/privacysandbox/ads/adservices/java/internal/CoroutineAdapter.kt +++ b/privacysandbox/ads/ads-adservices-java/src/main/java/androidx/privacysandbox/ads/adservices/java/internal/CoroutineAdapter.kt
@@ -26,19 +26,19 @@ @OptIn(ExperimentalCoroutinesApi::class) internal funDeferred tag: Any? = "Deferred.asListenableFuture" -): ListenableFuture.asListenableFuture( = CallbackToFutureAdapter.getFuture { completer -> - - this.invokeOnCompletion { - if (it != null) { - if (it is CancellationException) { - completer.setCancelled() +): ListenableFuture= + CallbackToFutureAdapter.getFuture { completer -> + this.invokeOnCompletion { + if (it != null) { + if (it is CancellationException) { + completer.setCancelled() + } else { + completer.setException(it) + } } else { - completer.setException(it) + // Ignore exceptions - This should never throw in this situation. + completer.set(this.getCompleted()) } - } else { - // Ignore exceptions - This should never throw in this situation. - completer.set(this.getCompleted()) } + tag } - tag -}
diff --git a/privacysandbox/ads/ads-adservices-java/src/main/java/androidx/privacysandbox/ads/adservices/java/measurement/MeasurementManagerFutures.kt b/privacysandbox/ads/ads-adservices-java/src/main/java/androidx/privacysandbox/ads/adservices/java/measurement/MeasurementManagerFutures.kt index e6c5487..26d1645 100644 --- a/privacysandbox/ads/ads-adservices-java/src/main/java/androidx/privacysandbox/ads/adservices/java/measurement/MeasurementManagerFutures.kt +++ b/privacysandbox/ads/ads-adservices-java/src/main/java/androidx/privacysandbox/ads/adservices/java/measurement/MeasurementManagerFutures.kt
@@ -47,17 +47,15 @@ * @return ListenableFuture. If the deletion is successful, result is null. */ @SuppressWarnings("MissingNullability") - abstract fun deleteRegistrationsAsync( - deletionRequest: DeletionRequest - ): ListenableFuture+ abstract fun deleteRegistrationsAsync(deletionRequest: DeletionRequest): ListenableFuture /** * Register an attribution source (click or view). * * @param attributionSource the platform issues a request to this URI in order to fetch metadata - * associated with the attribution source. + * associated with the attribution source. * @param inputEvent either an [InputEvent] object (for a click event) or null (for a view - * event). + * event). */ @SuppressWarnings("MissingNullability") @RequiresPermission(AdServicesPermissions.ACCESS_ADSERVICES_ATTRIBUTION) @@ -70,7 +68,7 @@ * Register a trigger (conversion). * * @param trigger the API issues a request to this URI to fetch metadata associated with the - * trigger. + * trigger. */ @SuppressWarnings("MissingNullability") @RequiresPermission(AdServicesPermissions.ACCESS_ADSERVICES_ATTRIBUTION) @@ -85,9 +83,7 @@ @ExperimentalFeatures.RegisterSourceOptIn @SuppressWarnings("MissingNullability") @RequiresPermission(AdServicesPermissions.ACCESS_ADSERVICES_ATTRIBUTION) - abstract fun registerSourceAsync( - request: SourceRegistrationRequest - ): ListenableFuture + abstract fun registerSourceAsync(request: SourceRegistrationRequest): ListenableFuture /** * Register an attribution source(click or view) from web context. This API will not process any @@ -125,17 +121,16 @@ @RequiresPermission(AdServicesPermissions.ACCESS_ADSERVICES_ATTRIBUTION) abstract fun getMeasurementApiStatusAsync(): ListenableFuture - private class Api33Ext5JavaImpl( - private val mMeasurementManager: MeasurementManager - ) : MeasurementManagerFutures() { + private class Api33Ext5JavaImpl(private val mMeasurementManager: MeasurementManager) : + MeasurementManagerFutures() { @DoNotInline @RequiresPermission(AdServicesPermissions.ACCESS_ADSERVICES_ATTRIBUTION) override fun deleteRegistrationsAsync( deletionRequest: DeletionRequest ): ListenableFuture { - return CoroutineScope(Dispatchers.Default).async { - mMeasurementManager.deleteRegistrations(deletionRequest) - }.asListenableFuture() + return CoroutineScope(Dispatchers.Default) + .async { mMeasurementManager.deleteRegistrations(deletionRequest) } + .asListenableFuture() } @DoNotInline @@ -144,9 +139,9 @@ attributionSource: Uri, inputEvent: InputEvent? ): ListenableFuture{ - return CoroutineScope(Dispatchers.Default).async { - mMeasurementManager.registerSource(attributionSource, inputEvent) - }.asListenableFuture() + return CoroutineScope(Dispatchers.Default) + .async { mMeasurementManager.registerSource(attributionSource, inputEvent) } + .asListenableFuture() } @DoNotInline @@ -155,17 +150,17 @@ override fun registerSourceAsync( request: SourceRegistrationRequest ): ListenableFuture{ - return CoroutineScope(Dispatchers.Default).async { - mMeasurementManager.registerSource(request) - }.asListenableFuture() + return CoroutineScope(Dispatchers.Default) + .async { mMeasurementManager.registerSource(request) } + .asListenableFuture() } @DoNotInline @RequiresPermission(AdServicesPermissions.ACCESS_ADSERVICES_ATTRIBUTION) override fun registerTriggerAsync(trigger: Uri): ListenableFuture{ - return CoroutineScope(Dispatchers.Default).async { - mMeasurementManager.registerTrigger(trigger) - }.asListenableFuture() + return CoroutineScope(Dispatchers.Default) + .async { mMeasurementManager.registerTrigger(trigger) } + .asListenableFuture() } @DoNotInline @@ -173,9 +168,9 @@ override fun registerWebSourceAsync( request: WebSourceRegistrationRequest ): ListenableFuture{ - return CoroutineScope(Dispatchers.Default).async { - mMeasurementManager.registerWebSource(request) - }.asListenableFuture() + return CoroutineScope(Dispatchers.Default) + .async { mMeasurementManager.registerWebSource(request) } + .asListenableFuture() } @DoNotInline @@ -183,26 +178,26 @@ override fun registerWebTriggerAsync( request: WebTriggerRegistrationRequest, ): ListenableFuture{ - return CoroutineScope(Dispatchers.Default).async { - mMeasurementManager.registerWebTrigger(request) - }.asListenableFuture() + return CoroutineScope(Dispatchers.Default) + .async { mMeasurementManager.registerWebTrigger(request) } + .asListenableFuture() } @DoNotInline @RequiresPermission(AdServicesPermissions.ACCESS_ADSERVICES_ATTRIBUTION) override fun getMeasurementApiStatusAsync(): ListenableFuture{ - return CoroutineScope(Dispatchers.Default).async { - mMeasurementManager.getMeasurementApiStatus() - }.asListenableFuture() + return CoroutineScope(Dispatchers.Default) + .async { mMeasurementManager.getMeasurementApiStatus() } + .asListenableFuture() } } companion object { /** - * Creates [MeasurementManagerFutures]. + * Creates [MeasurementManagerFutures]. * - * @return MeasurementManagerFutures object. If the device is running an incompatible - * build, the value returned is null. + * @return MeasurementManagerFutures object. If the device is running an incompatible build, + * the value returned is null. */ @JvmStatic fun from(context: Context): MeasurementManagerFutures? {
diff --git a/privacysandbox/ads/ads-adservices-java/src/main/java/androidx/privacysandbox/ads/adservices/java/topics/TopicsManagerFutures.kt b/privacysandbox/ads/ads-adservices-java/src/main/java/androidx/privacysandbox/ads/adservices/java/topics/TopicsManagerFutures.kt index a45563f..026963b 100644 --- a/privacysandbox/ads/ads-adservices-java/src/main/java/androidx/privacysandbox/ads/adservices/java/topics/TopicsManagerFutures.kt +++ b/privacysandbox/ads/ads-adservices-java/src/main/java/androidx/privacysandbox/ads/adservices/java/topics/TopicsManagerFutures.kt
@@ -31,8 +31,8 @@ import kotlinx.coroutines.async /** - * This provides APIs for App and Ad-Sdks to get the user interest topics in a privacy - * preserving way. This class can be used by Java clients. + * This provides APIs for App and Ad-Sdks to get the user interest topics in a privacy preserving + * way. This class can be used by Java clients. */ abstract class TopicsManagerFutures internal constructor() { /** @@ -44,26 +44,25 @@ @RequiresPermission(AdServicesPermissions.ACCESS_ADSERVICES_TOPICS) abstract fun getTopicsAsync(request: GetTopicsRequest): ListenableFuture- private class CommonApiJavaImpl( - private val mTopicsManager: TopicsManager - ) : TopicsManagerFutures() { + private class CommonApiJavaImpl(private val mTopicsManager: TopicsManager) : + TopicsManagerFutures() { @DoNotInline @RequiresPermission(AdServicesPermissions.ACCESS_ADSERVICES_TOPICS) override fun getTopicsAsync( request: GetTopicsRequest ): ListenableFuture { - return CoroutineScope(Dispatchers.Main).async { - mTopicsManager.getTopics(request) - }.asListenableFuture() + return CoroutineScope(Dispatchers.Main) + .async { mTopicsManager.getTopics(request) } + .asListenableFuture() } } companion object { /** - * Creates [TopicsManagerFutures]. + * Creates [TopicsManagerFutures]. * - * @return TopicsManagerFutures object. If the device is running an incompatible - * build, the value returned is null. + * @return TopicsManagerFutures object. If the device is running an incompatible build, the + * value returned is null. */ @JvmStatic fun from(context: Context): TopicsManagerFutures? {
diff --git a/privacysandbox/ads/ads-adservices/src/androidTest/java/androidx/privacysandbox/ads/adservices/adid/AdIdManagerTest.kt b/privacysandbox/ads/ads-adservices/src/androidTest/java/androidx/privacysandbox/ads/adservices/adid/AdIdManagerTest.kt index 5986858..b1b53a6 100644 --- a/privacysandbox/ads/ads-adservices/src/androidTest/java/androidx/privacysandbox/ads/adservices/adid/AdIdManagerTest.kt +++ b/privacysandbox/ads/ads-adservices/src/androidTest/java/androidx/privacysandbox/ads/adservices/adid/AdIdManagerTest.kt
@@ -62,9 +62,10 @@ if (mValidAdExtServicesSdkExtVersionS || mValidAdExtServicesSdkExtVersionR) { // setup a mockitoSession to return the mocked manager // when the static method .get() is called - mSession = ExtendedMockito.mockitoSession() - .mockStatic(android.adservices.adid.AdIdManager::class.java) - .startMocking() + mSession = + ExtendedMockito.mockitoSession() + .mockStatic(android.adservices.adid.AdIdManager::class.java) + .startMocking() } } @@ -84,8 +85,10 @@ @Test fun testAdIdManagerNoClassDefFoundError() { - Assume.assumeTrue("minSdkVersion = API 31/32 ext 9 or API 30 ext 11", - mValidAdExtServicesSdkExtVersionS || mValidAdExtServicesSdkExtVersionR) + Assume.assumeTrue( + "minSdkVersion = API 31/32 ext 9 or API 30 ext 11", + mValidAdExtServicesSdkExtVersionS || mValidAdExtServicesSdkExtVersionR + ) `when`(android.adservices.adid.AdIdManager.get(any())).thenThrow(NoClassDefFoundError()) assertThat(AdIdManager.obtain(mContext)).isNull() @@ -95,8 +98,10 @@ fun testAdIdAsync() { val validExtServicesVersion = mValidAdExtServicesSdkExtVersionS || mValidAdExtServicesSdkExtVersionR - Assume.assumeTrue("minSdkVersion = API 33 ext 4 or API 31/32 ext 9 or API 30 ext 11", - mValidAdServicesSdkExtVersion || validExtServicesVersion) + Assume.assumeTrue( + "minSdkVersion = API 33 ext 4 or API 31/32 ext 9 or API 30 ext 11", + mValidAdServicesSdkExtVersion || validExtServicesVersion + ) val adIdManager = mockAdIdManager(mContext, validExtServicesVersion) @@ -108,9 +113,7 @@ val managerCompat = AdIdManager.obtain(mContext) // Actually invoke the compat code. - val result = runBlocking { - managerCompat!!.getAdId() - } + val result = runBlocking { managerCompat!!.getAdId() } // Verify that the compat code was invoked correctly. when (mValidAdExtServicesSdkExtVersionR) { @@ -134,8 +137,7 @@ val adIdManager = mock(android.adservices.adid.AdIdManager::class.java) // only mock the .get() method if using extServices version if (isExtServices) { - `when`(android.adservices.adid.AdIdManager.get(any())) - .thenReturn(adIdManager) + `when`(android.adservices.adid.AdIdManager.get(any())).thenReturn(adIdManager) } else { `when`(spyContext.getSystemService(android.adservices.adid.AdIdManager::class.java)) .thenReturn(adIdManager) @@ -147,13 +149,14 @@ // Set up the response that AdIdManager will return when the compat code calls it. val adId = android.adservices.adid.AdId("1234", false) val answer = { args: InvocationOnMock -> - val receiver = args.getArgument< - OutcomeReceiver>(1) + val receiver = + args.getArgument>(1) receiver.onResult(adId) null } doAnswer(answer) - .`when`(adIdManager).getAdId( + .`when`(adIdManager) + .getAdId( any(), any>() ) @@ -163,29 +166,37 @@ // Set up the response that AdIdManager will return when the compat code calls it. val adId = android.adservices.adid.AdId("1234", false) val answer = { args: InvocationOnMock -> - val receiver = args.getArgument< - AdServicesOutcomeReceiver>(1) + val receiver = + args.getArgument< + AdServicesOutcomeReceiver+ >( + 1 + ) receiver.onResult(adId) null } - doAnswer(answer).`when`(adIdManager).getAdId( + doAnswer(answer) + .`when`(adIdManager) + .getAdId( any (), any>() ) } private fun verifyOnR(adIdManager: android.adservices.adid.AdIdManager) { - verify(adIdManager).getAdId( - any(), - any>() - ) + verify(adIdManager) + .getAdId( + any(), + any>() + ) } private fun verifyOnSPlus(adIdManager: android.adservices.adid.AdIdManager) { - verify(adIdManager).getAdId( - any(), - any>() - ) + verify(adIdManager) + .getAdId( + any(), + any>() + ) } private fun verifyResponse(adId: AdId) {
diff --git a/privacysandbox/ads/ads-adservices/src/androidTest/java/androidx/privacysandbox/ads/adservices/adselection/AdSelectionConfigTest.kt b/privacysandbox/ads/ads-adservices/src/androidTest/java/androidx/privacysandbox/ads/adservices/adselection/AdSelectionConfigTest.kt index c151692..6c3a31e 100644 --- a/privacysandbox/ads/ads-adservices/src/androidTest/java/androidx/privacysandbox/ads/adservices/adselection/AdSelectionConfigTest.kt +++ b/privacysandbox/ads/ads-adservices/src/androidTest/java/androidx/privacysandbox/ads/adservices/adselection/AdSelectionConfigTest.kt
@@ -36,41 +36,49 @@ private val perBuyerSignals: Map= mutableMapOf(Pair(seller, sellerSignals)) private val trustedScoringSignalsUri: Uri = Uri.parse("www.xyz.com") + @Test fun testToString() { - val result = "AdSelectionConfig: seller=$seller, decisionLogicUri='$decisionLogicUri', " + - "customAudienceBuyers=$customAudienceBuyers, adSelectionSignals=$adSelectionSignals, " + - "sellerSignals=$sellerSignals, perBuyerSignals=$perBuyerSignals, " + - "trustedScoringSignalsUri=$trustedScoringSignalsUri" - val request = AdSelectionConfig( - seller, - decisionLogicUri, - customAudienceBuyers, - adSelectionSignals, - sellerSignals, - perBuyerSignals, - trustedScoringSignalsUri) + val result = + "AdSelectionConfig: seller=$seller, decisionLogicUri='$decisionLogicUri', " + + "customAudienceBuyers=$customAudienceBuyers, adSelectionSignals=$adSelectionSignals, " + + "sellerSignals=$sellerSignals, perBuyerSignals=$perBuyerSignals, " + + "trustedScoringSignalsUri=$trustedScoringSignalsUri" + val request = + AdSelectionConfig( + seller, + decisionLogicUri, + customAudienceBuyers, + adSelectionSignals, + sellerSignals, + perBuyerSignals, + trustedScoringSignalsUri + ) Truth.assertThat(request.toString()).isEqualTo(result) } @Test fun testEquals() { - val adSelectionConfig = AdSelectionConfig( - seller, - decisionLogicUri, - customAudienceBuyers, - adSelectionSignals, - sellerSignals, - perBuyerSignals, - trustedScoringSignalsUri) - var adSelectionConfig2 = AdSelectionConfig( - AdTechIdentifier("1234"), - Uri.parse("www.abc.com"), - customAudienceBuyers, - adSelectionSignals, - sellerSignals, - perBuyerSignals, - trustedScoringSignalsUri) + val adSelectionConfig = + AdSelectionConfig( + seller, + decisionLogicUri, + customAudienceBuyers, + adSelectionSignals, + sellerSignals, + perBuyerSignals, + trustedScoringSignalsUri + ) + var adSelectionConfig2 = + AdSelectionConfig( + AdTechIdentifier("1234"), + Uri.parse("www.abc.com"), + customAudienceBuyers, + adSelectionSignals, + sellerSignals, + perBuyerSignals, + trustedScoringSignalsUri + ) Truth.assertThat(adSelectionConfig == adSelectionConfig2).isTrue() } }
diff --git a/privacysandbox/ads/ads-adservices/src/androidTest/java/androidx/privacysandbox/ads/adservices/adselection/AdSelectionFromOutcomesConfigTest.kt b/privacysandbox/ads/ads-adservices/src/androidTest/java/androidx/privacysandbox/ads/adservices/adselection/AdSelectionFromOutcomesConfigTest.kt index 765abab..f8512e3 100644 --- a/privacysandbox/ads/ads-adservices/src/androidTest/java/androidx/privacysandbox/ads/adservices/adselection/AdSelectionFromOutcomesConfigTest.kt +++ b/privacysandbox/ads/ads-adservices/src/androidTest/java/androidx/privacysandbox/ads/adservices/adselection/AdSelectionFromOutcomesConfigTest.kt
@@ -34,31 +34,39 @@ private val adSelectionIds: List= listOf(10, 11, 12) private val adSelectionSignals: AdSelectionSignals = AdSelectionSignals("adSelSignals") private val selectionLogicUri: Uri = Uri.parse("www.abc.com") + @Test fun testToString() { - val result = "AdSelectionFromOutcomesConfig: seller=$seller, " + - "adSelectionIds='$adSelectionIds', adSelectionSignals=$adSelectionSignals, " + - "selectionLogicUri=$selectionLogicUri" - val request = AdSelectionFromOutcomesConfig( - seller, - adSelectionIds, - adSelectionSignals, - selectionLogicUri) + val result = + "AdSelectionFromOutcomesConfig: seller=$seller, " + + "adSelectionIds='$adSelectionIds', adSelectionSignals=$adSelectionSignals, " + + "selectionLogicUri=$selectionLogicUri" + val request = + AdSelectionFromOutcomesConfig( + seller, + adSelectionIds, + adSelectionSignals, + selectionLogicUri + ) Truth.assertThat(request.toString()).isEqualTo(result) } @Test fun testEquals() { - val adSelectionFromOutcomesConfig = AdSelectionFromOutcomesConfig( - seller, - adSelectionIds, - adSelectionSignals, - selectionLogicUri) - var adSelectionFromOutcomesConfig2 = AdSelectionFromOutcomesConfig( - AdTechIdentifier("1234"), - adSelectionIds, - adSelectionSignals, - Uri.parse("www.abc.com")) + val adSelectionFromOutcomesConfig = + AdSelectionFromOutcomesConfig( + seller, + adSelectionIds, + adSelectionSignals, + selectionLogicUri + ) + var adSelectionFromOutcomesConfig2 = + AdSelectionFromOutcomesConfig( + AdTechIdentifier("1234"), + adSelectionIds, + adSelectionSignals, + Uri.parse("www.abc.com") + ) Truth.assertThat(adSelectionFromOutcomesConfig == adSelectionFromOutcomesConfig2).isTrue() } }
diff --git a/privacysandbox/ads/ads-adservices/src/androidTest/java/androidx/privacysandbox/ads/adservices/adselection/AdSelectionManagerTest.kt b/privacysandbox/ads/ads-adservices/src/androidTest/java/androidx/privacysandbox/ads/adservices/adselection/AdSelectionManagerTest.kt index 66f88dd..9ee554d3 100644 --- a/privacysandbox/ads/ads-adservices/src/androidTest/java/androidx/privacysandbox/ads/adservices/adselection/AdSelectionManagerTest.kt +++ b/privacysandbox/ads/ads-adservices/src/androidTest/java/androidx/privacysandbox/ads/adservices/adselection/AdSelectionManagerTest.kt
@@ -69,10 +69,11 @@ if (mValidAdExtServicesSdkExtVersion) { // setup a mockitoSession to return the mocked manager // when the static method .get() is called - mSession = mockitoSession() - .mockStatic(android.adservices.adselection.AdSelectionManager::class.java) - .strictness(Strictness.LENIENT) - .startMocking() + mSession = + mockitoSession() + .mockStatic(android.adservices.adselection.AdSelectionManager::class.java) + .strictness(Strictness.LENIENT) + .startMocking() } } @@ -91,11 +92,10 @@ @Test fun testAdSelectionManagerNoClassDefFoundError() { - Assume.assumeTrue("minSdkVersion = API 31/32 ext 9", mValidAdExtServicesSdkExtVersion); + Assume.assumeTrue("minSdkVersion = API 31/32 ext 9", mValidAdExtServicesSdkExtVersion) - `when`(android.adservices.adselection.AdSelectionManager.get(any())).thenThrow( - NoClassDefFoundError() - ) + `when`(android.adservices.adselection.AdSelectionManager.get(any())) + .thenThrow(NoClassDefFoundError()) assertThat(obtain(mContext)).isNull() } @@ -103,116 +103,122 @@ @SdkSuppress(maxSdkVersion = 34, minSdkVersion = 31) fun testUpdateAdCounterHistogramOlderVersions() { /* AdServices or ExtServices are present */ - Assume.assumeTrue("minSdkVersion = API 33 ext 4 or API 31/32 ext 9", - mValidAdServicesSdkExtVersion || mValidAdExtServicesSdkExtVersion) + Assume.assumeTrue( + "minSdkVersion = API 33 ext 4 or API 31/32 ext 9", + mValidAdServicesSdkExtVersion || mValidAdExtServicesSdkExtVersion + ) /* API is not available */ - Assume.assumeTrue("maxSdkVersion = API 33/34 ext 7", - AdServicesInfo.adServicesVersion() < 8) + Assume.assumeTrue("maxSdkVersion = API 33/34 ext 7", AdServicesInfo.adServicesVersion() < 8) Assume.assumeTrue("maxSdkVersion = API 31/32 ext 8", !mValidAdExtServicesSdkExtVersion) val managerCompat = obtain(mContext) - val updateAdCounterHistogramRequest = UpdateAdCounterHistogramRequest( - adSelectionId, - adEventType, - seller - ) + val updateAdCounterHistogramRequest = + UpdateAdCounterHistogramRequest(adSelectionId, adEventType, seller) // Verify that it throws an exception assertThrows(UnsupportedOperationException::class.java) { - runBlocking { - managerCompat!!.updateAdCounterHistogram(updateAdCounterHistogramRequest) + runBlocking { + managerCompat!!.updateAdCounterHistogram(updateAdCounterHistogramRequest) + } } - }.hasMessageThat().contains("API is unsupported. Min version is API 33 ext 8 or " + - "API 31/32 ext 9") + .hasMessageThat() + .contains("API is unsupported. Min version is API 33 ext 8 or " + "API 31/32 ext 9") } @Test @SdkSuppress(maxSdkVersion = 34, minSdkVersion = 31) fun testReportEventOlderVersions() { /* AdServices or ExtServices are present */ - Assume.assumeTrue("minSdkVersion = API 33 ext 4 or API 31/32 ext 9", - mValidAdServicesSdkExtVersion || mValidAdExtServicesSdkExtVersion) + Assume.assumeTrue( + "minSdkVersion = API 33 ext 4 or API 31/32 ext 9", + mValidAdServicesSdkExtVersion || mValidAdExtServicesSdkExtVersion + ) /* API is not available */ - Assume.assumeTrue("maxSdkVersion = API 33/34 ext 7", - AdServicesInfo.adServicesVersion() < 8) + Assume.assumeTrue("maxSdkVersion = API 33/34 ext 7", AdServicesInfo.adServicesVersion() < 8) Assume.assumeTrue("maxSdkVersion = API 31/32 ext 8", !mValidAdExtServicesSdkExtVersion) val managerCompat = obtain(mContext) - val reportEventRequest = ReportEventRequest( - adSelectionId, - eventKey, - eventData, - reportingDestinations - ) + val reportEventRequest = + ReportEventRequest(adSelectionId, eventKey, eventData, reportingDestinations) // Verify that it throws an exception assertThrows(UnsupportedOperationException::class.java) { - runBlocking { - managerCompat!!.reportEvent(reportEventRequest) + runBlocking { managerCompat!!.reportEvent(reportEventRequest) } } - }.hasMessageThat().contains("API is unsupported. Min version is API 33 ext 8 or " + - "API 31/32 ext 9") + .hasMessageThat() + .contains("API is unsupported. Min version is API 33 ext 8 or " + "API 31/32 ext 9") } @Test @SdkSuppress(maxSdkVersion = 34, minSdkVersion = 31) fun testGetAdSelectionDataOlderVersions() { /* AdServices or ExtServices are present */ - Assume.assumeTrue("minSdkVersion = API 33 ext 4 or API 31/32 ext 9", - mValidAdServicesSdkExtVersion || mValidAdExtServicesSdkExtVersion) + Assume.assumeTrue( + "minSdkVersion = API 33 ext 4 or API 31/32 ext 9", + mValidAdServicesSdkExtVersion || mValidAdExtServicesSdkExtVersion + ) /* API is not available */ - Assume.assumeTrue("maxSdkVersion = API 31-34 ext 9", - AdServicesInfo.adServicesVersion() < 10 && AdServicesInfo.extServicesVersionS() < 10) + Assume.assumeTrue( + "maxSdkVersion = API 31-34 ext 9", + AdServicesInfo.adServicesVersion() < 10 && AdServicesInfo.extServicesVersionS() < 10 + ) mockAdSelectionManager(mContext, mValidAdExtServicesSdkExtVersion) val managerCompat = obtain(mContext) val getAdSelectionDataRequest = GetAdSelectionDataRequest(seller) // Verify that it throws an exception assertThrows(UnsupportedOperationException::class.java) { - runBlocking { - managerCompat!!.getAdSelectionData(getAdSelectionDataRequest) + runBlocking { managerCompat!!.getAdSelectionData(getAdSelectionDataRequest) } } - }.hasMessageThat().contains("API is not available. Min version is API 31 ext 10") + .hasMessageThat() + .contains("API is not available. Min version is API 31 ext 10") } @Test @SdkSuppress(maxSdkVersion = 34, minSdkVersion = 31) fun testPersistAdSelectionResultOlderVersions() { /* AdServices or ExtServices are present */ - Assume.assumeTrue("minSdkVersion = API 33 ext 4 or API 31/32 ext 9", - mValidAdServicesSdkExtVersion || mValidAdExtServicesSdkExtVersion) + Assume.assumeTrue( + "minSdkVersion = API 33 ext 4 or API 31/32 ext 9", + mValidAdServicesSdkExtVersion || mValidAdExtServicesSdkExtVersion + ) /* API is not available */ - Assume.assumeTrue("maxSdkVersion = API 31-34 ext 9", - AdServicesInfo.adServicesVersion() < 10 && AdServicesInfo.extServicesVersionS() < 10) + Assume.assumeTrue( + "maxSdkVersion = API 31-34 ext 9", + AdServicesInfo.adServicesVersion() < 10 && AdServicesInfo.extServicesVersionS() < 10 + ) mockAdSelectionManager(mContext, mValidAdExtServicesSdkExtVersion) val managerCompat = obtain(mContext) - val persistAdSelectionResultRequest = PersistAdSelectionResultRequest( - adSelectionId, - seller, - adSelectionData - ) + val persistAdSelectionResultRequest = + PersistAdSelectionResultRequest(adSelectionId, seller, adSelectionData) // Verify that it throws an exception assertThrows(UnsupportedOperationException::class.java) { - runBlocking { - managerCompat!!.persistAdSelectionResult(persistAdSelectionResultRequest) + runBlocking { + managerCompat!!.persistAdSelectionResult(persistAdSelectionResultRequest) + } } - }.hasMessageThat().contains("API is not available. Min version is API 31 ext 10") + .hasMessageThat() + .contains("API is not available. Min version is API 31 ext 10") } @Test @SdkSuppress(maxSdkVersion = 34, minSdkVersion = 31) fun testReportImpressionOlderVersions() { /* AdServices or ExtServices are present */ - Assume.assumeTrue("minSdkVersion = API 33 ext 4 or API 31/32 ext 9", - mValidAdServicesSdkExtVersion || mValidAdExtServicesSdkExtVersion) + Assume.assumeTrue( + "minSdkVersion = API 33 ext 4 or API 31/32 ext 9", + mValidAdServicesSdkExtVersion || mValidAdExtServicesSdkExtVersion + ) /* API is not available */ - Assume.assumeTrue("maxSdkVersion = API 31-34 ext 9", - AdServicesInfo.adServicesVersion() < 10 && AdServicesInfo.extServicesVersionS() < 10) + Assume.assumeTrue( + "maxSdkVersion = API 31-34 ext 9", + AdServicesInfo.adServicesVersion() < 10 && AdServicesInfo.extServicesVersionS() < 10 + ) mockAdSelectionManager(mContext, mValidAdExtServicesSdkExtVersion) val managerCompat = obtain(mContext) @@ -220,51 +226,54 @@ // Verify that it throws an exception assertThrows(UnsupportedOperationException::class.java) { - runBlocking { - managerCompat!!.reportImpression(reportImpressionRequest) + runBlocking { managerCompat!!.reportImpression(reportImpressionRequest) } } - }.hasMessageThat().contains("adSelectionConfig is mandatory for" + - "API versions lower than ext 10") + .hasMessageThat() + .contains("adSelectionConfig is mandatory for" + "API versions lower than ext 10") } @Test @SdkSuppress(maxSdkVersion = 34, minSdkVersion = 31) fun testSelectAdsFromOutcomesOlderVersions() { /* AdServices or ExtServices are present */ - Assume.assumeTrue("minSdkVersion = API 33 ext 4 or API 31/32 ext 9", - mValidAdServicesSdkExtVersion || mValidAdExtServicesSdkExtVersion) + Assume.assumeTrue( + "minSdkVersion = API 33 ext 4 or API 31/32 ext 9", + mValidAdServicesSdkExtVersion || mValidAdExtServicesSdkExtVersion + ) /* API is not available */ - Assume.assumeTrue("maxSdkVersion = API 31-34 ext 9", - AdServicesInfo.adServicesVersion() < 10 && AdServicesInfo.extServicesVersionS() < 10) + Assume.assumeTrue( + "maxSdkVersion = API 31-34 ext 9", + AdServicesInfo.adServicesVersion() < 10 && AdServicesInfo.extServicesVersionS() < 10 + ) mockAdSelectionManager(mContext, mValidAdExtServicesSdkExtVersion) val managerCompat = obtain(mContext) // Verify that it throws an exception assertThrows(UnsupportedOperationException::class.java) { - runBlocking { - managerCompat!!.selectAds(adSelectionFromOutcomesConfig) + runBlocking { managerCompat!!.selectAds(adSelectionFromOutcomesConfig) } } - }.hasMessageThat().contains("API is not available. Min version is API 31 ext 10") + .hasMessageThat() + .contains("API is not available. Min version is API 31 ext 10") } @Test fun testSelectAds() { - Assume.assumeTrue("minSdkVersion = API 33 ext 4 or API 31/32 ext 9", - mValidAdServicesSdkExtVersion || mValidAdExtServicesSdkExtVersion) + Assume.assumeTrue( + "minSdkVersion = API 33 ext 4 or API 31/32 ext 9", + mValidAdServicesSdkExtVersion || mValidAdExtServicesSdkExtVersion + ) val adSelectionManager = mockAdSelectionManager(mContext, mValidAdExtServicesSdkExtVersion) setupAdSelectionResponse(adSelectionManager) val managerCompat = obtain(mContext) // Actually invoke the compat code. - val result = runBlocking { - managerCompat!!.selectAds(adSelectionConfig) - } + val result = runBlocking { managerCompat!!.selectAds(adSelectionConfig) } // Verify that the compat code was invoked correctly. - val captor = ArgumentCaptor.forClass( - android.adservices.adselection.AdSelectionConfig::class.java) + val captor = + ArgumentCaptor.forClass(android.adservices.adselection.AdSelectionConfig::class.java) verify(adSelectionManager).selectAds(captor.capture(), any(), any()) // Verify that the request that the compat code makes to the platform is correct. @@ -276,21 +285,23 @@ @Test fun testSelectAdsFromOutcomes() { - Assume.assumeTrue("minSdkVersion = API 31 ext 10", - AdServicesInfo.adServicesVersion() >= 10 || AdServicesInfo.extServicesVersionS() >= 10) + Assume.assumeTrue( + "minSdkVersion = API 31 ext 10", + AdServicesInfo.adServicesVersion() >= 10 || AdServicesInfo.extServicesVersionS() >= 10 + ) val adSelectionManager = mockAdSelectionManager(mContext, mValidAdExtServicesSdkExtVersion) setupAdSelectionFromOutcomesResponse(adSelectionManager) val managerCompat = obtain(mContext) // Actually invoke the compat code. - val result = runBlocking { - managerCompat!!.selectAds(adSelectionFromOutcomesConfig) - } + val result = runBlocking { managerCompat!!.selectAds(adSelectionFromOutcomesConfig) } // Verify that the compat code was invoked correctly. - val captor = ArgumentCaptor.forClass( - android.adservices.adselection.AdSelectionFromOutcomesConfig::class.java) + val captor = + ArgumentCaptor.forClass( + android.adservices.adselection.AdSelectionFromOutcomesConfig::class.java + ) verify(adSelectionManager).selectAds(captor.capture(), any(), any()) // Verify that the request that the compat code makes to the platform is correct. @@ -302,8 +313,10 @@ @Test fun testReportImpression() { - Assume.assumeTrue("minSdkVersion = API 33 ext 4 or API 31/32 ext 9", - mValidAdServicesSdkExtVersion || mValidAdExtServicesSdkExtVersion) + Assume.assumeTrue( + "minSdkVersion = API 33 ext 4 or API 31/32 ext 9", + mValidAdServicesSdkExtVersion || mValidAdExtServicesSdkExtVersion + ) val adSelectionManager = mockAdSelectionManager(mContext, mValidAdExtServicesSdkExtVersion) setupAdSelectionResponse(adSelectionManager) @@ -312,13 +325,13 @@ val reportImpressionRequest = ReportImpressionRequest(adSelectionId, adSelectionConfig) // Actually invoke the compat code. - runBlocking { - managerCompat!!.reportImpression(reportImpressionRequest) - } + runBlocking { managerCompat!!.reportImpression(reportImpressionRequest) } // Verify that the compat code was invoked correctly. - val captor = ArgumentCaptor.forClass( - android.adservices.adselection.ReportImpressionRequest::class.java) + val captor = + ArgumentCaptor.forClass( + android.adservices.adselection.ReportImpressionRequest::class.java + ) verify(adSelectionManager).reportImpression(captor.capture(), any(), any()) // Verify that the request that the compat code makes to the platform is correct. @@ -327,27 +340,26 @@ @Test fun testUpdateAdCounterHistogram() { - Assume.assumeTrue("minSdkVersion = API 33 ext 8 or API 31/32 ext 9", - AdServicesInfo.adServicesVersion() >= 8 || mValidAdExtServicesSdkExtVersion) + Assume.assumeTrue( + "minSdkVersion = API 33 ext 8 or API 31/32 ext 9", + AdServicesInfo.adServicesVersion() >= 8 || mValidAdExtServicesSdkExtVersion + ) val adSelectionManager = mockAdSelectionManager(mContext, mValidAdExtServicesSdkExtVersion) setupUpdateAdCounterHistogramResponse(adSelectionManager) val managerCompat = obtain(mContext) - val updateAdCounterHistogramRequest = UpdateAdCounterHistogramRequest( - adSelectionId, - adEventType, - seller - ) + val updateAdCounterHistogramRequest = + UpdateAdCounterHistogramRequest(adSelectionId, adEventType, seller) // Actually invoke the compat code. - runBlocking { - managerCompat!!.updateAdCounterHistogram(updateAdCounterHistogramRequest) - } + runBlocking { managerCompat!!.updateAdCounterHistogram(updateAdCounterHistogramRequest) } // Verify that the compat code was invoked correctly. - val captor = ArgumentCaptor.forClass( - android.adservices.adselection.UpdateAdCounterHistogramRequest::class.java) + val captor = + ArgumentCaptor.forClass( + android.adservices.adselection.UpdateAdCounterHistogramRequest::class.java + ) verify(adSelectionManager).updateAdCounterHistogram(captor.capture(), any(), any()) // Verify that the request that the compat code makes to the platform is correct. @@ -356,29 +368,30 @@ @Test fun testReportEvent() { - Assume.assumeTrue("minSdkVersion = API 33 ext 8 or API 31/32 ext 9", - AdServicesInfo.adServicesVersion() >= 8 || mValidAdExtServicesSdkExtVersion) + Assume.assumeTrue( + "minSdkVersion = API 33 ext 8 or API 31/32 ext 9", + AdServicesInfo.adServicesVersion() >= 8 || mValidAdExtServicesSdkExtVersion + ) val adSelectionManager = mockAdSelectionManager(mContext, mValidAdExtServicesSdkExtVersion) setupReportEventResponse(adSelectionManager) val managerCompat = obtain(mContext) - val reportEventRequest = ReportEventRequest( - adSelectionId, - eventKey, - eventData, - reportingDestinations, - inputEvent - ) + val reportEventRequest = + ReportEventRequest( + adSelectionId, + eventKey, + eventData, + reportingDestinations, + inputEvent + ) // Actually invoke the compat code. - runBlocking { - managerCompat!!.reportEvent(reportEventRequest) - } + runBlocking { managerCompat!!.reportEvent(reportEventRequest) } // Verify that the compat code was invoked correctly. - val captor = ArgumentCaptor.forClass( - android.adservices.adselection.ReportEventRequest::class.java) + val captor = + ArgumentCaptor.forClass(android.adservices.adselection.ReportEventRequest::class.java) verify(adSelectionManager).reportEvent(captor.capture(), any(), any()) // Verify that the request that the compat code makes to the platform is correct. @@ -387,19 +400,17 @@ @Test fun testPersistAdSelectionResult() { - Assume.assumeTrue("minSdkVersion = API 31 ext 10", - AdServicesInfo.adServicesVersion() >= 10 || - AdServicesInfo.extServicesVersionS() >= 10) + Assume.assumeTrue( + "minSdkVersion = API 31 ext 10", + AdServicesInfo.adServicesVersion() >= 10 || AdServicesInfo.extServicesVersionS() >= 10 + ) val adSelectionManager = mockAdSelectionManager(mContext, mValidAdExtServicesSdkExtVersion) setupGetAdSelectionResponse(adSelectionManager) val managerCompat = obtain(mContext) - val persistAdSelectionResultRequest = PersistAdSelectionResultRequest( - adSelectionId, - seller, - adSelectionData - ) + val persistAdSelectionResultRequest = + PersistAdSelectionResultRequest(adSelectionId, seller, adSelectionData) // Actually invoke the compat code. val result = runBlocking { @@ -407,8 +418,10 @@ } // Verify that the compat code was invoked correctly. - val captor = ArgumentCaptor.forClass( - android.adservices.adselection.PersistAdSelectionResultRequest::class.java) + val captor = + ArgumentCaptor.forClass( + android.adservices.adselection.PersistAdSelectionResultRequest::class.java + ) verify(adSelectionManager).persistAdSelectionResult(captor.capture(), any(), any()) // Verify that the request that the compat code makes to the platform is correct. @@ -433,14 +446,16 @@ private val perBuyerSignals: Map= mutableMapOf(Pair(seller, sellerSignals)) private val trustedScoringSignalsUri: Uri = Uri.parse("www.xyz.com") - private val adSelectionConfig = AdSelectionConfig( - seller, - decisionLogicUri, - customAudienceBuyers, - adSelectionSignals, - sellerSignals, - perBuyerSignals, - trustedScoringSignalsUri) + private val adSelectionConfig = + AdSelectionConfig( + seller, + decisionLogicUri, + customAudienceBuyers, + adSelectionSignals, + sellerSignals, + perBuyerSignals, + trustedScoringSignalsUri + ) private const val adEventType = FrequencyCapFilters.AD_EVENT_TYPE_IMPRESSION private const val eventKey = "click" private const val eventData = "{\"key\":\"value\"}" @@ -450,12 +465,13 @@ private val inputEvent: InputEvent = KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_1) private val adSelectionIds: List= listOf(10, 11, 12) private val selectionLogicUri: Uri = Uri.parse("www.abc.com") - private val adSelectionFromOutcomesConfig = AdSelectionFromOutcomesConfig( - seller, - adSelectionIds, - adSelectionSignals, - selectionLogicUri - ) + private val adSelectionFromOutcomesConfig = + AdSelectionFromOutcomesConfig( + seller, + adSelectionIds, + adSelectionSignals, + selectionLogicUri + ) // Response. private val renderUri = Uri.parse("render-uri.com") @@ -466,8 +482,11 @@ ): android.adservices.adselection.AdSelectionManager { val adSelectionManager = mock(android.adservices.adselection.AdSelectionManager::class.java) - `when`(spyContext.getSystemService( - android.adservices.adselection.AdSelectionManager::class.java)) + `when`( + spyContext.getSystemService( + android.adservices.adselection.AdSelectionManager::class.java + ) + ) .thenReturn(adSelectionManager) // only mock the .get() method if using extServices version if (isExtServices) { @@ -483,22 +502,27 @@ ) { // Set up the response that AdSelectionManager will return when the compat code calls // it. - val response = android.adservices.adselection.AdSelectionOutcome.Builder() - .setAdSelectionId(adSelectionId) - .setRenderUri(renderUri) - .build() + val response = + android.adservices.adselection.AdSelectionOutcome.Builder() + .setAdSelectionId(adSelectionId) + .setRenderUri(renderUri) + .build() val answer = { args: InvocationOnMock -> - val receiver = args.getArgument- android.adservices.adselection.AdSelectionOutcome, Exception>>(2) + val receiver = + args.getArgument< + OutcomeReceiver< + android.adservices.adselection.AdSelectionOutcome, + Exception + > + >( + 2 + ) receiver.onResult(response) null } doAnswer(answer) - .`when`(adSelectionManager).selectAds( - any (), - any(), - any() - ) + .`when`(adSelectionManager) + .selectAds(any(), any(), any()) val answer2 = { args: InvocationOnMock -> val receiver = args.getArgument>(2) @@ -513,18 +537,27 @@ ) { // Set up the response that AdSelectionManager will return when the compat code calls // it. - val response = android.adservices.adselection.AdSelectionOutcome.Builder() - .setAdSelectionId(adSelectionId) - .setRenderUri(renderUri) - .build() + val response = + android.adservices.adselection.AdSelectionOutcome.Builder() + .setAdSelectionId(adSelectionId) + .setRenderUri(renderUri) + .build() val answer = { args: InvocationOnMock -> - val receiver = args.getArgument- android.adservices.adselection.AdSelectionOutcome, Exception>>(2) + val receiver = + args.getArgument< + OutcomeReceiver< + android.adservices.adselection.AdSelectionOutcome, + Exception + > + >( + 2 + ) receiver.onResult(response) null } doAnswer(answer) - .`when`(adSelectionManager).selectAds( + .`when`(adSelectionManager) + .selectAds( any (), any(), any() @@ -542,11 +575,8 @@ null } doAnswer(answer) - .`when`(adSelectionManager).updateAdCounterHistogram( - any(), - any(), - any() - ) + .`when`(adSelectionManager) + .updateAdCounterHistogram(any(), any(), any()) } private fun setupReportEventResponse( @@ -559,12 +589,7 @@ receiver.onResult(Object()) null } - doAnswer(answer) - .`when`(adSelectionManager).reportEvent( - any(), - any(), - any() - ) + doAnswer(answer).`when`(adSelectionManager).reportEvent(any(), any(), any()) } private fun setupGetAdSelectionResponse( @@ -572,18 +597,27 @@ ) { // There is no way to create a GetAdSelectionDataOutcome instance outside of adservices - val response2 = android.adservices.adselection.AdSelectionOutcome.Builder() - .setAdSelectionId(adSelectionId) - .setRenderUri(renderUri) - .build() + val response2 = + android.adservices.adselection.AdSelectionOutcome.Builder() + .setAdSelectionId(adSelectionId) + .setRenderUri(renderUri) + .build() val answer2 = { args: InvocationOnMock -> - val receiver = args.getArgument- android.adservices.adselection.AdSelectionOutcome, Exception>>(2) + val receiver = + args.getArgument< + OutcomeReceiver< + android.adservices.adselection.AdSelectionOutcome, + Exception + > + >( + 2 + ) receiver.onResult(response2) null } doAnswer(answer2) - .`when`(adSelectionManager).persistAdSelectionResult(any(), any(), any()) + .`when`(adSelectionManager) + .persistAdSelectionResult(any(), any(), any()) } private fun verifyRequest(request: android.adservices.adselection.AdSelectionConfig) { @@ -602,13 +636,8 @@ Assert.assertEquals(expectedRequest, request) } - private fun verifyResponse( - outcome: AdSelectionOutcome - ) { - val expectedOutcome = - AdSelectionOutcome( - adSelectionId, - renderUri) + private fun verifyResponse(outcome: AdSelectionOutcome) { + val expectedOutcome = AdSelectionOutcome(adSelectionId, renderUri) Assert.assertEquals(expectedOutcome, outcome) } @@ -617,15 +646,24 @@ val adTechIdentifier = android.adservices.common.AdTechIdentifier.fromString(adId) return android.adservices.adselection.AdSelectionConfig.Builder() .setAdSelectionSignals( - android.adservices.common.AdSelectionSignals.fromString(adSelectionSignalsStr)) + android.adservices.common.AdSelectionSignals.fromString(adSelectionSignalsStr) + ) .setCustomAudienceBuyers(listOf(adTechIdentifier)) .setDecisionLogicUri(decisionLogicUri) - .setPerBuyerSignals(mutableMapOf(Pair( - adTechIdentifier, - android.adservices.common.AdSelectionSignals.fromString(sellerSignalsStr)))) + .setPerBuyerSignals( + mutableMapOf( + Pair( + adTechIdentifier, + android.adservices.common.AdSelectionSignals.fromString( + sellerSignalsStr + ) + ) + ) + ) .setSeller(adTechIdentifier) .setSellerSignals( - android.adservices.common.AdSelectionSignals.fromString(sellerSignalsStr)) + android.adservices.common.AdSelectionSignals.fromString(sellerSignalsStr) + ) .setTrustedScoringSignalsUri(trustedScoringSignalsUri) .build() } @@ -646,9 +684,11 @@ private fun verifyReportImpressionRequest( request: android.adservices.adselection.ReportImpressionRequest ) { - val expectedRequest = android.adservices.adselection.ReportImpressionRequest( - adSelectionId, - getPlatformAdSelectionConfig()) + val expectedRequest = + android.adservices.adselection.ReportImpressionRequest( + adSelectionId, + getPlatformAdSelectionConfig() + ) Assert.assertEquals(expectedRequest.adSelectionId, request.adSelectionId) Assert.assertEquals(expectedRequest.adSelectionConfig, request.adSelectionConfig) } @@ -657,51 +697,58 @@ request: android.adservices.adselection.UpdateAdCounterHistogramRequest ) { val adTechIdentifier = android.adservices.common.AdTechIdentifier.fromString(adId) - val expectedRequest = android.adservices.adselection.UpdateAdCounterHistogramRequest - .Builder(adSelectionId, adEventType, adTechIdentifier) - .build() + val expectedRequest = + android.adservices.adselection.UpdateAdCounterHistogramRequest.Builder( + adSelectionId, + adEventType, + adTechIdentifier + ) + .build() Assert.assertEquals(expectedRequest, request) } private fun verifyReportEventRequest( request: android.adservices.adselection.ReportEventRequest ) { - val checkInputEvent = AdServicesInfo.adServicesVersion() >= 10 || - AdServicesInfo.extServicesVersionS() >= 10 - val expectedRequestBuilder = android.adservices.adselection.ReportEventRequest.Builder( - adSelectionId, - eventKey, - eventData, - reportingDestinations) + val checkInputEvent = + AdServicesInfo.adServicesVersion() >= 10 || + AdServicesInfo.extServicesVersionS() >= 10 + val expectedRequestBuilder = + android.adservices.adselection.ReportEventRequest.Builder( + adSelectionId, + eventKey, + eventData, + reportingDestinations + ) - if (checkInputEvent) - expectedRequestBuilder.setInputEvent(inputEvent) + if (checkInputEvent) expectedRequestBuilder.setInputEvent(inputEvent) val expectedRequest = expectedRequestBuilder.build() Assert.assertEquals(expectedRequest.adSelectionId, request.adSelectionId) Assert.assertEquals(expectedRequest.key, request.key) Assert.assertEquals(expectedRequest.data, request.data) - Assert.assertEquals(expectedRequest.reportingDestinations, - request.reportingDestinations) - if (checkInputEvent) - Assert.assertEquals(expectedRequest.inputEvent, - request.inputEvent) + Assert.assertEquals( + expectedRequest.reportingDestinations, + request.reportingDestinations + ) + if (checkInputEvent) Assert.assertEquals(expectedRequest.inputEvent, request.inputEvent) } private fun verifyPersistAdSelectionResultRequest( request: android.adservices.adselection.PersistAdSelectionResultRequest ) { val adTechIdentifier = android.adservices.common.AdTechIdentifier.fromString(adId) - val expectedRequest = android.adservices.adselection.PersistAdSelectionResultRequest - .Builder() - .setAdSelectionId(adSelectionId) - .setSeller(adTechIdentifier) - .setAdSelectionResult(adSelectionData) - .build() + val expectedRequest = + android.adservices.adselection.PersistAdSelectionResultRequest.Builder() + .setAdSelectionId(adSelectionId) + .setSeller(adTechIdentifier) + .setAdSelectionResult(adSelectionData) + .build() Assert.assertEquals(expectedRequest.adSelectionId, request.adSelectionId) Assert.assertEquals(expectedRequest.seller, request.seller) - Assert.assertTrue(expectedRequest.adSelectionResult - .contentEquals(request.adSelectionResult)) + Assert.assertTrue( + expectedRequest.adSelectionResult.contentEquals(request.adSelectionResult) + ) } } }
diff --git a/privacysandbox/ads/ads-adservices/src/androidTest/java/androidx/privacysandbox/ads/adservices/adselection/AdSelectionOutcomeTest.kt b/privacysandbox/ads/ads-adservices/src/androidTest/java/androidx/privacysandbox/ads/adservices/adselection/AdSelectionOutcomeTest.kt index d18556e..51c9e54 100644 --- a/privacysandbox/ads/ads-adservices/src/androidTest/java/androidx/privacysandbox/ads/adservices/adselection/AdSelectionOutcomeTest.kt +++ b/privacysandbox/ads/ads-adservices/src/androidTest/java/androidx/privacysandbox/ads/adservices/adselection/AdSelectionOutcomeTest.kt
@@ -30,6 +30,7 @@ class AdSelectionOutcomeTest { private val adSelectionId = 1234L private val renderUri = Uri.parse("abc.com") + @Test fun testToString() { val result = "AdSelectionOutcome: adSelectionId=$adSelectionId, renderUri=$renderUri"
diff --git a/privacysandbox/ads/ads-adservices/src/androidTest/java/androidx/privacysandbox/ads/adservices/adselection/GetAdSelectionDataOutcomeTest.kt b/privacysandbox/ads/ads-adservices/src/androidTest/java/androidx/privacysandbox/ads/adservices/adselection/GetAdSelectionDataOutcomeTest.kt index af65dd1..84dad39 100644 --- a/privacysandbox/ads/ads-adservices/src/androidTest/java/androidx/privacysandbox/ads/adservices/adselection/GetAdSelectionDataOutcomeTest.kt +++ b/privacysandbox/ads/ads-adservices/src/androidTest/java/androidx/privacysandbox/ads/adservices/adselection/GetAdSelectionDataOutcomeTest.kt
@@ -29,10 +29,12 @@ class GetAdSelectionDataOutcomeTest { private val adSelectionId = 1234L private val adSelectionData = byteArrayOf(0x01, 0x02, 0x03, 0x04) + @Test fun testToString() { - val result = "GetAdSelectionDataOutcome: adSelectionId=$adSelectionId, " + - "adSelectionData=$adSelectionData" + val result = + "GetAdSelectionDataOutcome: adSelectionId=$adSelectionId, " + + "adSelectionData=$adSelectionData" val request = GetAdSelectionDataOutcome(adSelectionId, adSelectionData) Truth.assertThat(request.toString()).isEqualTo(result) } @@ -40,10 +42,8 @@ @Test fun testEquals() { val getAdSelectionDataOutcome = GetAdSelectionDataOutcome(adSelectionId, adSelectionData) - var getAdSelectionDataOutcome2 = GetAdSelectionDataOutcome( - adSelectionId, - byteArrayOf(0x01, 0x02, 0x03, 0x04) - ) + var getAdSelectionDataOutcome2 = + GetAdSelectionDataOutcome(adSelectionId, byteArrayOf(0x01, 0x02, 0x03, 0x04)) Truth.assertThat(getAdSelectionDataOutcome == getAdSelectionDataOutcome2).isTrue() } }
diff --git a/privacysandbox/ads/ads-adservices/src/androidTest/java/androidx/privacysandbox/ads/adservices/adselection/PersistAdSelectionResultRequestTest.kt b/privacysandbox/ads/ads-adservices/src/androidTest/java/androidx/privacysandbox/ads/adservices/adselection/PersistAdSelectionResultRequestTest.kt index 3810b70..4baf67f 100644 --- a/privacysandbox/ads/ads-adservices/src/androidTest/java/androidx/privacysandbox/ads/adservices/adselection/PersistAdSelectionResultRequestTest.kt +++ b/privacysandbox/ads/ads-adservices/src/androidTest/java/androidx/privacysandbox/ads/adservices/adselection/PersistAdSelectionResultRequestTest.kt
@@ -31,10 +31,12 @@ private val adSelectionId = 1234L private val seller: AdTechIdentifier = AdTechIdentifier("1234") private val adSelectionResult = byteArrayOf(0x01, 0x02, 0x03, 0x04) + @Test fun testToString() { - val result = "PersistAdSelectionResultRequest: adSelectionId=$adSelectionId, " + - "seller=$seller, adSelectionResult=$adSelectionResult" + val result = + "PersistAdSelectionResultRequest: adSelectionId=$adSelectionId, " + + "seller=$seller, adSelectionResult=$adSelectionResult" val request = PersistAdSelectionResultRequest(adSelectionId, seller, adSelectionResult) Truth.assertThat(request.toString()).isEqualTo(result) @@ -42,16 +44,14 @@ @Test fun testEquals() { - val persistAdSelectionResultRequest = PersistAdSelectionResultRequest( - adSelectionId, - seller, - adSelectionResult - ) - var persistAdSelectionResultRequest2 = PersistAdSelectionResultRequest( - 1234L, - AdTechIdentifier("1234"), - byteArrayOf(0x01, 0x02, 0x03, 0x04) - ) + val persistAdSelectionResultRequest = + PersistAdSelectionResultRequest(adSelectionId, seller, adSelectionResult) + var persistAdSelectionResultRequest2 = + PersistAdSelectionResultRequest( + 1234L, + AdTechIdentifier("1234"), + byteArrayOf(0x01, 0x02, 0x03, 0x04) + ) Truth.assertThat(persistAdSelectionResultRequest == persistAdSelectionResultRequest2) .isTrue()
diff --git a/privacysandbox/ads/ads-adservices/src/androidTest/java/androidx/privacysandbox/ads/adservices/adselection/ReportEventRequestTest.kt b/privacysandbox/ads/ads-adservices/src/androidTest/java/androidx/privacysandbox/ads/adservices/adselection/ReportEventRequestTest.kt index 5bed67e..27ac32e 100644 --- a/privacysandbox/ads/ads-adservices/src/androidTest/java/androidx/privacysandbox/ads/adservices/adselection/ReportEventRequestTest.kt +++ b/privacysandbox/ads/ads-adservices/src/androidTest/java/androidx/privacysandbox/ads/adservices/adselection/ReportEventRequestTest.kt
@@ -38,35 +38,39 @@ @Test fun testToString() { - val result = "ReportEventRequest: adSelectionId=$adSelectionId, eventKey=$eventKey, " + - "eventData=$eventData, reportingDestinations=$reportingDestinations" + - "inputEvent=$inputEvent" - val request = ReportEventRequest( - adSelectionId, - eventKey, - eventData, - reportingDestinations, - inputEvent - ) + val result = + "ReportEventRequest: adSelectionId=$adSelectionId, eventKey=$eventKey, " + + "eventData=$eventData, reportingDestinations=$reportingDestinations" + + "inputEvent=$inputEvent" + val request = + ReportEventRequest( + adSelectionId, + eventKey, + eventData, + reportingDestinations, + inputEvent + ) Truth.assertThat(request.toString()).isEqualTo(result) } @Test fun testEquals() { - val reportEventRequest = ReportEventRequest( - adSelectionId, - eventKey, - eventData, - reportingDestinations, - inputEvent - ) - var reportEventRequest2 = ReportEventRequest( - 1234L, - "click", - "{\"key\":\"value\"}", - ReportEventRequest.FLAG_REPORTING_DESTINATION_BUYER, - inputEvent - ) + val reportEventRequest = + ReportEventRequest( + adSelectionId, + eventKey, + eventData, + reportingDestinations, + inputEvent + ) + var reportEventRequest2 = + ReportEventRequest( + 1234L, + "click", + "{\"key\":\"value\"}", + ReportEventRequest.FLAG_REPORTING_DESTINATION_BUYER, + inputEvent + ) Truth.assertThat(reportEventRequest == reportEventRequest2).isTrue() } @@ -74,21 +78,25 @@ @Test fun testInvalidReportingDestinations() { assertThrows{ - ReportEventRequest( - adSelectionId, - eventKey, - eventData, - 0 /* unset reporting destinations */ - ) - }.hasMessageThat().contains("Invalid reporting destinations bitfield.") + ReportEventRequest( + adSelectionId, + eventKey, + eventData, + 0 /* unset reporting destinations */ + ) + } + .hasMessageThat() + .contains("Invalid reporting destinations bitfield.") assertThrows{ - ReportEventRequest( - adSelectionId, - eventKey, - eventData, - 4 /* undefined reporting destinations */ - ) - }.hasMessageThat().contains("Invalid reporting destinations bitfield.") + ReportEventRequest( + adSelectionId, + eventKey, + eventData, + 4 /* undefined reporting destinations */ + ) + } + .hasMessageThat() + .contains("Invalid reporting destinations bitfield.") } }
diff --git a/privacysandbox/ads/ads-adservices/src/androidTest/java/androidx/privacysandbox/ads/adservices/adselection/ReportImpressionRequestTest.kt b/privacysandbox/ads/ads-adservices/src/androidTest/java/androidx/privacysandbox/ads/adservices/adselection/ReportImpressionRequestTest.kt index 4e9dc25..8807a22 100644 --- a/privacysandbox/ads/ads-adservices/src/androidTest/java/androidx/privacysandbox/ads/adservices/adselection/ReportImpressionRequestTest.kt +++ b/privacysandbox/ads/ads-adservices/src/androidTest/java/androidx/privacysandbox/ads/adservices/adselection/ReportImpressionRequestTest.kt
@@ -37,19 +37,22 @@ private val perBuyerSignals: Map= mutableMapOf(Pair(seller, sellerSignals)) private val trustedScoringSignalsUri: Uri = Uri.parse("www.xyz.com") - private val adSelectionConfig = AdSelectionConfig( - seller, - decisionLogicUri, - customAudienceBuyers, - adSelectionSignals, - sellerSignals, - perBuyerSignals, - trustedScoringSignalsUri) + private val adSelectionConfig = + AdSelectionConfig( + seller, + decisionLogicUri, + customAudienceBuyers, + adSelectionSignals, + sellerSignals, + perBuyerSignals, + trustedScoringSignalsUri + ) @Test fun testToString() { - val result = "ReportImpressionRequest: adSelectionId=$adSelectionId, " + - "adSelectionConfig=$adSelectionConfig" + val result = + "ReportImpressionRequest: adSelectionId=$adSelectionId, " + + "adSelectionConfig=$adSelectionConfig" val request = ReportImpressionRequest(adSelectionId, adSelectionConfig) Truth.assertThat(request.toString()).isEqualTo(result) } @@ -57,14 +60,16 @@ @Test fun testEquals() { val reportImpressionRequest = ReportImpressionRequest(adSelectionId, adSelectionConfig) - var adSelectionConfig2 = AdSelectionConfig( - AdTechIdentifier("1234"), - Uri.parse("www.abc.com"), - customAudienceBuyers, - adSelectionSignals, - sellerSignals, - perBuyerSignals, - trustedScoringSignalsUri) + var adSelectionConfig2 = + AdSelectionConfig( + AdTechIdentifier("1234"), + Uri.parse("www.abc.com"), + customAudienceBuyers, + adSelectionSignals, + sellerSignals, + perBuyerSignals, + trustedScoringSignalsUri + ) var reportImpressionRequest2 = ReportImpressionRequest(adSelectionId, adSelectionConfig2) Truth.assertThat(reportImpressionRequest == reportImpressionRequest2).isTrue() }
diff --git a/privacysandbox/ads/ads-adservices/src/androidTest/java/androidx/privacysandbox/ads/adservices/adselection/UpdateAdCounterHistogramRequestTest.kt b/privacysandbox/ads/ads-adservices/src/androidTest/java/androidx/privacysandbox/ads/adservices/adselection/UpdateAdCounterHistogramRequestTest.kt index 270d286..8898213 100644 --- a/privacysandbox/ads/ads-adservices/src/androidTest/java/androidx/privacysandbox/ads/adservices/adselection/UpdateAdCounterHistogramRequestTest.kt +++ b/privacysandbox/ads/ads-adservices/src/androidTest/java/androidx/privacysandbox/ads/adservices/adselection/UpdateAdCounterHistogramRequestTest.kt
@@ -36,32 +36,32 @@ @Test fun testToString() { - val result = "UpdateAdCounterHistogramRequest: adSelectionId=$adSelectionId, " + - "adEventType=AD_EVENT_TYPE_CLICK, callerAdTech=$callerAdTech" + val result = + "UpdateAdCounterHistogramRequest: adSelectionId=$adSelectionId, " + + "adEventType=AD_EVENT_TYPE_CLICK, callerAdTech=$callerAdTech" val request = UpdateAdCounterHistogramRequest(adSelectionId, adEventType, callerAdTech) Truth.assertThat(request.toString()).isEqualTo(result) } @Test fun testEquals() { - val updateAdCounterHistogramRequest1 = UpdateAdCounterHistogramRequest( - adSelectionId, - adEventType, - callerAdTech - ) - var updateAdCounterHistogramRequest2 = UpdateAdCounterHistogramRequest( - 1234L, - FrequencyCapFilters.AD_EVENT_TYPE_CLICK, - AdTechIdentifier("1234") - ) + val updateAdCounterHistogramRequest1 = + UpdateAdCounterHistogramRequest(adSelectionId, adEventType, callerAdTech) + var updateAdCounterHistogramRequest2 = + UpdateAdCounterHistogramRequest( + 1234L, + FrequencyCapFilters.AD_EVENT_TYPE_CLICK, + AdTechIdentifier("1234") + ) Truth.assertThat(updateAdCounterHistogramRequest1 == updateAdCounterHistogramRequest2) .isTrue() - var updateAdCounterHistogramRequest3 = UpdateAdCounterHistogramRequest( - 1234L, - FrequencyCapFilters.AD_EVENT_TYPE_VIEW, - AdTechIdentifier("1234") - ) + var updateAdCounterHistogramRequest3 = + UpdateAdCounterHistogramRequest( + 1234L, + FrequencyCapFilters.AD_EVENT_TYPE_VIEW, + AdTechIdentifier("1234") + ) Truth.assertThat(updateAdCounterHistogramRequest1 == updateAdCounterHistogramRequest3) .isFalse() } @@ -69,25 +69,29 @@ @Test fun testInvalidAdEventType() { assertThrows{ - UpdateAdCounterHistogramRequest( - 1234L, - -1 /* Invalid adEventType */, - AdTechIdentifier("1234") + UpdateAdCounterHistogramRequest( + 1234L, + -1 /* Invalid adEventType */, + AdTechIdentifier("1234") + ) + } + .hasMessageThat() + .contains( + "Ad event type must be one of AD_EVENT_TYPE_IMPRESSION, " + + "AD_EVENT_TYPE_VIEW, or AD_EVENT_TYPE_CLICK" ) - }.hasMessageThat().contains( - "Ad event type must be one of AD_EVENT_TYPE_IMPRESSION, " + - "AD_EVENT_TYPE_VIEW, or AD_EVENT_TYPE_CLICK" - ) } @Test fun testExceptionWinAdEventType() { assertThrows{ - UpdateAdCounterHistogramRequest( - 1234L, - FrequencyCapFilters.AD_EVENT_TYPE_WIN, - AdTechIdentifier("1234") - ) - }.hasMessageThat().contains("Win event types cannot be manually updated.") + UpdateAdCounterHistogramRequest( + 1234L, + FrequencyCapFilters.AD_EVENT_TYPE_WIN, + AdTechIdentifier("1234") + ) + } + .hasMessageThat() + .contains("Win event types cannot be manually updated.") } }
diff --git a/privacysandbox/ads/ads-adservices/src/androidTest/java/androidx/privacysandbox/ads/adservices/appsetid/AppSetIdManagerTest.kt b/privacysandbox/ads/ads-adservices/src/androidTest/java/androidx/privacysandbox/ads/adservices/appsetid/AppSetIdManagerTest.kt index 02e3377..6c2ef23 100644 --- a/privacysandbox/ads/ads-adservices/src/androidTest/java/androidx/privacysandbox/ads/adservices/appsetid/AppSetIdManagerTest.kt +++ b/privacysandbox/ads/ads-adservices/src/androidTest/java/androidx/privacysandbox/ads/adservices/appsetid/AppSetIdManagerTest.kt
@@ -59,9 +59,10 @@ if (mValidAdExtServicesSdkExtVersion) { // setup a mockitoSession to return the mocked manager // when the static method .get() is called - mSession = ExtendedMockito.mockitoSession() - .mockStatic(android.adservices.appsetid.AppSetIdManager::class.java) - .startMocking(); + mSession = + ExtendedMockito.mockitoSession() + .mockStatic(android.adservices.appsetid.AppSetIdManager::class.java) + .startMocking() } } @@ -80,27 +81,26 @@ @Test fun testAppSetIdManagerNoClassDefFoundError() { - Assume.assumeTrue("minSdkVersion = API 31/32 ext 9", mValidAdExtServicesSdkExtVersion); + Assume.assumeTrue("minSdkVersion = API 31/32 ext 9", mValidAdExtServicesSdkExtVersion) - `when`(android.adservices.appsetid.AppSetIdManager.get(any())).thenThrow( - NoClassDefFoundError() - ) + `when`(android.adservices.appsetid.AppSetIdManager.get(any())) + .thenThrow(NoClassDefFoundError()) assertThat(AppSetIdManager.obtain(mContext)).isNull() } @Test fun testAppSetIdAsync() { - Assume.assumeTrue("minSdkVersion = API 33 ext 4 or API 31/32 ext 9", - mValidAdServicesSdkExtVersion || mValidAdExtServicesSdkExtVersion) + Assume.assumeTrue( + "minSdkVersion = API 33 ext 4 or API 31/32 ext 9", + mValidAdServicesSdkExtVersion || mValidAdExtServicesSdkExtVersion + ) val appSetIdManager = mockAppSetIdManager(mContext, mValidAdExtServicesSdkExtVersion) setupResponse(appSetIdManager) val managerCompat = AppSetIdManager.obtain(mContext) // Actually invoke the compat code. - val result = runBlocking { - managerCompat!!.getAppSetId() - } + val result = runBlocking { managerCompat!!.getAppSetId() } // Verify that the compat code was invoked correctly. verify(appSetIdManager).getAppSetId(any(), any()) @@ -124,8 +124,11 @@ `when`(android.adservices.appsetid.AppSetIdManager.get(any())) .thenReturn(appSetIdManager) } else { - `when`(spyContext.getSystemService( - android.adservices.appsetid.AppSetIdManager::class.java)) + `when`( + spyContext.getSystemService( + android.adservices.appsetid.AppSetIdManager::class.java + ) + ) .thenReturn(appSetIdManager) } return appSetIdManager @@ -133,20 +136,22 @@ private fun setupResponse(appSetIdManager: android.adservices.appsetid.AppSetIdManager) { // Set up the response that AdIdManager will return when the compat code calls it. - val appSetId = android.adservices.appsetid.AppSetId( - "1234", - android.adservices.appsetid.AppSetId.SCOPE_APP) + val appSetId = + android.adservices.appsetid.AppSetId( + "1234", + android.adservices.appsetid.AppSetId.SCOPE_APP + ) val answer = { args: InvocationOnMock -> - val receiver = args.getArgument< - OutcomeReceiver>(1) + val receiver = + args.getArgument< + OutcomeReceiver+ >( + 1 + ) receiver.onResult(appSetId) null } - doAnswer(answer) - .`when`(appSetIdManager).getAppSetId( - any(), - any() - ) + doAnswer(answer).`when`(appSetIdManager).getAppSetId(any(), any()) } private fun verifyResponse(appSetId: AppSetId) {
diff --git a/privacysandbox/ads/ads-adservices/src/androidTest/java/androidx/privacysandbox/ads/adservices/appsetid/AppSetIdTest.kt b/privacysandbox/ads/ads-adservices/src/androidTest/java/androidx/privacysandbox/ads/adservices/appsetid/AppSetIdTest.kt index d37494a..9e08cbb 100644 --- a/privacysandbox/ads/ads-adservices/src/androidTest/java/androidx/privacysandbox/ads/adservices/appsetid/AppSetIdTest.kt +++ b/privacysandbox/ads/ads-adservices/src/androidTest/java/androidx/privacysandbox/ads/adservices/appsetid/AppSetIdTest.kt
@@ -49,8 +49,8 @@ @Test fun testScopeUndefined() { - assertThrows{ - AppSetId("1234", 3 /* Invalid scope */) - }.hasMessageThat().contains("Scope undefined.") + assertThrows{ AppSetId("1234", 3 /* Invalid scope */) } + .hasMessageThat() + .contains("Scope undefined.") } }
diff --git a/privacysandbox/ads/ads-adservices/src/androidTest/java/androidx/privacysandbox/ads/adservices/common/AdDataTest.kt b/privacysandbox/ads/ads-adservices/src/androidTest/java/androidx/privacysandbox/ads/adservices/common/AdDataTest.kt index ab5293b..52ee165 100644 --- a/privacysandbox/ads/ads-adservices/src/androidTest/java/androidx/privacysandbox/ads/adservices/common/AdDataTest.kt +++ b/privacysandbox/ads/ads-adservices/src/androidTest/java/androidx/privacysandbox/ads/adservices/common/AdDataTest.kt
@@ -34,19 +34,26 @@ private val uri: Uri = Uri.parse("abc.com") private val metadata = "metadata" private val adCounterKeys: Set= setOf - private val adFilters: AdFilters = AdFilters(FrequencyCapFilters( - listOf(KeyedFrequencyCap(1, 3, Duration.ofSeconds(1))), - listOf(KeyedFrequencyCap(2, 4, Duration.ofSeconds(2))), - listOf(KeyedFrequencyCap(3, 3, Duration.ofSeconds(3))), - listOf(KeyedFrequencyCap(4, 4, Duration.ofSeconds(4)), - KeyedFrequencyCap(5, 3, Duration.ofSeconds(5)), - KeyedFrequencyCap(6, 4, Duration.ofSeconds(6))))) + private val adFilters: AdFilters = + AdFilters( + FrequencyCapFilters( + listOf(KeyedFrequencyCap(1, 3, Duration.ofSeconds(1))), + listOf(KeyedFrequencyCap(2, 4, Duration.ofSeconds(2))), + listOf(KeyedFrequencyCap(3, 3, Duration.ofSeconds(3))), + listOf( + KeyedFrequencyCap(4, 4, Duration.ofSeconds(4)), + KeyedFrequencyCap(5, 3, Duration.ofSeconds(5)), + KeyedFrequencyCap(6, 4, Duration.ofSeconds(6)) + ) + ) + ) private val adRenderId: String = "ad-render-id" @Test fun testToString() { - val result = "AdData: renderUri=$uri, metadata='$metadata', " + - "adCounterKeys=$adCounterKeys, adFilters=$adFilters, adRenderId=$adRenderId" + val result = + "AdData: renderUri=$uri, metadata='$metadata', " + + "adCounterKeys=$adCounterKeys, adFilters=$adFilters, adRenderId=$adRenderId" val request = AdData(uri, metadata, adCounterKeys, adFilters, adRenderId) Truth.assertThat(request.toString()).isEqualTo(result) } @@ -54,15 +61,25 @@ @Test fun testEquals() { val adData1 = AdData(uri, metadata, adCounterKeys, adFilters, adRenderId) - var adData2 = AdData(Uri.parse("abc.com"), "metadata", setOf(1, 2, 3) (1, 2, 3), - AdFilters(FrequencyCapFilters( - listOf(KeyedFrequencyCap(1, 3, Duration.ofSeconds(1))), - listOf(KeyedFrequencyCap(2, 4, Duration.ofSeconds(2))), - listOf(KeyedFrequencyCap(3, 3, Duration.ofSeconds(3))), - listOf(KeyedFrequencyCap(4, 4, Duration.ofSeconds(4)), - KeyedFrequencyCap(5, 3, Duration.ofSeconds(5)), - KeyedFrequencyCap(6, 4, Duration.ofSeconds(6))))), - "ad-render-id") + var adData2 = + AdData( + Uri.parse("abc.com"), + "metadata", + setOf(1, 2, 3), + AdFilters( + FrequencyCapFilters( + listOf(KeyedFrequencyCap(1, 3, Duration.ofSeconds(1))), + listOf(KeyedFrequencyCap(2, 4, Duration.ofSeconds(2))), + listOf(KeyedFrequencyCap(3, 3, Duration.ofSeconds(3))), + listOf( + KeyedFrequencyCap(4, 4, Duration.ofSeconds(4)), + KeyedFrequencyCap(5, 3, Duration.ofSeconds(5)), + KeyedFrequencyCap(6, 4, Duration.ofSeconds(6)) + ) + ) + ), + "ad-render-id" + ) Truth.assertThat(adData1 == adData2).isTrue() } }
diff --git a/privacysandbox/ads/ads-adservices/src/androidTest/java/androidx/privacysandbox/ads/adservices/common/AdFiltersTest.kt b/privacysandbox/ads/ads-adservices/src/androidTest/java/androidx/privacysandbox/ads/adservices/common/AdFiltersTest.kt index 7e97960..2090e97 100644 --- a/privacysandbox/ads/ads-adservices/src/androidTest/java/androidx/privacysandbox/ads/adservices/common/AdFiltersTest.kt +++ b/privacysandbox/ads/ads-adservices/src/androidTest/java/androidx/privacysandbox/ads/adservices/common/AdFiltersTest.kt
@@ -30,13 +30,17 @@ @RunWith(AndroidJUnit4::class) @SdkSuppress(minSdkVersion = 31) class AdFiltersTest { - private val frequencyCapFilters: FrequencyCapFilters = FrequencyCapFilters( - listOf(KeyedFrequencyCap(1, 3, Duration.ofSeconds(1))), - listOf(KeyedFrequencyCap(2, 4, Duration.ofSeconds(2))), - listOf(KeyedFrequencyCap(3, 3, Duration.ofSeconds(3))), - listOf(KeyedFrequencyCap(4, 4, Duration.ofSeconds(4)), - KeyedFrequencyCap(5, 3, Duration.ofSeconds(5)), - KeyedFrequencyCap(6, 4, Duration.ofSeconds(6)))) + private val frequencyCapFilters: FrequencyCapFilters = + FrequencyCapFilters( + listOf(KeyedFrequencyCap(1, 3, Duration.ofSeconds(1))), + listOf(KeyedFrequencyCap(2, 4, Duration.ofSeconds(2))), + listOf(KeyedFrequencyCap(3, 3, Duration.ofSeconds(3))), + listOf( + KeyedFrequencyCap(4, 4, Duration.ofSeconds(4)), + KeyedFrequencyCap(5, 3, Duration.ofSeconds(5)), + KeyedFrequencyCap(6, 4, Duration.ofSeconds(6)) + ) + ) @Test fun testToString() { @@ -48,13 +52,19 @@ @Test fun testEquals() { val adFilters1 = AdFilters(frequencyCapFilters) - var adFilters2 = AdFilters(FrequencyCapFilters( - listOf(KeyedFrequencyCap(1, 3, Duration.ofSeconds(1))), - listOf(KeyedFrequencyCap(2, 4, Duration.ofSeconds(2))), - listOf(KeyedFrequencyCap(3, 3, Duration.ofSeconds(3))), - listOf(KeyedFrequencyCap(4, 4, Duration.ofSeconds(4)), - KeyedFrequencyCap(5, 3, Duration.ofSeconds(5)), - KeyedFrequencyCap(6, 4, Duration.ofSeconds(6))))) + var adFilters2 = + AdFilters( + FrequencyCapFilters( + listOf(KeyedFrequencyCap(1, 3, Duration.ofSeconds(1))), + listOf(KeyedFrequencyCap(2, 4, Duration.ofSeconds(2))), + listOf(KeyedFrequencyCap(3, 3, Duration.ofSeconds(3))), + listOf( + KeyedFrequencyCap(4, 4, Duration.ofSeconds(4)), + KeyedFrequencyCap(5, 3, Duration.ofSeconds(5)), + KeyedFrequencyCap(6, 4, Duration.ofSeconds(6)) + ) + ) + ) Truth.assertThat(adFilters1 == adFilters2).isTrue() } }
diff --git a/privacysandbox/ads/ads-adservices/src/androidTest/java/androidx/privacysandbox/ads/adservices/common/FrequencyCapFiltersTest.kt b/privacysandbox/ads/ads-adservices/src/androidTest/java/androidx/privacysandbox/ads/adservices/common/FrequencyCapFiltersTest.kt index 94d55af..0b54470 100644 --- a/privacysandbox/ads/ads-adservices/src/androidTest/java/androidx/privacysandbox/ads/adservices/common/FrequencyCapFiltersTest.kt +++ b/privacysandbox/ads/ads-adservices/src/androidTest/java/androidx/privacysandbox/ads/adservices/common/FrequencyCapFiltersTest.kt
@@ -36,37 +36,50 @@ private val keyedFrequencyCapsForViewEvents: List= listOf(KeyedFrequencyCap(3, 3, Duration.ofSeconds(3))) private val keyedFrequencyCapsForClickEvents: List= - listOf(KeyedFrequencyCap(4, 4, Duration.ofSeconds(4)), + listOf( + KeyedFrequencyCap(4, 4, Duration.ofSeconds(4)), KeyedFrequencyCap(5, 3, Duration.ofSeconds(5)), - KeyedFrequencyCap(6, 4, Duration.ofSeconds(6))) + KeyedFrequencyCap(6, 4, Duration.ofSeconds(6)) + ) @Test fun testToString() { - val result = "FrequencyCapFilters: " + - "keyedFrequencyCapsForWinEvents=$keyedFrequencyCapsForWinEvents, " + - "keyedFrequencyCapsForImpressionEvents=$keyedFrequencyCapsForImpressionEvents, " + - "keyedFrequencyCapsForViewEvents=$keyedFrequencyCapsForViewEvents, " + - "keyedFrequencyCapsForClickEvents=$keyedFrequencyCapsForClickEvents" - val request = FrequencyCapFilters(keyedFrequencyCapsForWinEvents, - keyedFrequencyCapsForImpressionEvents, - keyedFrequencyCapsForViewEvents, - keyedFrequencyCapsForClickEvents) + val result = + "FrequencyCapFilters: " + + "keyedFrequencyCapsForWinEvents=$keyedFrequencyCapsForWinEvents, " + + "keyedFrequencyCapsForImpressionEvents=$keyedFrequencyCapsForImpressionEvents, " + + "keyedFrequencyCapsForViewEvents=$keyedFrequencyCapsForViewEvents, " + + "keyedFrequencyCapsForClickEvents=$keyedFrequencyCapsForClickEvents" + val request = + FrequencyCapFilters( + keyedFrequencyCapsForWinEvents, + keyedFrequencyCapsForImpressionEvents, + keyedFrequencyCapsForViewEvents, + keyedFrequencyCapsForClickEvents + ) Truth.assertThat(request.toString()).isEqualTo(result) } @Test fun testEquals() { - val frequencyCapFilters1 = FrequencyCapFilters(keyedFrequencyCapsForWinEvents, - keyedFrequencyCapsForImpressionEvents, - keyedFrequencyCapsForViewEvents, - keyedFrequencyCapsForClickEvents) - var frequencyCapFilters2 = FrequencyCapFilters( - listOf(KeyedFrequencyCap(1, 3, Duration.ofSeconds(1))), - listOf(KeyedFrequencyCap(2, 4, Duration.ofSeconds(2))), - listOf(KeyedFrequencyCap(3, 3, Duration.ofSeconds(3))), - listOf(KeyedFrequencyCap(4, 4, Duration.ofSeconds(4)), - KeyedFrequencyCap(5, 3, Duration.ofSeconds(5)), - KeyedFrequencyCap(6, 4, Duration.ofSeconds(6)))) + val frequencyCapFilters1 = + FrequencyCapFilters( + keyedFrequencyCapsForWinEvents, + keyedFrequencyCapsForImpressionEvents, + keyedFrequencyCapsForViewEvents, + keyedFrequencyCapsForClickEvents + ) + var frequencyCapFilters2 = + FrequencyCapFilters( + listOf(KeyedFrequencyCap(1, 3, Duration.ofSeconds(1))), + listOf(KeyedFrequencyCap(2, 4, Duration.ofSeconds(2))), + listOf(KeyedFrequencyCap(3, 3, Duration.ofSeconds(3))), + listOf( + KeyedFrequencyCap(4, 4, Duration.ofSeconds(4)), + KeyedFrequencyCap(5, 3, Duration.ofSeconds(5)), + KeyedFrequencyCap(6, 4, Duration.ofSeconds(6)) + ) + ) Truth.assertThat(frequencyCapFilters1 == frequencyCapFilters2).isTrue() } }
diff --git a/privacysandbox/ads/ads-adservices/src/androidTest/java/androidx/privacysandbox/ads/adservices/common/KeyedFrequencyCapTest.kt b/privacysandbox/ads/ads-adservices/src/androidTest/java/androidx/privacysandbox/ads/adservices/common/KeyedFrequencyCapTest.kt index 79fedda..bd4b76e 100644 --- a/privacysandbox/ads/ads-adservices/src/androidTest/java/androidx/privacysandbox/ads/adservices/common/KeyedFrequencyCapTest.kt +++ b/privacysandbox/ads/ads-adservices/src/androidTest/java/androidx/privacysandbox/ads/adservices/common/KeyedFrequencyCapTest.kt
@@ -35,8 +35,9 @@ @Test fun testToString() { - val result = "KeyedFrequencyCap: adCounterKey=$adCounterKey, maxCount=$maxCount, " + - "interval=$interval" + val result = + "KeyedFrequencyCap: adCounterKey=$adCounterKey, maxCount=$maxCount, " + + "interval=$interval" val request = KeyedFrequencyCap(adCounterKey, maxCount, interval) Truth.assertThat(request.toString()).isEqualTo(result) }
diff --git a/privacysandbox/ads/ads-adservices/src/androidTest/java/androidx/privacysandbox/ads/adservices/customaudience/CustomAudienceManagerTest.kt b/privacysandbox/ads/ads-adservices/src/androidTest/java/androidx/privacysandbox/ads/adservices/customaudience/CustomAudienceManagerTest.kt index 9359df6..c3621f9 100644 --- a/privacysandbox/ads/ads-adservices/src/androidTest/java/androidx/privacysandbox/ads/adservices/customaudience/CustomAudienceManagerTest.kt +++ b/privacysandbox/ads/ads-adservices/src/androidTest/java/androidx/privacysandbox/ads/adservices/customaudience/CustomAudienceManagerTest.kt
@@ -69,10 +69,11 @@ if (mValidAdExtServicesSdkExtVersion) { // setup a mockitoSession to return the mocked manager // when the static method .get() is called - mSession = ExtendedMockito.mockitoSession() - .mockStatic(android.adservices.customaudience.CustomAudienceManager::class.java) - .strictness(Strictness.LENIENT) - .startMocking() + mSession = + ExtendedMockito.mockitoSession() + .mockStatic(android.adservices.customaudience.CustomAudienceManager::class.java) + .strictness(Strictness.LENIENT) + .startMocking() } } @@ -91,7 +92,7 @@ @Test fun testCustomAudienceManagerNoClassDefFoundError() { - Assume.assumeTrue("minSdkVersion = API 31/32 ext 9", mValidAdExtServicesSdkExtVersion); + Assume.assumeTrue("minSdkVersion = API 31/32 ext 9", mValidAdExtServicesSdkExtVersion) `when`(CustomAudienceManager.get(any())).thenThrow(NoClassDefFoundError()) Truth.assertThat(obtain(mContext)).isNull() @@ -101,34 +102,43 @@ @SdkSuppress(maxSdkVersion = 34, minSdkVersion = 31) fun testFetchAndJoinCustomAudienceOlderVersions() { /* AdServices or ExtServices are present */ - Assume.assumeTrue("minSdkVersion = API 33 ext 4 or API 31/32 ext 9", - mValidAdServicesSdkExtVersion || mValidAdExtServicesSdkExtVersion) + Assume.assumeTrue( + "minSdkVersion = API 33 ext 4 or API 31/32 ext 9", + mValidAdServicesSdkExtVersion || mValidAdExtServicesSdkExtVersion + ) /* API is not available */ - Assume.assumeTrue("maxSdkVersion = API 31-34 ext 9", - AdServicesInfo.adServicesVersion() < 10 && AdServicesInfo.extServicesVersionS() < 10) + Assume.assumeTrue( + "maxSdkVersion = API 31-34 ext 9", + AdServicesInfo.adServicesVersion() < 10 && AdServicesInfo.extServicesVersionS() < 10 + ) mockCustomAudienceManager(mContext, mValidAdExtServicesSdkExtVersion) val managerCompat = obtain(mContext) // Verify that it throws an exception assertThrows(UnsupportedOperationException::class.java) { - runBlocking { - val request = FetchAndJoinCustomAudienceRequest( - uri, - name, - activationTime, - expirationTime, - userBiddingSignals - ) - managerCompat!!.fetchAndJoinCustomAudience(request) + runBlocking { + val request = + FetchAndJoinCustomAudienceRequest( + uri, + name, + activationTime, + expirationTime, + userBiddingSignals + ) + managerCompat!!.fetchAndJoinCustomAudience(request) + } } - }.hasMessageThat().contains("API is not available. Min version is API 31 ext 10") + .hasMessageThat() + .contains("API is not available. Min version is API 31 ext 10") } @Test fun testJoinCustomAudience() { - Assume.assumeTrue("minSdkVersion = API 33 ext 4 or API 31/32 ext 9", - mValidAdServicesSdkExtVersion || mValidAdExtServicesSdkExtVersion) + Assume.assumeTrue( + "minSdkVersion = API 33 ext 4 or API 31/32 ext 9", + mValidAdServicesSdkExtVersion || mValidAdExtServicesSdkExtVersion + ) val customAudienceManager = mockCustomAudienceManager(mContext, mValidAdExtServicesSdkExtVersion) @@ -137,20 +147,22 @@ // Actually invoke the compat code. runBlocking { - val customAudience = CustomAudience.Builder(buyer, name, uri, uri, ads) - .setActivationTime(Instant.now()) - .setExpirationTime(Instant.now()) - .setUserBiddingSignals(userBiddingSignals) - .setTrustedBiddingData(trustedBiddingSignals) - .build() + val customAudience = + CustomAudience.Builder(buyer, name, uri, uri, ads) + .setActivationTime(Instant.now()) + .setExpirationTime(Instant.now()) + .setUserBiddingSignals(userBiddingSignals) + .setTrustedBiddingData(trustedBiddingSignals) + .build() val request = JoinCustomAudienceRequest(customAudience) managerCompat!!.joinCustomAudience(request) } // Verify that the compat code was invoked correctly. - val captor = ArgumentCaptor.forClass( - android.adservices.customaudience.JoinCustomAudienceRequest::class.java - ) + val captor = + ArgumentCaptor.forClass( + android.adservices.customaudience.JoinCustomAudienceRequest::class.java + ) verify(customAudienceManager).joinCustomAudience(captor.capture(), any(), any()) // Verify that the request that the compat code makes to the platform is correct. @@ -159,9 +171,10 @@ @Test fun testFetchAndJoinCustomAudience() { - Assume.assumeTrue("minSdkVersion = API 31 ext 10", - AdServicesInfo.adServicesVersion() >= 10 || - AdServicesInfo.extServicesVersionS() >= 10) + Assume.assumeTrue( + "minSdkVersion = API 31 ext 10", + AdServicesInfo.adServicesVersion() >= 10 || AdServicesInfo.extServicesVersionS() >= 10 + ) val customAudienceManager = mockCustomAudienceManager(mContext, mValidAdExtServicesSdkExtVersion) @@ -170,20 +183,22 @@ // Actually invoke the compat code. runBlocking { - val request = FetchAndJoinCustomAudienceRequest( - uri, - name, - activationTime, - expirationTime, - userBiddingSignals - ) + val request = + FetchAndJoinCustomAudienceRequest( + uri, + name, + activationTime, + expirationTime, + userBiddingSignals + ) managerCompat!!.fetchAndJoinCustomAudience(request) } // Verify that the compat code was invoked correctly. - val captor = ArgumentCaptor.forClass( - android.adservices.customaudience.FetchAndJoinCustomAudienceRequest::class.java - ) + val captor = + ArgumentCaptor.forClass( + android.adservices.customaudience.FetchAndJoinCustomAudienceRequest::class.java + ) verify(customAudienceManager).fetchAndJoinCustomAudience(captor.capture(), any(), any()) // Verify that the request that the compat code makes to the platform is correct. @@ -192,8 +207,10 @@ @Test fun testLeaveCustomAudience() { - Assume.assumeTrue("minSdkVersion = API 33 ext 4 or API 31/32 ext 9", - mValidAdServicesSdkExtVersion || mValidAdExtServicesSdkExtVersion) + Assume.assumeTrue( + "minSdkVersion = API 33 ext 4 or API 31/32 ext 9", + mValidAdServicesSdkExtVersion || mValidAdExtServicesSdkExtVersion + ) val customAudienceManager = mockCustomAudienceManager(mContext, mValidAdExtServicesSdkExtVersion) @@ -207,9 +224,10 @@ } // Verify that the compat code was invoked correctly. - val captor = ArgumentCaptor.forClass( - android.adservices.customaudience.LeaveCustomAudienceRequest::class.java - ) + val captor = + ArgumentCaptor.forClass( + android.adservices.customaudience.LeaveCustomAudienceRequest::class.java + ) verify(customAudienceManager).leaveCustomAudience(captor.capture(), any(), any()) // Verify that the request that the compat code makes to the platform is correct. @@ -262,7 +280,8 @@ receiver.onResult(Object()) null } - doAnswer(answer).`when`(customAudienceManager) + doAnswer(answer) + .`when`(customAudienceManager) .fetchAndJoinCustomAudience(any(), any(), any()) } @@ -275,23 +294,28 @@ android.adservices.common.AdSelectionSignals.fromString(signals) val trustedBiddingSignals = android.adservices.customaudience.TrustedBiddingData.Builder() - .setTrustedBiddingKeys(keys) - .setTrustedBiddingUri(uri) - .build() - val customAudience = android.adservices.customaudience.CustomAudience.Builder() - .setBuyer(adtechIdentifier) - .setName(name) - .setActivationTime(Instant.now()) - .setExpirationTime(Instant.now()) - .setBiddingLogicUri(uri) - .setDailyUpdateUri(uri) - .setUserBiddingSignals(userBiddingSignals) - .setTrustedBiddingData(trustedBiddingSignals) - .setAds(listOf(android.adservices.common.AdData.Builder() - .setRenderUri(uri) - .setMetadata(metadata) - .build())) - .build() + .setTrustedBiddingKeys(keys) + .setTrustedBiddingUri(uri) + .build() + val customAudience = + android.adservices.customaudience.CustomAudience.Builder() + .setBuyer(adtechIdentifier) + .setName(name) + .setActivationTime(Instant.now()) + .setExpirationTime(Instant.now()) + .setBiddingLogicUri(uri) + .setDailyUpdateUri(uri) + .setUserBiddingSignals(userBiddingSignals) + .setTrustedBiddingData(trustedBiddingSignals) + .setAds( + listOf( + android.adservices.common.AdData.Builder() + .setRenderUri(uri) + .setMetadata(metadata) + .build() + ) + ) + .build() val expectedRequest = android.adservices.customaudience.JoinCustomAudienceRequest.Builder() @@ -299,29 +323,58 @@ .build() // Verify that the actual request matches the expected one. - Truth.assertThat(expectedRequest.customAudience.ads.size == - joinCustomAudienceRequest.customAudience.ads.size).isTrue() - Truth.assertThat(expectedRequest.customAudience.ads[0].renderUri == - joinCustomAudienceRequest.customAudience.ads[0].renderUri).isTrue() - Truth.assertThat(expectedRequest.customAudience.ads[0].metadata == - joinCustomAudienceRequest.customAudience.ads[0].metadata).isTrue() - Truth.assertThat(expectedRequest.customAudience.biddingLogicUri == - joinCustomAudienceRequest.customAudience.biddingLogicUri).isTrue() - Truth.assertThat(expectedRequest.customAudience.buyer.toString() == - joinCustomAudienceRequest.customAudience.buyer.toString()).isTrue() - Truth.assertThat(expectedRequest.customAudience.dailyUpdateUri == - joinCustomAudienceRequest.customAudience.dailyUpdateUri).isTrue() - Truth.assertThat(expectedRequest.customAudience.name == - joinCustomAudienceRequest.customAudience.name).isTrue() - Truth.assertThat(trustedBiddingSignals.trustedBiddingKeys == - joinCustomAudienceRequest.customAudience.trustedBiddingData!!.trustedBiddingKeys) - .isTrue() - Truth.assertThat(trustedBiddingSignals.trustedBiddingUri == - joinCustomAudienceRequest.customAudience.trustedBiddingData!!.trustedBiddingUri) + Truth.assertThat( + expectedRequest.customAudience.ads.size == + joinCustomAudienceRequest.customAudience.ads.size + ) .isTrue() Truth.assertThat( - joinCustomAudienceRequest.customAudience.userBiddingSignals!!.toString() == - signals).isTrue() + expectedRequest.customAudience.ads[0].renderUri == + joinCustomAudienceRequest.customAudience.ads[0].renderUri + ) + .isTrue() + Truth.assertThat( + expectedRequest.customAudience.ads[0].metadata == + joinCustomAudienceRequest.customAudience.ads[0].metadata + ) + .isTrue() + Truth.assertThat( + expectedRequest.customAudience.biddingLogicUri == + joinCustomAudienceRequest.customAudience.biddingLogicUri + ) + .isTrue() + Truth.assertThat( + expectedRequest.customAudience.buyer.toString() == + joinCustomAudienceRequest.customAudience.buyer.toString() + ) + .isTrue() + Truth.assertThat( + expectedRequest.customAudience.dailyUpdateUri == + joinCustomAudienceRequest.customAudience.dailyUpdateUri + ) + .isTrue() + Truth.assertThat( + expectedRequest.customAudience.name == + joinCustomAudienceRequest.customAudience.name + ) + .isTrue() + Truth.assertThat( + trustedBiddingSignals.trustedBiddingKeys == + joinCustomAudienceRequest.customAudience.trustedBiddingData!! + .trustedBiddingKeys + ) + .isTrue() + Truth.assertThat( + trustedBiddingSignals.trustedBiddingUri == + joinCustomAudienceRequest.customAudience.trustedBiddingData!! + .trustedBiddingUri + ) + .isTrue() + Truth.assertThat( + joinCustomAudienceRequest.customAudience.userBiddingSignals!!.toString() == + signals + ) + .isTrue() } private fun verifyFetchAndJoinCustomAudienceRequest( @@ -329,14 +382,13 @@ android.adservices.customaudience.FetchAndJoinCustomAudienceRequest ) { // Set up the request that we expect the compat code to invoke. - val expectedRequest = android.adservices.customaudience - .FetchAndJoinCustomAudienceRequest - .Builder(uri) - .setName(name) - .setActivationTime(activationTime) - .setExpirationTime(expirationTime) - .setUserBiddingSignals(userBiddingSignals.convertToAdServices()) - .build() + val expectedRequest = + android.adservices.customaudience.FetchAndJoinCustomAudienceRequest.Builder(uri) + .setName(name) + .setActivationTime(activationTime) + .setExpirationTime(expirationTime) + .setUserBiddingSignals(userBiddingSignals.convertToAdServices()) + .build() // Verify that the actual request matches the expected one. Truth.assertThat(expectedRequest == fetchAndJoinCustomAudienceRequest).isTrue() @@ -348,11 +400,11 @@ // Set up the request that we expect the compat code to invoke. val adtechIdentifier = android.adservices.common.AdTechIdentifier.fromString(adtech) - val expectedRequest = android.adservices.customaudience.LeaveCustomAudienceRequest - .Builder() - .setBuyer(adtechIdentifier) - .setName(name) - .build() + val expectedRequest = + android.adservices.customaudience.LeaveCustomAudienceRequest.Builder() + .setBuyer(adtechIdentifier) + .setName(name) + .build() // Verify that the actual request matches the expected one. Truth.assertThat(expectedRequest == leaveCustomAudienceRequest).isTrue()
diff --git a/privacysandbox/ads/ads-adservices/src/androidTest/java/androidx/privacysandbox/ads/adservices/customaudience/CustomAudienceTest.kt b/privacysandbox/ads/ads-adservices/src/androidTest/java/androidx/privacysandbox/ads/adservices/customaudience/CustomAudienceTest.kt index f6da70b..542aed4 100644 --- a/privacysandbox/ads/ads-adservices/src/androidTest/java/androidx/privacysandbox/ads/adservices/customaudience/CustomAudienceTest.kt +++ b/privacysandbox/ads/ads-adservices/src/androidTest/java/androidx/privacysandbox/ads/adservices/customaudience/CustomAudienceTest.kt
@@ -48,50 +48,51 @@ private val trustedBiddingSignals: TrustedBiddingData = TrustedBiddingData(uri, keys) private val adCounterKeys: Set= setOf private val interval = Duration.ofSeconds(1) - private val adFilters: AdFilters = AdFilters( - FrequencyCapFilters( - keyedFrequencyCapsForViewEvents = - listOf(KeyedFrequencyCap(1, 3, interval)), + private val adFilters: AdFilters = + AdFilters( + FrequencyCapFilters( + keyedFrequencyCapsForViewEvents = listOf(KeyedFrequencyCap(1, 3, interval)), + ) ) - ) - private val ads: List(1, 2, 3) = listOf( - AdData(uri, "metadata", adCounterKeys, adFilters) - ) + private val ads: List= listOf(AdData(uri, "metadata", adCounterKeys, adFilters)) @Test fun testToStringAndEquals() { - val result = "CustomAudience: buyer=abc.com, name=abc, activationTime=$activationTime, " + - "expirationTime=$expirationTime, dailyUpdateUri=abc.com, " + - "userBiddingSignals=AdSelectionSignals: signals, " + - "trustedBiddingSignals=TrustedBiddingData: trustedBiddingUri=abc.com " + - "trustedBiddingKeys=[key1, key2], biddingLogicUri=abc.com, " + - "ads=[AdData: renderUri=abc.com, metadata='metadata', adCounterKeys=[1, 2, 3], " + - "adFilters=AdFilters: frequencyCapFilters=FrequencyCapFilters: " + - "keyedFrequencyCapsForWinEvents=[], " + - "keyedFrequencyCapsForImpressionEvents=[], " + - "keyedFrequencyCapsForViewEvents=" + - "[KeyedFrequencyCap: adCounterKey=1, maxCount=3, interval=$interval], " + - "keyedFrequencyCapsForClickEvents=[], adRenderId=null]" + val result = + "CustomAudience: buyer=abc.com, name=abc, activationTime=$activationTime, " + + "expirationTime=$expirationTime, dailyUpdateUri=abc.com, " + + "userBiddingSignals=AdSelectionSignals: signals, " + + "trustedBiddingSignals=TrustedBiddingData: trustedBiddingUri=abc.com " + + "trustedBiddingKeys=[key1, key2], biddingLogicUri=abc.com, " + + "ads=[AdData: renderUri=abc.com, metadata='metadata', adCounterKeys=[1, 2, 3], " + + "adFilters=AdFilters: frequencyCapFilters=FrequencyCapFilters: " + + "keyedFrequencyCapsForWinEvents=[], " + + "keyedFrequencyCapsForImpressionEvents=[], " + + "keyedFrequencyCapsForViewEvents=" + + "[KeyedFrequencyCap: adCounterKey=1, maxCount=3, interval=$interval], " + + "keyedFrequencyCapsForClickEvents=[], adRenderId=null]" - val customAudience = CustomAudience( - buyer, - name, - uri, - uri, - ads, - activationTime, - expirationTime, - userBiddingSignals, - trustedBiddingSignals - ) + val customAudience = + CustomAudience( + buyer, + name, + uri, + uri, + ads, + activationTime, + expirationTime, + userBiddingSignals, + trustedBiddingSignals + ) Truth.assertThat(customAudience.toString()).isEqualTo(result) // Verify Builder. - val customAudienceBuilder2 = CustomAudience.Builder(buyer, name, uri, uri, ads) - .setActivationTime(activationTime) - .setExpirationTime(expirationTime) - .setUserBiddingSignals(userBiddingSignals) - .setTrustedBiddingData(trustedBiddingSignals) + val customAudienceBuilder2 = + CustomAudience.Builder(buyer, name, uri, uri, ads) + .setActivationTime(activationTime) + .setExpirationTime(expirationTime) + .setUserBiddingSignals(userBiddingSignals) + .setTrustedBiddingData(trustedBiddingSignals) Truth.assertThat(customAudienceBuilder2.build().toString()).isEqualTo(result) // Test equality.
diff --git a/privacysandbox/ads/ads-adservices/src/androidTest/java/androidx/privacysandbox/ads/adservices/customaudience/FetchAndJoinCustomAudienceRequestTest.kt b/privacysandbox/ads/ads-adservices/src/androidTest/java/androidx/privacysandbox/ads/adservices/customaudience/FetchAndJoinCustomAudienceRequestTest.kt index 4c024d6..7eeb32c 100644 --- a/privacysandbox/ads/ads-adservices/src/androidTest/java/androidx/privacysandbox/ads/adservices/customaudience/FetchAndJoinCustomAudienceRequestTest.kt +++ b/privacysandbox/ads/ads-adservices/src/androidTest/java/androidx/privacysandbox/ads/adservices/customaudience/FetchAndJoinCustomAudienceRequestTest.kt
@@ -40,34 +40,39 @@ @Test fun testToString() { - val request = FetchAndJoinCustomAudienceRequest( - fetchUri, - name, - activationTime, - expirationTime, - userBiddingSignals) - val result = "FetchAndJoinCustomAudienceRequest: fetchUri=$fetchUri, " + - "name=$name, activationTime=$activationTime, " + - "expirationTime=$expirationTime, userBiddingSignals=$userBiddingSignals" + val request = + FetchAndJoinCustomAudienceRequest( + fetchUri, + name, + activationTime, + expirationTime, + userBiddingSignals + ) + val result = + "FetchAndJoinCustomAudienceRequest: fetchUri=$fetchUri, " + + "name=$name, activationTime=$activationTime, " + + "expirationTime=$expirationTime, userBiddingSignals=$userBiddingSignals" Truth.assertThat(request.toString()).isEqualTo(result) } @Test fun testEquals() { - val fetchAndJoinCustomAudienceRequest1 = FetchAndJoinCustomAudienceRequest( - fetchUri, - name, - activationTime, - expirationTime, - userBiddingSignals - ) - var fetchAndJoinCustomAudienceRequest2 = FetchAndJoinCustomAudienceRequest( - Uri.parse("abc.com"), - "abc", - Instant.ofEpochSecond(5), - Instant.ofEpochSecond(10), - AdSelectionSignals("signals") - ) + val fetchAndJoinCustomAudienceRequest1 = + FetchAndJoinCustomAudienceRequest( + fetchUri, + name, + activationTime, + expirationTime, + userBiddingSignals + ) + var fetchAndJoinCustomAudienceRequest2 = + FetchAndJoinCustomAudienceRequest( + Uri.parse("abc.com"), + "abc", + Instant.ofEpochSecond(5), + Instant.ofEpochSecond(10), + AdSelectionSignals("signals") + ) Truth.assertThat(fetchAndJoinCustomAudienceRequest1 == fetchAndJoinCustomAudienceRequest2) .isTrue() }
diff --git a/privacysandbox/ads/ads-adservices/src/androidTest/java/androidx/privacysandbox/ads/adservices/customaudience/JoinCustomAudienceRequestTest.kt b/privacysandbox/ads/ads-adservices/src/androidTest/java/androidx/privacysandbox/ads/adservices/customaudience/JoinCustomAudienceRequestTest.kt index 4563164..3fbc94d 100644 --- a/privacysandbox/ads/ads-adservices/src/androidTest/java/androidx/privacysandbox/ads/adservices/customaudience/JoinCustomAudienceRequestTest.kt +++ b/privacysandbox/ads/ads-adservices/src/androidTest/java/androidx/privacysandbox/ads/adservices/customaudience/JoinCustomAudienceRequestTest.kt
@@ -46,16 +46,18 @@ @Test fun testToString() { - val customAudience = CustomAudience( - buyer, - name, - uri, - uri, - ads, - activationTime, - expirationTime, - userBiddingSignals, - trustedBiddingSignals) + val customAudience = + CustomAudience( + buyer, + name, + uri, + uri, + ads, + activationTime, + expirationTime, + userBiddingSignals, + trustedBiddingSignals + ) val result = "JoinCustomAudience: customAudience=$customAudience" val joinCustomAudienceRequest = JoinCustomAudienceRequest(customAudience) Truth.assertThat(joinCustomAudienceRequest.toString()).isEqualTo(result)
diff --git a/privacysandbox/ads/ads-adservices/src/androidTest/java/androidx/privacysandbox/ads/adservices/customaudience/LeaveCustomAudienceTest.kt b/privacysandbox/ads/ads-adservices/src/androidTest/java/androidx/privacysandbox/ads/adservices/customaudience/LeaveCustomAudienceTest.kt index ab733ca..2ce2f13 100644 --- a/privacysandbox/ads/ads-adservices/src/androidTest/java/androidx/privacysandbox/ads/adservices/customaudience/LeaveCustomAudienceTest.kt +++ b/privacysandbox/ads/ads-adservices/src/androidTest/java/androidx/privacysandbox/ads/adservices/customaudience/LeaveCustomAudienceTest.kt
@@ -28,6 +28,7 @@ class LeaveCustomAudienceTest { private val adTechIdentifier: AdTechIdentifier = AdTechIdentifier("1234") private val name = "abc" + @Test fun testToString() { val result = "LeaveCustomAudience: buyer=1234, name=abc"
diff --git a/privacysandbox/ads/ads-adservices/src/androidTest/java/androidx/privacysandbox/ads/adservices/measurement/DeletionRequestTest.kt b/privacysandbox/ads/ads-adservices/src/androidTest/java/androidx/privacysandbox/ads/adservices/measurement/DeletionRequestTest.kt index 30281ab..1020d72 100644 --- a/privacysandbox/ads/ads-adservices/src/androidTest/java/androidx/privacysandbox/ads/adservices/measurement/DeletionRequestTest.kt +++ b/privacysandbox/ads/ads-adservices/src/androidTest/java/androidx/privacysandbox/ads/adservices/measurement/DeletionRequestTest.kt
@@ -32,37 +32,43 @@ @SdkSuppress(minSdkVersion = 26) // For Instant#MIN and Instant#MAX reference fun testToString() { val now = Instant.now() - val result = "DeletionRequest { DeletionMode=DELETION_MODE_ALL, " + - "MatchBehavior=MATCH_BEHAVIOR_DELETE, " + - "Start=$now, End=$now, DomainUris=[www.abc.com], OriginUris=[www.xyz.com] }" + val result = + "DeletionRequest { DeletionMode=DELETION_MODE_ALL, " + + "MatchBehavior=MATCH_BEHAVIOR_DELETE, " + + "Start=$now, End=$now, DomainUris=[www.abc.com], OriginUris=[www.xyz.com] }" - val deletionRequest = DeletionRequest( - DeletionRequest.DELETION_MODE_ALL, - DeletionRequest.MATCH_BEHAVIOR_DELETE, - now, - now, - listOf(Uri.parse("www.abc.com")), - listOf(Uri.parse("www.xyz.com")), - ) + val deletionRequest = + DeletionRequest( + DeletionRequest.DELETION_MODE_ALL, + DeletionRequest.MATCH_BEHAVIOR_DELETE, + now, + now, + listOf(Uri.parse("www.abc.com")), + listOf(Uri.parse("www.xyz.com")), + ) Truth.assertThat(deletionRequest.toString()).isEqualTo(result) } @Test @SdkSuppress(minSdkVersion = 26) // For Instant#MIN and Instant#MAX reference fun testEquals() { - val deletionRequest1 = DeletionRequest( - DeletionRequest.DELETION_MODE_ALL, - DeletionRequest.MATCH_BEHAVIOR_DELETE, - Instant.MIN, - Instant.MAX, - listOf(Uri.parse("www.abc.com")), - listOf(Uri.parse("www.xyz.com"))) - val deletionRequest2 = DeletionRequest.Builder( - deletionMode = DeletionRequest.DELETION_MODE_ALL, - matchBehavior = DeletionRequest.MATCH_BEHAVIOR_DELETE) - .setDomainUris(listOf(Uri.parse("www.abc.com"))) - .setOriginUris(listOf(Uri.parse("www.xyz.com"))) - .build() + val deletionRequest1 = + DeletionRequest( + DeletionRequest.DELETION_MODE_ALL, + DeletionRequest.MATCH_BEHAVIOR_DELETE, + Instant.MIN, + Instant.MAX, + listOf(Uri.parse("www.abc.com")), + listOf(Uri.parse("www.xyz.com")) + ) + val deletionRequest2 = + DeletionRequest.Builder( + deletionMode = DeletionRequest.DELETION_MODE_ALL, + matchBehavior = DeletionRequest.MATCH_BEHAVIOR_DELETE + ) + .setDomainUris(listOf(Uri.parse("www.abc.com"))) + .setOriginUris(listOf(Uri.parse("www.xyz.com"))) + .build() Truth.assertThat(deletionRequest1 == deletionRequest2).isTrue() } }
diff --git a/privacysandbox/ads/ads-adservices/src/androidTest/java/androidx/privacysandbox/ads/adservices/measurement/MeasurementManagerTest.kt b/privacysandbox/ads/ads-adservices/src/androidTest/java/androidx/privacysandbox/ads/adservices/measurement/MeasurementManagerTest.kt index d2d8d66..77ef543 100644 --- a/privacysandbox/ads/ads-adservices/src/androidTest/java/androidx/privacysandbox/ads/adservices/measurement/MeasurementManagerTest.kt +++ b/privacysandbox/ads/ads-adservices/src/androidTest/java/androidx/privacysandbox/ads/adservices/measurement/MeasurementManagerTest.kt
@@ -74,10 +74,11 @@ if (mValidExtServicesVersion) { // setup a mockitoSession to return the mocked manager // when the static method .get() is called - mSession = ExtendedMockito.mockitoSession() - .mockStatic(android.adservices.measurement.MeasurementManager::class.java) - .strictness(Strictness.LENIENT) - .startMocking() + mSession = + ExtendedMockito.mockitoSession() + .mockStatic(android.adservices.measurement.MeasurementManager::class.java) + .strictness(Strictness.LENIENT) + .startMocking() } } @@ -97,8 +98,10 @@ @Test fun testMeasurementManagerNoClassDefFoundError() { - Assume.assumeTrue("minSdkVersion = API 31/32 ext 9 or API 30 ext 11", - mValidExtServicesVersion) + Assume.assumeTrue( + "minSdkVersion = API 31/32 ext 9 or API 30 ext 11", + mValidExtServicesVersion + ) `when`(MeasurementManager.get(any())).thenThrow(NoClassDefFoundError()) assertThat(obtain(mContext)).isNull() @@ -107,8 +110,10 @@ @Test @SdkSuppress(minSdkVersion = 31) fun testDeleteRegistrationsOnSPlus() { - Assume.assumeTrue("minSdkVersion = API 33 ext 5 or API 31/32 ext 9", - mValidAdServicesSdkExtVersion || mValidAdExtServicesSdkExtVersionS) + Assume.assumeTrue( + "minSdkVersion = API 33 ext 5 or API 31/32 ext 9", + mValidAdServicesSdkExtVersion || mValidAdExtServicesSdkExtVersionS + ) val measurementManager = mockMeasurementManager(mContext, mValidAdExtServicesSdkExtVersionS) val managerCompat = obtain(mContext) @@ -119,34 +124,38 @@ receiver.onResult(Object()) null } - doAnswer(answer).`when`(measurementManager).deleteRegistrations( - any(), - any(), - any>() - ) + doAnswer(answer) + .`when`(measurementManager) + .deleteRegistrations( + any(), + any(), + any>() + ) // Actually invoke the compat code. runBlocking { - val request = DeletionRequest( - DeletionRequest.DELETION_MODE_ALL, - DeletionRequest.MATCH_BEHAVIOR_DELETE, - Instant.now(), - Instant.now(), - listOf(uri1), - listOf(uri1)) + val request = + DeletionRequest( + DeletionRequest.DELETION_MODE_ALL, + DeletionRequest.MATCH_BEHAVIOR_DELETE, + Instant.now(), + Instant.now(), + listOf(uri1), + listOf(uri1) + ) managerCompat!!.deleteRegistrations(request) } // Verify that the compat code was invoked correctly. - val captor = ArgumentCaptor.forClass( - android.adservices.measurement.DeletionRequest::class.java - ) - verify(measurementManager).deleteRegistrations( - captor.capture(), - any(), - any>() - ) + val captor = + ArgumentCaptor.forClass(android.adservices.measurement.DeletionRequest::class.java) + verify(measurementManager) + .deleteRegistrations( + captor.capture(), + any(), + any>() + ) // Verify that the request that the compat code makes to the platform is correct. verifyDeletionRequest(captor.value) @@ -155,8 +164,10 @@ @Test @SdkSuppress(minSdkVersion = 31) fun testRegisterSourceOnSPlus() { - Assume.assumeTrue("minSdkVersion = API 33 ext 5 or API 31/32 ext 9", - mValidAdServicesSdkExtVersion || mValidAdExtServicesSdkExtVersionS) + Assume.assumeTrue( + "minSdkVersion = API 33 ext 5 or API 31/32 ext 9", + mValidAdServicesSdkExtVersion || mValidAdExtServicesSdkExtVersionS + ) val measurementManager = mockMeasurementManager(mContext, mValidAdExtServicesSdkExtVersionS) val inputEvent = mock(InputEvent::class.java) @@ -167,26 +178,28 @@ receiver.onResult(Object()) null } - doAnswer(answer).`when`(measurementManager).registerSource( - any(), - any(), - any(), - any>() - ) + doAnswer(answer) + .`when`(measurementManager) + .registerSource( + any(), + any(), + any(), + any>() + ) // Actually invoke the compat code. - runBlocking { - managerCompat!!.registerSource(uri1, inputEvent) - } + runBlocking { managerCompat!!.registerSource(uri1, inputEvent) } // Verify that the compat code was invoked correctly. val captor1 = ArgumentCaptor.forClass(Uri::class.java) val captor2 = ArgumentCaptor.forClass(InputEvent::class.java) - verify(measurementManager).registerSource( - captor1.capture(), - captor2.capture(), - any(), - any>()) + verify(measurementManager) + .registerSource( + captor1.capture(), + captor2.capture(), + any(), + any>() + ) // Verify that the request that the compat code makes to the platform is correct. assertThat(captor1.value == uri1) @@ -196,8 +209,10 @@ @Test @SdkSuppress(minSdkVersion = 31) fun testRegisterTriggerOnSPlus() { - Assume.assumeTrue("minSdkVersion = API 33 ext 5 or API 31/32 ext 9", - mValidAdServicesSdkExtVersion || mValidAdExtServicesSdkExtVersionS) + Assume.assumeTrue( + "minSdkVersion = API 33 ext 5 or API 31/32 ext 9", + mValidAdServicesSdkExtVersion || mValidAdExtServicesSdkExtVersionS + ) val measurementManager = mockMeasurementManager(mContext, mValidAdExtServicesSdkExtVersionS) val managerCompat = obtain(mContext) @@ -206,20 +221,21 @@ receiver.onResult(Object()) null } - doAnswer(answer).`when`(measurementManager) + doAnswer(answer) + .`when`(measurementManager) .registerTrigger(any(), any // Actually invoke the compat code. - runBlocking { - managerCompat!!.registerTrigger(uri1) - } + runBlocking { managerCompat!!.registerTrigger(uri1) } // Verify that the compat code was invoked correctly. val captor1 = ArgumentCaptor.forClass(Uri::class.java) - verify(measurementManager).registerTrigger( - captor1.capture(), - any(), any >()) (), - any>()) + verify(measurementManager) + .registerTrigger( + captor1.capture(), + any(), + any>() + ) // Verify that the request that the compat code makes to the platform is correct. assertThat(captor1.value).isEqualTo(uri1) @@ -228,8 +244,10 @@ @Test @SdkSuppress(minSdkVersion = 31) fun testRegisterWebSourceOnSPlus() { - Assume.assumeTrue("minSdkVersion = API 33 ext 5 or API 31/32 ext 9", - mValidAdServicesSdkExtVersion || mValidAdExtServicesSdkExtVersionS) + Assume.assumeTrue( + "minSdkVersion = API 33 ext 5 or API 31/32 ext 9", + mValidAdServicesSdkExtVersion || mValidAdExtServicesSdkExtVersionS + ) val measurementManager = mockMeasurementManager(mContext, mValidAdExtServicesSdkExtVersionS) val managerCompat = obtain(mContext) @@ -238,29 +256,33 @@ receiver.onResult(Object()) null } - doAnswer(answer).`when`(measurementManager).registerWebSource( - any(), - any(), - any>() - ) + doAnswer(answer) + .`when`(measurementManager) + .registerWebSource( + any(), + any(), + any>() + ) - val request = WebSourceRegistrationRequest.Builder( - listOf(WebSourceParams(uri1, false)), uri1) - .setAppDestination(appDestination) - .build() + val request = + WebSourceRegistrationRequest.Builder(listOf(WebSourceParams(uri1, false)), uri1) + .setAppDestination(appDestination) + .build() // Actually invoke the compat code. - runBlocking { - managerCompat!!.registerWebSource(request) - } + runBlocking { managerCompat!!.registerWebSource(request) } // Verify that the compat code was invoked correctly. - val captor1 = ArgumentCaptor.forClass( - android.adservices.measurement.WebSourceRegistrationRequest::class.java) - verify(measurementManager).registerWebSource( - captor1.capture(), - any(), - any>()) + val captor1 = + ArgumentCaptor.forClass( + android.adservices.measurement.WebSourceRegistrationRequest::class.java + ) + verify(measurementManager) + .registerWebSource( + captor1.capture(), + any(), + any>() + ) // Verify that the request that the compat code makes to the platform is correct. val actualRequest = captor1.value @@ -275,8 +297,10 @@ @Test @SdkSuppress(minSdkVersion = 31) fun testRegisterSource_allSuccessOnSPlus() { - Assume.assumeTrue("minSdkVersion = API 33 ext 5 or API 31/32 ext 9", - mValidAdServicesSdkExtVersion || mValidAdExtServicesSdkExtVersionS) + Assume.assumeTrue( + "minSdkVersion = API 33 ext 5 or API 31/32 ext 9", + mValidAdServicesSdkExtVersion || mValidAdExtServicesSdkExtVersionS + ) val measurementManager = mockMeasurementManager(mContext, mValidAdExtServicesSdkExtVersionS) val mockInputEvent = mock(InputEvent::class.java) @@ -287,7 +311,8 @@ receiver.onResult(Object()) null } - doAnswer(successCallback).`when`(measurementManager) + doAnswer(successCallback) + .`when`(measurementManager) .registerSource( any(), any(), @@ -298,25 +323,26 @@ val request = SourceRegistrationRequest(listOf(uri1, uri2), mockInputEvent) // Actually invoke the compat code. - runBlocking { - managerCompat!!.registerSource(request) - } + runBlocking { managerCompat!!.registerSource(request) } // Verify that the compat code was invoked correctly. - verify(measurementManager, times(2)).registerSource( - any(), - eq(mockInputEvent), - any(), - any>() - ) + verify(measurementManager, times(2)) + .registerSource( + any(), + eq(mockInputEvent), + any(), + any>() + ) } @ExperimentalFeatures.RegisterSourceOptIn @Test @SdkSuppress(minSdkVersion = 31) fun testRegisterSource_15thOf20Fails_remaining5DoNotExecuteOnSPlus() { - Assume.assumeTrue("minSdkVersion = API 33 ext 5 or API 31/32 ext 9", - mValidAdServicesSdkExtVersion || mValidAdExtServicesSdkExtVersionS) + Assume.assumeTrue( + "minSdkVersion = API 33 ext 5 or API 31/32 ext 9", + mValidAdServicesSdkExtVersion || mValidAdExtServicesSdkExtVersionS + ) val measurementManager = mockMeasurementManager(mContext, mValidAdExtServicesSdkExtVersionS) val mockInputEvent = mock(InputEvent::class.java) @@ -334,27 +360,32 @@ receiver.onError(IllegalArgumentException(errorMessage)) null } - val uris = (0..20).map { i -> - val uri = Uri.parse("www.uri$i.com") - if (i == 15) { - doAnswer(errorCallback).`when`(measurementManager) - .registerSource( - eq(uri), - any(), - any(), - any>() - ) - } else { - doAnswer(successCallback).`when`(measurementManager) - .registerSource( - eq(uri), - any(), - any(), - any>() - ) - } - uri - }.toList() + val uris = + (0..20) + .map { i -> + val uri = Uri.parse("www.uri$i.com") + if (i == 15) { + doAnswer(errorCallback) + .`when`(measurementManager) + .registerSource( + eq(uri), + any(), + any(), + any>() + ) + } else { + doAnswer(successCallback) + .`when`(measurementManager) + .registerSource( + eq(uri), + any(), + any(), + any>() + ) + } + uri + } + .toList() val request = SourceRegistrationRequest(uris, mockInputEvent) @@ -370,28 +401,32 @@ // Verify that the compat code was invoked correctly. (0..15).forEach { i -> - verify(measurementManager).registerSource( - eq(Uri.parse("www.uri$i.com")), - eq(mockInputEvent), - any(), - any>() - ) + verify(measurementManager) + .registerSource( + eq(Uri.parse("www.uri$i.com")), + eq(mockInputEvent), + any(), + any>() + ) } (16..20).forEach { i -> - verify(measurementManager, never()).registerSource( - eq(Uri.parse("www.uri$i.com")), - eq(mockInputEvent), - any(), - any>() - ) + verify(measurementManager, never()) + .registerSource( + eq(Uri.parse("www.uri$i.com")), + eq(mockInputEvent), + any(), + any>() + ) } } @Test @SdkSuppress(minSdkVersion = 31) fun testRegisterWebTriggerOnSPlus() { - Assume.assumeTrue("minSdkVersion = API 33 ext 5 or API 31/32 ext 9", - mValidAdServicesSdkExtVersion || mValidAdExtServicesSdkExtVersionS) + Assume.assumeTrue( + "minSdkVersion = API 33 ext 5 or API 31/32 ext 9", + mValidAdServicesSdkExtVersion || mValidAdExtServicesSdkExtVersionS + ) val measurementManager = mockMeasurementManager(mContext, mValidAdExtServicesSdkExtVersionS) val managerCompat = obtain(mContext) @@ -400,27 +435,30 @@ receiver.onResult(Object()) null } - doAnswer(answer).`when`(measurementManager).registerWebTrigger( - any(), - any(), - any>() - ) + doAnswer(answer) + .`when`(measurementManager) + .registerWebTrigger( + any(), + any(), + any>() + ) - val request = WebTriggerRegistrationRequest( - listOf(WebTriggerParams(uri1, false)), uri2) + val request = WebTriggerRegistrationRequest(listOf(WebTriggerParams(uri1, false)), uri2) // Actually invoke the compat code. - runBlocking { - managerCompat!!.registerWebTrigger(request) - } + runBlocking { managerCompat!!.registerWebTrigger(request) } // Verify that the compat code was invoked correctly. - val captor1 = ArgumentCaptor.forClass( - android.adservices.measurement.WebTriggerRegistrationRequest::class.java) - verify(measurementManager).registerWebTrigger( - captor1.capture(), - any(), - any>()) + val captor1 = + ArgumentCaptor.forClass( + android.adservices.measurement.WebTriggerRegistrationRequest::class.java + ) + verify(measurementManager) + .registerWebTrigger( + captor1.capture(), + any(), + any>() + ) // Verify that the request that the compat code makes to the platform is correct. val actualRequest = captor1.value @@ -433,21 +471,26 @@ @Test @SdkSuppress(minSdkVersion = 31) fun testMeasurementApiStatusOnSPlus() { - Assume.assumeTrue("minSdkVersion = API 33 ext 5 or API 31/32 ext 9", - mValidAdServicesSdkExtVersion || mValidAdExtServicesSdkExtVersionS) + Assume.assumeTrue( + "minSdkVersion = API 33 ext 5 or API 31/32 ext 9", + mValidAdServicesSdkExtVersion || mValidAdExtServicesSdkExtVersionS + ) val measurementManager = mockMeasurementManager(mContext, mValidAdExtServicesSdkExtVersionS) callAndVerifyGetMeasurementApiStatusOnSPlus( measurementManager, /* state= */ MeasurementManager.MEASUREMENT_API_STATE_ENABLED, - /* expectedResult= */ MeasurementManager.MEASUREMENT_API_STATE_ENABLED) + /* expectedResult= */ MeasurementManager.MEASUREMENT_API_STATE_ENABLED + ) } @Test @SdkSuppress(minSdkVersion = 31) fun testMeasurementApiStatusUnknownOnSPlus() { - Assume.assumeTrue("minSdkVersion = API 33 ext 5 or API 31/32 ext 9", - mValidAdServicesSdkExtVersion || mValidAdExtServicesSdkExtVersionS) + Assume.assumeTrue( + "minSdkVersion = API 33 ext 5 or API 31/32 ext 9", + mValidAdServicesSdkExtVersion || mValidAdExtServicesSdkExtVersionS + ) val measurementManager = mockMeasurementManager(mContext, mValidAdExtServicesSdkExtVersionS) @@ -456,7 +499,8 @@ callAndVerifyGetMeasurementApiStatusOnSPlus( measurementManager, /* state= */ 6, - /* expectedResult= */ 5) + /* expectedResult= */ 5 + ) } @Test @@ -473,34 +517,38 @@ receiver.onResult(Object()) null } - doAnswer(answer).`when`(measurementManager).deleteRegistrations( - any(), - any(), - any>() - ) + doAnswer(answer) + .`when`(measurementManager) + .deleteRegistrations( + any(), + any(), + any>() + ) // Actually invoke the compat code. runBlocking { - val request = DeletionRequest( - DeletionRequest.DELETION_MODE_ALL, - DeletionRequest.MATCH_BEHAVIOR_DELETE, - Instant.now(), - Instant.now(), - listOf(uri1), - listOf(uri1)) + val request = + DeletionRequest( + DeletionRequest.DELETION_MODE_ALL, + DeletionRequest.MATCH_BEHAVIOR_DELETE, + Instant.now(), + Instant.now(), + listOf(uri1), + listOf(uri1) + ) managerCompat!!.deleteRegistrations(request) } // Verify that the compat code was invoked correctly. - val captor = ArgumentCaptor.forClass( - android.adservices.measurement.DeletionRequest::class.java - ) - verify(measurementManager).deleteRegistrations( - captor.capture(), - any(), - any>() - ) + val captor = + ArgumentCaptor.forClass(android.adservices.measurement.DeletionRequest::class.java) + verify(measurementManager) + .deleteRegistrations( + captor.capture(), + any(), + any>() + ) // Verify that the request that the compat code makes to the platform is correct. verifyDeletionRequest(captor.value) @@ -520,26 +568,28 @@ receiver.onResult(Object()) null } - doAnswer(answer).`when`(measurementManager).registerSource( - any(), - any(), - any(), - any>() - ) + doAnswer(answer) + .`when`(measurementManager) + .registerSource( + any(), + any(), + any(), + any>() + ) // Actually invoke the compat code. - runBlocking { - managerCompat!!.registerSource(uri1, inputEvent) - } + runBlocking { managerCompat!!.registerSource(uri1, inputEvent) } // Verify that the compat code was invoked correctly. val captor1 = ArgumentCaptor.forClass(Uri::class.java) val captor2 = ArgumentCaptor.forClass(InputEvent::class.java) - verify(measurementManager).registerSource( - captor1.capture(), - captor2.capture(), - any(), - any>()) + verify(measurementManager) + .registerSource( + captor1.capture(), + captor2.capture(), + any(), + any>() + ) // Verify that the request that the compat code makes to the platform is correct. assertThat(captor1.value == uri1) @@ -558,23 +608,25 @@ receiver.onResult(Object()) null } - doAnswer(answer).`when`(measurementManager) + doAnswer(answer) + .`when`(measurementManager) .registerTrigger( any(), any(), - any>()) + any>() + ) // Actually invoke the compat code. - runBlocking { - managerCompat!!.registerTrigger(uri1) - } + runBlocking { managerCompat!!.registerTrigger(uri1) } // Verify that the compat code was invoked correctly. val captor1 = ArgumentCaptor.forClass(Uri::class.java) - verify(measurementManager).registerTrigger( - captor1.capture(), - any(), - any>()) + verify(measurementManager) + .registerTrigger( + captor1.capture(), + any(), + any>() + ) // Verify that the request that the compat code makes to the platform is correct. assertThat(captor1.value).isEqualTo(uri1) @@ -592,29 +644,33 @@ receiver.onResult(Object()) null } - doAnswer(answer).`when`(measurementManager).registerWebSource( - any(), - any(), - any>() - ) + doAnswer(answer) + .`when`(measurementManager) + .registerWebSource( + any(), + any(), + any>() + ) - val request = WebSourceRegistrationRequest.Builder( - listOf(WebSourceParams(uri1, false)), uri1) - .setAppDestination(appDestination) - .build() + val request = + WebSourceRegistrationRequest.Builder(listOf(WebSourceParams(uri1, false)), uri1) + .setAppDestination(appDestination) + .build() // Actually invoke the compat code. - runBlocking { - managerCompat!!.registerWebSource(request) - } + runBlocking { managerCompat!!.registerWebSource(request) } // Verify that the compat code was invoked correctly. - val captor1 = ArgumentCaptor.forClass( - android.adservices.measurement.WebSourceRegistrationRequest::class.java) - verify(measurementManager).registerWebSource( - captor1.capture(), - any(), - any>()) + val captor1 = + ArgumentCaptor.forClass( + android.adservices.measurement.WebSourceRegistrationRequest::class.java + ) + verify(measurementManager) + .registerWebSource( + captor1.capture(), + any(), + any>() + ) // Verify that the request that the compat code makes to the platform is correct. val actualRequest = captor1.value @@ -640,7 +696,8 @@ receiver.onResult(Object()) null } - doAnswer(successCallback).`when`(measurementManager) + doAnswer(successCallback) + .`when`(measurementManager) .registerSource( any(), any(), @@ -651,17 +708,16 @@ val request = SourceRegistrationRequest(listOf(uri1, uri2), mockInputEvent) // Actually invoke the compat code. - runBlocking { - managerCompat!!.registerSource(request) - } + runBlocking { managerCompat!!.registerSource(request) } // Verify that the compat code was invoked correctly. - verify(measurementManager, times(2)).registerSource( - any(), - eq(mockInputEvent), - any(), - any>() - ) + verify(measurementManager, times(2)) + .registerSource( + any(), + eq(mockInputEvent), + any(), + any>() + ) } @ExperimentalFeatures.RegisterSourceOptIn @@ -686,27 +742,32 @@ receiver.onError(IllegalArgumentException(errorMessage)) null } - val uris = (0..20).map { i -> - val uri = Uri.parse("www.uri$i.com") - if (i == 15) { - doAnswer(errorCallback).`when`(measurementManager) - .registerSource( - eq(uri), - any(), - any(), - any>() - ) - } else { - doAnswer(successCallback).`when`(measurementManager) - .registerSource( - eq(uri), - any(), - any(), - any>() - ) - } - uri - }.toList() + val uris = + (0..20) + .map { i -> + val uri = Uri.parse("www.uri$i.com") + if (i == 15) { + doAnswer(errorCallback) + .`when`(measurementManager) + .registerSource( + eq(uri), + any(), + any(), + any>() + ) + } else { + doAnswer(successCallback) + .`when`(measurementManager) + .registerSource( + eq(uri), + any(), + any(), + any>() + ) + } + uri + } + .toList() val request = SourceRegistrationRequest(uris, mockInputEvent) @@ -722,20 +783,22 @@ // Verify that the compat code was invoked correctly. (0..15).forEach { i -> - verify(measurementManager).registerSource( - eq(Uri.parse("www.uri$i.com")), - eq(mockInputEvent), - any(), - any>() - ) + verify(measurementManager) + .registerSource( + eq(Uri.parse("www.uri$i.com")), + eq(mockInputEvent), + any(), + any>() + ) } (16..20).forEach { i -> - verify(measurementManager, never()).registerSource( - eq(Uri.parse("www.uri$i.com")), - eq(mockInputEvent), - any(), - any>() - ) + verify(measurementManager, never()) + .registerSource( + eq(Uri.parse("www.uri$i.com")), + eq(mockInputEvent), + any(), + any>() + ) } } @@ -751,27 +814,30 @@ receiver.onResult(Object()) null } - doAnswer(answer).`when`(measurementManager).registerWebTrigger( - any(), - any(), - any>() - ) + doAnswer(answer) + .`when`(measurementManager) + .registerWebTrigger( + any(), + any(), + any>() + ) - val request = WebTriggerRegistrationRequest( - listOf(WebTriggerParams(uri1, false)), uri2) + val request = WebTriggerRegistrationRequest(listOf(WebTriggerParams(uri1, false)), uri2) // Actually invoke the compat code. - runBlocking { - managerCompat!!.registerWebTrigger(request) - } + runBlocking { managerCompat!!.registerWebTrigger(request) } // Verify that the compat code was invoked correctly. - val captor1 = ArgumentCaptor.forClass( - android.adservices.measurement.WebTriggerRegistrationRequest::class.java) - verify(measurementManager).registerWebTrigger( - captor1.capture(), - any(), - any>()) + val captor1 = + ArgumentCaptor.forClass( + android.adservices.measurement.WebTriggerRegistrationRequest::class.java + ) + verify(measurementManager) + .registerWebTrigger( + captor1.capture(), + any(), + any>() + ) // Verify that the request that the compat code makes to the platform is correct. val actualRequest = captor1.value @@ -790,7 +856,8 @@ callAndVerifyGetMeasurementApiStatusOnR( measurementManager, /* state= */ MeasurementManager.MEASUREMENT_API_STATE_ENABLED, - /* expectedResult= */ MeasurementManager.MEASUREMENT_API_STATE_ENABLED) + /* expectedResult= */ MeasurementManager.MEASUREMENT_API_STATE_ENABLED + ) } @Test @@ -805,7 +872,8 @@ callAndVerifyGetMeasurementApiStatusOnR( measurementManager, /* state= */ 6, - /* expectedResult= */ 5) + /* expectedResult= */ 5 + ) } @SdkSuppress(minSdkVersion = 30) @@ -826,8 +894,7 @@ .thenReturn(measurementManager) // only mock the .get() method if using the extServices version if (isExtServices) { - `when`(MeasurementManager.get(any())) - .thenReturn(measurementManager) + `when`(MeasurementManager.get(any())).thenReturn(measurementManager) } return measurementManager } @@ -843,19 +910,16 @@ receiver.onResult(state) null } - doAnswer(answer).`when`(measurementManager) + doAnswer(answer) + .`when`(measurementManager) .getMeasurementApiStatus(any(), any // Actually invoke the compat code. - val actualResult = runBlocking { - managerCompat!!.getMeasurementApiStatus() - } + val actualResult = runBlocking { managerCompat!!.getMeasurementApiStatus() } // Verify that the compat code was invoked correctly. - verify(measurementManager).getMeasurementApiStatus( - any>()) (), - any>() - ) + verify(measurementManager) + .getMeasurementApiStatus(any(), any // Verify that the request that the compat code makes to the platform is correct. assertThat(actualResult == expectedResult) @@ -872,21 +936,22 @@ receiver.onResult(state) null } - doAnswer(answer).`when`(measurementManager) + doAnswer(answer) + .`when`(measurementManager) .getMeasurementApiStatus( any>()) (), - any>()) + any>() + ) // Actually invoke the compat code. - val actualResult = runBlocking { - managerCompat!!.getMeasurementApiStatus() - } + val actualResult = runBlocking { managerCompat!!.getMeasurementApiStatus() } // Verify that the compat code was invoked correctly. - verify(measurementManager).getMeasurementApiStatus( - any(), - any>() - ) + verify(measurementManager) + .getMeasurementApiStatus( + any(), + any>() + ) // Verify that the request that the compat code makes to the platform is correct. assertThat(actualResult == expectedResult) @@ -894,10 +959,11 @@ private fun verifyDeletionRequest(request: android.adservices.measurement.DeletionRequest) { // Set up the request that we expect the compat code to invoke. - val expectedRequest = android.adservices.measurement.DeletionRequest.Builder() - .setDomainUris(listOf(uri1)) - .setOriginUris(listOf(uri1)) - .build() + val expectedRequest = + android.adservices.measurement.DeletionRequest.Builder() + .setDomainUris(listOf(uri1)) + .setOriginUris(listOf(uri1)) + .build() assertThat(HashSet(request.domainUris) == HashSet(expectedRequest.domainUris)) assertThat(HashSet(request.originUris) == HashSet(expectedRequest.originUris))
diff --git a/privacysandbox/ads/ads-adservices/src/androidTest/java/androidx/privacysandbox/ads/adservices/measurement/SourceRegistrationRequestTest.kt b/privacysandbox/ads/ads-adservices/src/androidTest/java/androidx/privacysandbox/ads/adservices/measurement/SourceRegistrationRequestTest.kt index 71ece96..6b82f66 100644 --- a/privacysandbox/ads/ads-adservices/src/androidTest/java/androidx/privacysandbox/ads/adservices/measurement/SourceRegistrationRequestTest.kt +++ b/privacysandbox/ads/ads-adservices/src/androidTest/java/androidx/privacysandbox/ads/adservices/measurement/SourceRegistrationRequestTest.kt
@@ -31,8 +31,9 @@ class SourceRegistrationRequestTest { @Test fun testToString() { - val result = "AppSourcesRegistrationRequest { RegistrationUris=" + - "[[www.abc.com, www.xyz.com]], InputEvent=null }" + val result = + "AppSourcesRegistrationRequest { RegistrationUris=" + + "[[www.abc.com, www.xyz.com]], InputEvent=null }" val uri1 = Uri.parse("www.abc.com") val uri2 = Uri.parse("www.xyz.com") @@ -47,9 +48,7 @@ val uri2 = Uri.parse("www.xyz.com") val params = listOf(uri1, uri2) val inputEvent = KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_ENTER) - val request1 = SourceRegistrationRequest.Builder(params) - .setInputEvent(inputEvent) - .build() + val request1 = SourceRegistrationRequest.Builder(params).setInputEvent(inputEvent).build() val request2 = SourceRegistrationRequest(params, inputEvent) val request3 = SourceRegistrationRequest.Builder(params).build()
diff --git a/privacysandbox/ads/ads-adservices/src/androidTest/java/androidx/privacysandbox/ads/adservices/measurement/WebSourceRegistrationRequestTest.kt b/privacysandbox/ads/ads-adservices/src/androidTest/java/androidx/privacysandbox/ads/adservices/measurement/WebSourceRegistrationRequestTest.kt index 840976c..e1d014a 100644 --- a/privacysandbox/ads/ads-adservices/src/androidTest/java/androidx/privacysandbox/ads/adservices/measurement/WebSourceRegistrationRequestTest.kt +++ b/privacysandbox/ads/ads-adservices/src/androidTest/java/androidx/privacysandbox/ads/adservices/measurement/WebSourceRegistrationRequestTest.kt
@@ -28,27 +28,30 @@ class WebSourceRegistrationRequestTest { @Test fun testToString() { - val result = "WebSourceRegistrationRequest { WebSourceParams=" + - "[[WebSourceParams { RegistrationUri=www.abc.com, DebugKeyAllowed=false }]], " + - "TopOriginUri=www.abc.com, InputEvent=null, AppDestination=null, WebDestination=null," + - " VerifiedDestination=null }" + val result = + "WebSourceRegistrationRequest { WebSourceParams=" + + "[[WebSourceParams { RegistrationUri=www.abc.com, DebugKeyAllowed=false }]], " + + "TopOriginUri=www.abc.com, InputEvent=null, AppDestination=null, WebDestination=null," + + " VerifiedDestination=null }" val uri = Uri.parse("www.abc.com") val params = listOf(WebSourceParams(uri, false)) val request = WebSourceRegistrationRequest.Builder(params, uri).build() Truth.assertThat(request.toString()).isEqualTo(result) - val result2 = "WebSourceRegistrationRequest { WebSourceParams=[[WebSourceParams " + - "{ RegistrationUri=www.abc.com, DebugKeyAllowed=false }]], TopOriginUri=www.abc.com, " + - "InputEvent=null, AppDestination=www.abc.com, WebDestination=www.abc.com, " + - "VerifiedDestination=www.abc.com }" + val result2 = + "WebSourceRegistrationRequest { WebSourceParams=[[WebSourceParams " + + "{ RegistrationUri=www.abc.com, DebugKeyAllowed=false }]], TopOriginUri=www.abc.com, " + + "InputEvent=null, AppDestination=www.abc.com, WebDestination=www.abc.com, " + + "VerifiedDestination=www.abc.com }" val params2 = listOf(WebSourceParams(uri, false)) - val request2 = WebSourceRegistrationRequest.Builder(params2, uri) - .setWebDestination(uri) - .setAppDestination(uri) - .setVerifiedDestination(uri) - .build() + val request2 = + WebSourceRegistrationRequest.Builder(params2, uri) + .setWebDestination(uri) + .setAppDestination(uri) + .setVerifiedDestination(uri) + .build() Truth.assertThat(request2.toString()).isEqualTo(result2) } @@ -57,18 +60,13 @@ val uri = Uri.parse("www.abc.com") val params = listOf(WebSourceParams(uri, false)) - val request1 = WebSourceRegistrationRequest.Builder(params, uri) - .setWebDestination(uri) - .setAppDestination(uri) - .setVerifiedDestination(uri) - .build() - val request2 = WebSourceRegistrationRequest( - params, - uri, - null, - uri, - uri, - uri) + val request1 = + WebSourceRegistrationRequest.Builder(params, uri) + .setWebDestination(uri) + .setAppDestination(uri) + .setVerifiedDestination(uri) + .build() + val request2 = WebSourceRegistrationRequest(params, uri, null, uri, uri, uri) val request3 = WebSourceRegistrationRequest.Builder(params, uri).build() Truth.assertThat(request1 == request2).isTrue()
diff --git a/privacysandbox/ads/ads-adservices/src/androidTest/java/androidx/privacysandbox/ads/adservices/measurement/WebTriggerRegistrationRequestTest.kt b/privacysandbox/ads/ads-adservices/src/androidTest/java/androidx/privacysandbox/ads/adservices/measurement/WebTriggerRegistrationRequestTest.kt index 5c33a88..8de7727 100644 --- a/privacysandbox/ads/ads-adservices/src/androidTest/java/androidx/privacysandbox/ads/adservices/measurement/WebTriggerRegistrationRequestTest.kt +++ b/privacysandbox/ads/ads-adservices/src/androidTest/java/androidx/privacysandbox/ads/adservices/measurement/WebTriggerRegistrationRequestTest.kt
@@ -28,8 +28,9 @@ class WebTriggerRegistrationRequestTest { @Test fun testToString() { - val result = "WebTriggerRegistrationRequest { WebTriggerParams=[WebTriggerParams " + - "{ RegistrationUri=www.abc.com, DebugKeyAllowed=false }], Destination=www.abc.com" + val result = + "WebTriggerRegistrationRequest { WebTriggerParams=[WebTriggerParams " + + "{ RegistrationUri=www.abc.com, DebugKeyAllowed=false }], Destination=www.abc.com" val uri = Uri.parse("www.abc.com") val params = listOf(WebTriggerParams(uri, false)) @@ -44,9 +45,7 @@ val params = listOf(WebTriggerParams(uri, false)) val request1 = WebTriggerRegistrationRequest(params, uri) val request2 = WebTriggerRegistrationRequest(params, uri) - val request3 = WebTriggerRegistrationRequest( - params, - Uri.parse("https://abc.com")) + val request3 = WebTriggerRegistrationRequest(params, Uri.parse("https://abc.com")) Truth.assertThat(request1 == request2).isTrue() Truth.assertThat(request1 != request3).isTrue()
diff --git a/privacysandbox/ads/ads-adservices/src/androidTest/java/androidx/privacysandbox/ads/adservices/topics/GetTopicsRequestHelperTest.kt b/privacysandbox/ads/ads-adservices/src/androidTest/java/androidx/privacysandbox/ads/adservices/topics/GetTopicsRequestHelperTest.kt index 0f042e7..4477492 100644 --- a/privacysandbox/ads/ads-adservices/src/androidTest/java/androidx/privacysandbox/ads/adservices/topics/GetTopicsRequestHelperTest.kt +++ b/privacysandbox/ads/ads-adservices/src/androidTest/java/androidx/privacysandbox/ads/adservices/topics/GetTopicsRequestHelperTest.kt
@@ -35,8 +35,10 @@ @Test fun testRequestWithoutRecordObservation() { - Assume.assumeTrue("minSdkVersion = API 33 ext 4 or API 31/32 ext 9", - mValidAdServicesSdkExt4Version || mValidAdExtServicesSdkExtVersion) + Assume.assumeTrue( + "minSdkVersion = API 33 ext 4 or API 31/32 ext 9", + mValidAdServicesSdkExt4Version || mValidAdExtServicesSdkExtVersion + ) var request = GetTopicsRequest("sdk1") var convertedRequest = @@ -47,8 +49,10 @@ @Test fun testRequestWithRecordObservation() { - Assume.assumeTrue("minSdkVersion = API 33 ext 5 or API 31/32 ext 9", - mValidAdServicesSdkExt5Version || mValidAdExtServicesSdkExtVersion) + Assume.assumeTrue( + "minSdkVersion = API 33 ext 5 or API 31/32 ext 9", + mValidAdServicesSdkExt5Version || mValidAdExtServicesSdkExtVersion + ) var request = GetTopicsRequest("sdk1", true) var convertedRequest = GetTopicsRequestHelper.convertRequestWithRecordObservation(request)
diff --git a/privacysandbox/ads/ads-adservices/src/androidTest/java/androidx/privacysandbox/ads/adservices/topics/GetTopicsRequestTest.kt b/privacysandbox/ads/ads-adservices/src/androidTest/java/androidx/privacysandbox/ads/adservices/topics/GetTopicsRequestTest.kt index 70cd0c4..f6207a1 100644 --- a/privacysandbox/ads/ads-adservices/src/androidTest/java/androidx/privacysandbox/ads/adservices/topics/GetTopicsRequestTest.kt +++ b/privacysandbox/ads/ads-adservices/src/androidTest/java/androidx/privacysandbox/ads/adservices/topics/GetTopicsRequestTest.kt
@@ -33,10 +33,11 @@ Truth.assertThat(request.toString()).isEqualTo(result) // Verify Builder. - val request2 = GetTopicsRequest.Builder() - .setAdsSdkName("sdk1") - .setShouldRecordObservation(false) - .build() + val request2 = + GetTopicsRequest.Builder() + .setAdsSdkName("sdk1") + .setShouldRecordObservation(false) + .build() Truth.assertThat(request.toString()).isEqualTo(result) // Verify equality. @@ -50,9 +51,7 @@ Truth.assertThat(request.toString()).isEqualTo(result) // Verify Builder. - val request2 = GetTopicsRequest.Builder() - .setShouldRecordObservation(true) - .build() + val request2 = GetTopicsRequest.Builder().setShouldRecordObservation(true).build() Truth.assertThat(request.toString()).isEqualTo(result) // Verify equality. @@ -62,10 +61,7 @@ @Test fun testBuilder_setEmptyAdsSdkName_throwsError() { assertThrows(IllegalStateException::class.java) { - GetTopicsRequest.Builder() - .setAdsSdkName("") - .setShouldRecordObservation(true) - .build() + GetTopicsRequest.Builder().setAdsSdkName("").setShouldRecordObservation(true).build() } } }
diff --git a/privacysandbox/ads/ads-adservices/src/androidTest/java/androidx/privacysandbox/ads/adservices/topics/GetTopicsResponseHelperTest.kt b/privacysandbox/ads/ads-adservices/src/androidTest/java/androidx/privacysandbox/ads/adservices/topics/GetTopicsResponseHelperTest.kt index 5f95b62..3da072d 100644 --- a/privacysandbox/ads/ads-adservices/src/androidTest/java/androidx/privacysandbox/ads/adservices/topics/GetTopicsResponseHelperTest.kt +++ b/privacysandbox/ads/ads-adservices/src/androidTest/java/androidx/privacysandbox/ads/adservices/topics/GetTopicsResponseHelperTest.kt
@@ -78,10 +78,9 @@ "encapsulatedKey".toByteArray(), ) - var response = GetTopicsResponse.Builder(listOf(topic1, topic2), - listOf(encryptedTopic1)).build() - var convertedResponse = - GetTopicsResponseHelper.convertResponseWithEncryptedTopics(response) + var response = + GetTopicsResponse.Builder(listOf(topic1, topic2), listOf(encryptedTopic1)).build() + var convertedResponse = GetTopicsResponseHelper.convertResponseWithEncryptedTopics(response) assertEquals(2, convertedResponse.topics.size) assertEquals(1, convertedResponse.encryptedTopics.size)
diff --git a/privacysandbox/ads/ads-adservices/src/androidTest/java/androidx/privacysandbox/ads/adservices/topics/TopicsManagerTest.kt b/privacysandbox/ads/ads-adservices/src/androidTest/java/androidx/privacysandbox/ads/adservices/topics/TopicsManagerTest.kt index 615fab2..b9a98c6 100644 --- a/privacysandbox/ads/ads-adservices/src/androidTest/java/androidx/privacysandbox/ads/adservices/topics/TopicsManagerTest.kt +++ b/privacysandbox/ads/ads-adservices/src/androidTest/java/androidx/privacysandbox/ads/adservices/topics/TopicsManagerTest.kt
@@ -69,10 +69,11 @@ if (mValidAdExtServicesSdkExt9Version) { // setup a mockitoSession to return the mocked manager // when the static method .get() is called - mSession = ExtendedMockito.mockitoSession() - .mockStatic(android.adservices.topics.TopicsManager::class.java) - .strictness(Strictness.LENIENT) - .startMocking() + mSession = + ExtendedMockito.mockitoSession() + .mockStatic(android.adservices.topics.TopicsManager::class.java) + .strictness(Strictness.LENIENT) + .startMocking() } } @@ -91,7 +92,7 @@ @Test fun testTopicsManagerNoClassDefFoundError() { - Assume.assumeTrue("minSdkVersion = API 31/32 ext 9", mValidAdExtServicesSdkExt9Version); + Assume.assumeTrue("minSdkVersion = API 31/32 ext 9", mValidAdExtServicesSdkExt9Version) `when`(TopicsManager.get(any())).thenThrow(NoClassDefFoundError()) assertThat(obtain(mContext)).isNull() @@ -110,17 +111,17 @@ // Actually invoke the compat code. val result = runBlocking { - val request = GetTopicsRequest.Builder() - .setAdsSdkName(mSdkName) - .setShouldRecordObservation(true) - .build() + val request = + GetTopicsRequest.Builder() + .setAdsSdkName(mSdkName) + .setShouldRecordObservation(true) + .build() managerCompat!!.getTopics(request) } // Verify that the compat code was invoked correctly. - val captor = ArgumentCaptor - .forClass(android.adservices.topics.GetTopicsRequest::class.java) + val captor = ArgumentCaptor.forClass(android.adservices.topics.GetTopicsRequest::class.java) verify(topicsManager).getTopics(captor.capture(), any(), any()) // Verify that the request that the compat code makes to the platform is correct. @@ -143,17 +144,17 @@ // Actually invoke the compat code. val result = runBlocking { - val request = GetTopicsRequest.Builder() - .setAdsSdkName(mSdkName) - .setShouldRecordObservation(true) - .build() + val request = + GetTopicsRequest.Builder() + .setAdsSdkName(mSdkName) + .setShouldRecordObservation(true) + .build() managerCompat!!.getTopics(request) } // Verify that the compat code was invoked correctly. - val captor = ArgumentCaptor - .forClass(android.adservices.topics.GetTopicsRequest::class.java) + val captor = ArgumentCaptor.forClass(android.adservices.topics.GetTopicsRequest::class.java) verify(topicsManager).getTopics(captor.capture(), any(), any()) // Verify that the request that the compat code makes to the platform is correct. @@ -186,8 +187,7 @@ } // Verify that the compat code was invoked correctly. - val captor = ArgumentCaptor - .forClass(android.adservices.topics.GetTopicsRequest::class.java) + val captor = ArgumentCaptor.forClass(android.adservices.topics.GetTopicsRequest::class.java) verify(topicsManager).getTopics(captor.capture(), any(), any()) // Verify that the request that the compat code makes to the platform is correct. @@ -220,14 +220,16 @@ val topics = listOf(topic1, topic2) val response = android.adservices.topics.GetTopicsResponse.Builder(topics).build() val answer = { args: InvocationOnMock -> - val receiver = args.getArgument< - OutcomeReceiver>(2) + val receiver = + args.getArgument< + OutcomeReceiver+ >( + 2 + ) receiver.onResult(response) null } - doAnswer(answer).`when`(topicsManager).getTopics( - any(), any(), any() - ) + doAnswer(answer).`when`(topicsManager).getTopics(any(), any(), any()) } @Suppress("deprecation") @@ -235,38 +237,40 @@ // Set up the response that TopicsManager will return when the compat code calls it. val topic1 = Topic(1, 1, 1) val topic2 = Topic(2, 2, 2) - var encryptedTopic1 = EncryptedTopic( - "encryptedTopic1".toByteArray(), - "publicKey1", - "encapsulatedKey1".toByteArray() - ) - var encryptedTopic2 = EncryptedTopic( - "encryptedTopic2".toByteArray(), - "publicKey2", - "encapsulatedKey2".toByteArray() - ) + var encryptedTopic1 = + EncryptedTopic( + "encryptedTopic1".toByteArray(), + "publicKey1", + "encapsulatedKey1".toByteArray() + ) + var encryptedTopic2 = + EncryptedTopic( + "encryptedTopic2".toByteArray(), + "publicKey2", + "encapsulatedKey2".toByteArray() + ) val topics = listOf(topic1, topic2) val encryptedTopics = listOf(encryptedTopic1, encryptedTopic2) val response = android.adservices.topics.GetTopicsResponse.Builder(topics, encryptedTopics).build() val answer = { args: InvocationOnMock -> - val receiver = args.getArgument< - OutcomeReceiver >(2) + val receiver = + args.getArgument< + OutcomeReceiver+ >( + 2 + ) receiver.onResult(response) null } - doAnswer(answer).`when`(topicsManager).getTopics( - any(), any(), any() - ) + doAnswer(answer).`when`(topicsManager).getTopics(any(), any(), any()) } private fun verifyRequest(topicsRequest: android.adservices.topics.GetTopicsRequest) { // Set up the request that we expect the compat code to invoke. val expectedRequest = - android.adservices.topics.GetTopicsRequest.Builder() - .setAdsSdkName(mSdkName) - .build() + android.adservices.topics.GetTopicsRequest.Builder().setAdsSdkName(mSdkName).build() Assert.assertEquals(expectedRequest.adsSdkName, topicsRequest.adsSdkName) } @@ -276,8 +280,10 @@ ) { // Set up the request that we expect the compat code to invoke. val expectedRequest = - android.adservices.topics.GetTopicsRequest.Builder().setAdsSdkName(mSdkName) - .setShouldRecordObservation(false).build() + android.adservices.topics.GetTopicsRequest.Builder() + .setAdsSdkName(mSdkName) + .setShouldRecordObservation(false) + .build() Assert.assertEquals(expectedRequest.adsSdkName, topicsRequest.adsSdkName) }
diff --git a/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/adid/AdId.kt b/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/adid/AdId.kt index 22a9271..32dff31 100644 --- a/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/adid/AdId.kt +++ b/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/adid/AdId.kt
@@ -20,16 +20,13 @@ * A unique, user-resettable, device-wide, per-profile ID for advertising as returned by the * [AdIdManager#getAdId()] API. * - * Ad networks may use {@code AdId} to monetize for Interest Based Advertising (IBA), i.e. - * targeting and remarketing ads. The user may limit availability of this identifier. + * Ad networks may use {@code AdId} to monetize for Interest Based Advertising (IBA), i.e. targeting + * and remarketing ads. The user may limit availability of this identifier. * * @param adId The advertising ID. * @param isLimitAdTrackingEnabled the limit ad tracking enabled setting. */ -class AdId internal constructor( - val adId: String, - val isLimitAdTrackingEnabled: Boolean = false -) { +class AdId internal constructor(val adId: String, val isLimitAdTrackingEnabled: Boolean = false) { override fun equals(other: Any?): Boolean { if (this === other) return true
diff --git a/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/adid/AdIdManager.kt b/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/adid/AdIdManager.kt index 450eecf..a0eb9df 100644 --- a/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/adid/AdIdManager.kt +++ b/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/adid/AdIdManager.kt
@@ -43,10 +43,10 @@ companion object { /** - * Creates [AdIdManager]. + * Creates [AdIdManager]. * - * @return AdIdManager object. If the device is running an incompatible - * build, the value returned is null. + * @return AdIdManager object. If the device is running an incompatible build, the value + * returned is null. */ @JvmStatic @SuppressLint("NewApi", "ClassVerificationFailure")
diff --git a/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/adid/AdIdManagerApi30Ext11Impl.kt b/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/adid/AdIdManagerApi30Ext11Impl.kt index e8852b0..5cd2bf6 100644 --- a/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/adid/AdIdManagerApi30Ext11Impl.kt +++ b/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/adid/AdIdManagerApi30Ext11Impl.kt
@@ -41,14 +41,10 @@ } @RequiresPermission(AdServicesPermissions.ACCESS_ADSERVICES_AD_ID) - private suspend fun - getAdIdAsyncInternal(): android.adservices.adid.AdId = suspendCancellableCoroutine { - continuation -> - mAdIdManager.getAdId( - Runnable::run, - continuation.asAdServicesOutcomeReceiver() - ) - } + private suspend fun getAdIdAsyncInternal(): android.adservices.adid.AdId = + suspendCancellableCoroutine { continuation -> + mAdIdManager.getAdId(Runnable::run, continuation.asAdServicesOutcomeReceiver()) + } private fun convertResponse(response: android.adservices.adid.AdId): AdId { return AdId(response.adId, response.isLimitAdTrackingEnabled)
diff --git a/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/adid/AdIdManagerApi31Ext9Impl.kt b/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/adid/AdIdManagerApi31Ext9Impl.kt index 28d3d76..1e42cf8 100644 --- a/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/adid/AdIdManagerApi31Ext9Impl.kt +++ b/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/adid/AdIdManagerApi31Ext9Impl.kt
@@ -25,5 +25,5 @@ @RestrictTo(RestrictTo.Scope.LIBRARY) @SuppressLint("NewApi", "ClassVerificationFailure") @RequiresExtension(extension = Build.VERSION_CODES.S, version = 9) -class AdIdManagerApi31Ext9Impl(context: Context) : AdIdManagerImplCommon( - android.adservices.adid.AdIdManager.get(context)) +class AdIdManagerApi31Ext9Impl(context: Context) : + AdIdManagerImplCommon(android.adservices.adid.AdIdManager.get(context))
diff --git a/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/adid/AdIdManagerApi33Ext4Impl.kt b/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/adid/AdIdManagerApi33Ext4Impl.kt index a043fba..77d2421 100644 --- a/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/adid/AdIdManagerApi33Ext4Impl.kt +++ b/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/adid/AdIdManagerApi33Ext4Impl.kt
@@ -25,6 +25,7 @@ @RestrictTo(RestrictTo.Scope.LIBRARY) @SuppressLint("NewApi", "ClassVerificationFailure") @RequiresExtension(extension = SdkExtensions.AD_SERVICES, version = 4) -class AdIdManagerApi33Ext4Impl(context: Context) : AdIdManagerImplCommon( - context.getSystemService( - android.adservices.adid.AdIdManager::class.java)) +class AdIdManagerApi33Ext4Impl(context: Context) : + AdIdManagerImplCommon( + context.getSystemService(android.adservices.adid.AdIdManager::class.java) + )
diff --git a/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/adid/AdIdManagerImplCommon.kt b/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/adid/AdIdManagerImplCommon.kt index 4ba59b2..94c2ad7 100644 --- a/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/adid/AdIdManagerImplCommon.kt +++ b/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/adid/AdIdManagerImplCommon.kt
@@ -31,9 +31,8 @@ @SuppressLint("ClassVerificationFailure", "NewApi") @RequiresExtension(extension = SdkExtensions.AD_SERVICES, version = 4) @RequiresExtension(extension = Build.VERSION_CODES.S, version = 9) -open class AdIdManagerImplCommon( - private val mAdIdManager: android.adservices.adid.AdIdManager -) : AdIdManager() { +open class AdIdManagerImplCommon(private val mAdIdManager: android.adservices.adid.AdIdManager) : + AdIdManager() { @DoNotInline @RequiresPermission(AdServicesPermissions.ACCESS_ADSERVICES_AD_ID) @@ -42,14 +41,10 @@ } @RequiresPermission(AdServicesPermissions.ACCESS_ADSERVICES_AD_ID) - private suspend fun - getAdIdAsyncInternal(): android.adservices.adid.AdId = suspendCancellableCoroutine { - continuation -> - mAdIdManager.getAdId( - Runnable::run, - continuation.asOutcomeReceiver() - ) - } + private suspend fun getAdIdAsyncInternal(): android.adservices.adid.AdId = + suspendCancellableCoroutine { continuation -> + mAdIdManager.getAdId(Runnable::run, continuation.asOutcomeReceiver()) + } private fun convertResponse(response: android.adservices.adid.AdId): AdId { return AdId(response.adId, response.isLimitAdTrackingEnabled)
diff --git a/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/adselection/AdSelectionConfig.kt b/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/adselection/AdSelectionConfig.kt index 65e5d31..bec5c9a 100644 --- a/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/adselection/AdSelectionConfig.kt +++ b/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/adselection/AdSelectionConfig.kt
@@ -34,21 +34,22 @@ * * @param seller AdTechIdentifier of the seller, for example "www.example-ssp.com". * @param decisionLogicUri the URI used to retrieve the JS code containing the seller/SSP scoreAd - * function used during the ad selection and reporting processes. - * @param customAudienceBuyers a list of custom audience buyers allowed by the SSP to participate - * in the ad selection process. + * function used during the ad selection and reporting processes. + * @param customAudienceBuyers a list of custom audience buyers allowed by the SSP to participate in + * the ad selection process. * @param adSelectionSignals signals given to the participating buyers in the ad selection and - * reporting processes. - * @param sellerSignals represents any information that the SSP used in the ad - * scoring process to tweak the results of the ad selection process (e.g. brand safety - * checks, excluded contextual ads). + * reporting processes. + * @param sellerSignals represents any information that the SSP used in the ad scoring process to + * tweak the results of the ad selection process (e.g. brand safety checks, excluded contextual + * ads). * @param perBuyerSignals any information that each buyer would provide during ad selection to - * participants (such as bid floor, ad selection type, etc.) + * participants (such as bid floor, ad selection type, etc.) * @param trustedScoringSignalsUri URI endpoint of sell-side trusted signal from which creative - * specific realtime information can be fetched from. + * specific realtime information can be fetched from. */ @SuppressLint("ClassVerificationFailure") -class AdSelectionConfig public constructor( +class AdSelectionConfig +public constructor( val seller: AdTechIdentifier, val decisionLogicUri: Uri, val customAudienceBuyers: List, @@ -58,7 +59,7 @@ val trustedScoringSignalsUri: Uri ) { - /** Checks whether two [AdSelectionConfig] objects contain the same information. */ + /** Checks whether two [AdSelectionConfig] objects contain the same information. */ override fun equals(other: Any?): Boolean { if (this === other) return true if (other !is AdSelectionConfig) return false @@ -71,7 +72,7 @@ this.trustedScoringSignalsUri == other.trustedScoringSignalsUri } - /** Returns the hash of the [AdSelectionConfig] object's data. */ + /** Returns the hash of the [AdSelectionConfig] object's data. */ override fun hashCode(): Int { var hash = seller.hashCode() hash = 31 * hash + decisionLogicUri.hashCode() @@ -83,7 +84,7 @@ return hash } - /** Overrides the toString method. */ + /** Overrides the toString method. */ override fun toString(): String { return "AdSelectionConfig: seller=$seller, decisionLogicUri='$decisionLogicUri', " + "customAudienceBuyers=$customAudienceBuyers, adSelectionSignals=$adSelectionSignals, " + @@ -111,39 +112,45 @@ @RequiresExtension(extension = Build.VERSION_CODES.S, version = 9) private fun List.convertToAdServices(): MutableList{ - val ids = mutableListOf() - for (buyer in this) { - ids.add(buyer.convertToAdServices()) - } - return ids + val ids = mutableListOf() + for (buyer in this) { + ids.add(buyer.convertToAdServices()) + } + return ids } @RestrictTo(RestrictTo.Scope.LIBRARY) @RequiresExtension(extension = SdkExtensions.AD_SERVICES, version = 4) @RequiresExtension(extension = Build.VERSION_CODES.S, version = 9) private fun Map.convertToAdServices(): - MutableMap- android.adservices.common.AdSelectionSignals?> { - val map = HashMap - android.adservices.common.AdSelectionSignals?>() - for (key in this.keys) { - val id = key.convertToAdServices() - val value = this[key]?.convertToAdServices() - map[id] = value - } - return map + MutableMap< + android.adservices.common.AdTechIdentifier, + android.adservices.common.AdSelectionSignals? + > { + val map = + HashMap< + android.adservices.common.AdTechIdentifier, + android.adservices.common.AdSelectionSignals? + >() + for (key in this.keys) { + val id = key.convertToAdServices() + val value = this[key]?.convertToAdServices() + map[id] = value + } + return map } @RestrictTo(RestrictTo.Scope.LIBRARY) internal companion object { - val EMPTY = AdSelectionConfig( - AdTechIdentifier(""), - Uri.EMPTY, - emptyList(), - AdSelectionSignals(""), - AdSelectionSignals(""), - emptyMap(), - Uri.EMPTY - ) + val EMPTY = + AdSelectionConfig( + AdTechIdentifier(""), + Uri.EMPTY, + emptyList(), + AdSelectionSignals(""), + AdSelectionSignals(""), + emptyMap(), + Uri.EMPTY + ) } }
diff --git a/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/adselection/AdSelectionFromOutcomesConfig.kt b/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/adselection/AdSelectionFromOutcomesConfig.kt index af9cda0..2d6d52d 100644 --- a/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/adselection/AdSelectionFromOutcomesConfig.kt +++ b/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/adselection/AdSelectionFromOutcomesConfig.kt
@@ -34,21 +34,22 @@ * * @param seller AdTechIdentifier of the seller, for example "www.example-ssp.com". * @param adSelectionIds a list of ad selection ids passed by the SSP to participate in the ad - * selection from outcomes process. + * selection from outcomes process. * @param adSelectionSignals signals given to the participating buyers in the ad selection and - * reporting processes. - * @param selectionLogicUri the URI used to retrieve the JS code containing the seller/SSP - * function used during the ad selection. + * reporting processes. + * @param selectionLogicUri the URI used to retrieve the JS code containing the seller/SSP function + * used during the ad selection. */ @ExperimentalFeatures.Ext10OptIn -class AdSelectionFromOutcomesConfig public constructor( +class AdSelectionFromOutcomesConfig +public constructor( val seller: AdTechIdentifier, val adSelectionIds: List, val adSelectionSignals: AdSelectionSignals, var selectionLogicUri: Uri, ) { - /** Checks whether two [AdSelectionFromOutcomesConfig] objects contain the same information. */ + /** Checks whether two [AdSelectionFromOutcomesConfig] objects contain the same information. */ override fun equals(other: Any?): Boolean { if (this === other) return true if (other !is AdSelectionFromOutcomesConfig) return false @@ -58,7 +59,7 @@ this.selectionLogicUri == other.selectionLogicUri } - /** Returns the hash of the [AdSelectionFromOutcomesConfig] object's data. */ + /** Returns the hash of the [AdSelectionFromOutcomesConfig] object's data. */ override fun hashCode(): Int { var hash = seller.hashCode() hash = 31 * hash + adSelectionIds.hashCode() @@ -67,7 +68,7 @@ return hash } - /** Overrides the toString method. */ + /** Overrides the toString method. */ override fun toString(): String { return "AdSelectionFromOutcomesConfig: seller=$seller, adSelectionIds='$adSelectionIds', " + "adSelectionSignals=$adSelectionSignals, selectionLogicUri=$selectionLogicUri"
diff --git a/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/adselection/AdSelectionManager.kt b/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/adselection/AdSelectionManager.kt index 1b08e51..7a3b053 100644 --- a/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/adselection/AdSelectionManager.kt +++ b/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/adselection/AdSelectionManager.kt
@@ -28,8 +28,8 @@ import java.util.concurrent.TimeoutException /** - * AdSelection Manager provides APIs for app and ad-SDKs to run ad selection processes as well - * as report impressions. + * AdSelection Manager provides APIs for app and ad-SDKs to run ad selection processes as well as + * report impressions. */ abstract class AdSelectionManager internal constructor() { /** @@ -37,25 +37,25 @@ * application. * * @param adSelectionConfig the config The input {@code adSelectionConfig} is provided by the - * Ads SDK and the [AdSelectionConfig] object is transferred via a Binder call. For this - * reason, the total size of these objects is bound to the Android IPC limitations. Failures to - * transfer the [AdSelectionConfig] will throws an [TransactionTooLargeException]. + * Ads SDK and the [AdSelectionConfig] object is transferred via a Binder call. For this + * reason, the total size of these objects is bound to the Android IPC limitations. Failures + * to transfer the [AdSelectionConfig] will throws an [TransactionTooLargeException]. * - * The output is passed by the receiver, which either returns an [AdSelectionOutcome] - * for a successful run, or an [Exception] includes the type of the exception thrown and - * the corresponding error message. + * The output is passed by the receiver, which either returns an [AdSelectionOutcome] for a + * successful run, or an [Exception] includes the type of the exception thrown and the + * corresponding error message. * - * If the [IllegalArgumentException] is thrown, it is caused by invalid input argument - * the API received to run the ad selection. + * If the [IllegalArgumentException] is thrown, it is caused by invalid input argument the API + * received to run the ad selection. * * If the [IllegalStateException] is thrown with error message "Failure of AdSelection * services.", it is caused by an internal failure of the ad selection service. * - * If the [TimeoutException] is thrown, it is caused when a timeout is encountered - * during bidding, scoring, or overall selection process to find winning Ad. + * If the [TimeoutException] is thrown, it is caused when a timeout is encountered during + * bidding, scoring, or overall selection process to find winning Ad. * - * If the [LimitExceededException] is thrown, it is caused when the calling package - * exceeds the allowed rate limits and is throttled. + * If the [LimitExceededException] is thrown, it is caused when the calling package exceeds the + * allowed rate limits and is throttled. */ @RequiresPermission(AdServicesPermissions.ACCESS_ADSERVICES_CUSTOM_AUDIENCE) abstract suspend fun selectAds(adSelectionConfig: AdSelectionConfig): AdSelectionOutcome @@ -64,28 +64,28 @@ * Selects an ad from the results of previously ran ad selections. * * @param adSelectionFromOutcomesConfig is provided by the Ads SDK and the - * [AdSelectionFromOutcomesConfig] object is transferred via a Binder call. For this reason, the - * total size of these objects is bound to the Android IPC limitations. Failures to transfer the - * [AdSelectionFromOutcomesConfig] will throw an [TransactionTooLargeException]. + * [AdSelectionFromOutcomesConfig] object is transferred via a Binder call. For this reason, + * the total size of these objects is bound to the Android IPC limitations. Failures to + * transfer the [AdSelectionFromOutcomesConfig] will throw an [TransactionTooLargeException]. * - * The output is passed by the receiver, which either returns an [AdSelectionOutcome] - * for a successful run, or an [Exception] includes the type of the exception thrown and - * the corresponding error message. + * The output is passed by the receiver, which either returns an [AdSelectionOutcome] for a + * successful run, or an [Exception] includes the type of the exception thrown and the + * corresponding error message. * - * If the [IllegalArgumentException] is thrown, it is caused by invalid input argument - * the API received to run the ad selection. + * If the [IllegalArgumentException] is thrown, it is caused by invalid input argument the API + * received to run the ad selection. * * If the [IllegalStateException] is thrown with error message "Failure of AdSelection * services.", it is caused by an internal failure of the ad selection service. * - * If the [TimeoutException] is thrown, it is caused when a timeout is encountered - * during bidding, scoring, or overall selection process to find winning Ad. + * If the [TimeoutException] is thrown, it is caused when a timeout is encountered during + * bidding, scoring, or overall selection process to find winning Ad. * - * If the [LimitExceededException] is thrown, it is caused when the calling package - * exceeds the allowed rate limits and is throttled. + * If the [LimitExceededException] is thrown, it is caused when the calling package exceeds the + * allowed rate limits and is throttled. * - * If the [SecurityException] is thrown, it is caused when the caller is not authorized - * or permission is not requested. + * If the [SecurityException] is thrown, it is caused when the caller is not authorized or + * permission is not requested. * * If the [UnsupportedOperationException] is thrown, it is caused when the Android API level and * AdServices module versions don't support this API. @@ -97,25 +97,25 @@ ): AdSelectionOutcome /** - * Report the given impression. The [ReportImpressionRequest] is provided by the Ads SDK. - * The receiver either returns a {@code void} for a successful run, or an [Exception] - * indicating the error. + * Report the given impression. The [ReportImpressionRequest] is provided by the Ads SDK. The + * receiver either returns a {@code void} for a successful run, or an [Exception] indicating the + * error. * - * If the [IllegalArgumentException] is thrown, it is caused by invalid input argument - * the API received to report the impression. + * If the [IllegalArgumentException] is thrown, it is caused by invalid input argument the API + * received to report the impression. * * If the [IllegalStateException] is thrown with error message "Failure of AdSelection * services.", it is caused by an internal failure of the ad selection service. * - * If the [LimitExceededException] is thrown, it is caused when the calling package - * exceeds the allowed rate limits and is throttled. + * If the [LimitExceededException] is thrown, it is caused when the calling package exceeds the + * allowed rate limits and is throttled. * - * If the [SecurityException] is thrown, it is caused when the caller is not authorized - * or permission is not requested. + * If the [SecurityException] is thrown, it is caused when the caller is not authorized or + * permission is not requested. * * If the [UnsupportedOperationException] is thrown, it is caused when the Android API level and - * AdServices module versions don't support [ReportImpressionRequest] with null - * {@code AdSelectionConfig} + * AdServices module versions don't support [ReportImpressionRequest] with null {@code + * AdSelectionConfig} * * @param reportImpressionRequest the request for reporting impression. */ @@ -129,28 +129,28 @@ * when the ad event will be reported. The event reporting could be delayed and reports could be * batched. * - * Using [ReportEventRequest#getKey()], the service will fetch the {@code reportingUri} - * that was registered in {@code registerAdBeacon}. See documentation of [reportImpression] for - * more details regarding {@code registerAdBeacon}. Then, the service will attach + * Using [ReportEventRequest#getKey()], the service will fetch the {@code reportingUri} that was + * registered in {@code registerAdBeacon}. See documentation of [reportImpression] for more + * details regarding {@code registerAdBeacon}. Then, the service will attach * [ReportEventRequest#getData()] to the request body of a POST request and send the request. * The body of the POST request will have the {@code content-type} of {@code text/plain}, and * the data will be transmitted in {@code charset=UTF-8}. * - * The output is passed by the receiver, which either returns an empty [Object] for a - * successful run, or an [Exception] includes the type of the exception thrown and the - * corresponding error message. + * The output is passed by the receiver, which either returns an empty [Object] for a successful + * run, or an [Exception] includes the type of the exception thrown and the corresponding error + * message. * - * If the [IllegalArgumentException] is thrown, it is caused by invalid input argument - * the API received to report the ad event. + * If the [IllegalArgumentException] is thrown, it is caused by invalid input argument the API + * received to report the ad event. * * If the [IllegalStateException] is thrown with error message "Failure of AdSelection * services.", it is caused by an internal failure of the ad selection service. * - * If the [LimitExceededException] is thrown, it is caused when the calling package - * exceeds the allowed rate limits and is throttled. + * If the [LimitExceededException] is thrown, it is caused when the calling package exceeds the + * allowed rate limits and is throttled. * - * If the [SecurityException] is thrown, it is caused when the caller is not authorized - * or permission is not requested. + * If the [SecurityException] is thrown, it is caused when the caller is not authorized or + * permission is not requested. * * If the [UnsupportedOperationException] is thrown, it is caused when the Android API level and * AdServices module versions don't support this API. @@ -171,16 +171,14 @@ * candidate ads, where ads whose frequency caps are met or exceeded are removed from the * bidding process during ad selection. * - * Counter histograms can only be updated for ads specified by the given {@code - * adSelectionId} returned by a recent call to Protected Audience API ad selection from the same - * caller app. + * Counter histograms can only be updated for ads specified by the given {@code adSelectionId} + * returned by a recent call to Protected Audience API ad selection from the same caller app. * * A [SecurityException] is returned if: - * *- *
the app has not declared the correct permissions in its manifest, or - *the app or entity identified by the {@code callerAdTechIdentifier} are not authorized - * to use the API. + *the app has not declared the correct permissions in its manifest, or + *the app or entity identified by the {@code callerAdTechIdentifier} are not authorized to + * use the API. * * * An [IllegalStateException] is returned if the call does not come from an app with a @@ -208,27 +206,27 @@ * * Custom audience ads must have a {@code ad_render_id} to be eligible for to be collected. * - * See [AdSelectionManager#persistAdSelectionResult] for how to process the results of - * the ad selection run on server-side with the blob generated by this API. + * See [AdSelectionManager#persistAdSelectionResult] for how to process the results of the ad + * selection run on server-side with the blob generated by this API. * - * The output is passed by the receiver, which either returns an [GetAdSelectionDataOutcome] - * for a successful run, or an [Exception] includes the type of - * the exception thrown and the corresponding error message. + * The output is passed by the receiver, which either returns an [GetAdSelectionDataOutcome] for + * a successful run, or an [Exception] includes the type of the exception thrown and the + * corresponding error message. * - * If the [IllegalArgumentException] is thrown, it is caused by invalid input argument - * the API received to run the ad selection. + * If the [IllegalArgumentException] is thrown, it is caused by invalid input argument the API + * received to run the ad selection. * * If the [IllegalStateException] is thrown with error message "Failure of AdSelection * services.", it is caused by an internal failure of the ad selection service. * - * If the [TimeoutException] is thrown, it is caused when a timeout is encountered - * during bidding, scoring, or overall selection process to find winning Ad. + * If the [TimeoutException] is thrown, it is caused when a timeout is encountered during + * bidding, scoring, or overall selection process to find winning Ad. * - * If the [LimitExceededException] is thrown, it is caused when the calling package - * exceeds the allowed rate limits and is throttled. + * If the [LimitExceededException] is thrown, it is caused when the calling package exceeds the + * allowed rate limits and is throttled. * - * If the [SecurityException] is thrown, it is caused when the caller is not authorized - * or permission is not requested. + * If the [SecurityException] is thrown, it is caused when the caller is not authorized or + * permission is not requested. * * If the [UnsupportedOperationException] is thrown, it is caused when the Android API level and * AdServices module versions don't support this API. @@ -244,27 +242,27 @@ /** * Persists the ad selection results from the server-side. * - * See [AdSelectionManager#getAdSelectionData] for how to generate an encrypted blob to - * run an ad selection on the server side. + * See [AdSelectionManager#getAdSelectionData] for how to generate an encrypted blob to run an + * ad selection on the server side. * - * The output is passed by the receiver, which either returns an [AdSelectionOutcome] - * for a successful run, or an [Exception] includes the type of the exception thrown and - * the corresponding error message. + * The output is passed by the receiver, which either returns an [AdSelectionOutcome] for a + * successful run, or an [Exception] includes the type of the exception thrown and the + * corresponding error message. * - * If the [IllegalArgumentException] is thrown, it is caused by invalid input argument - * the API received to run the ad selection. + * If the [IllegalArgumentException] is thrown, it is caused by invalid input argument the API + * received to run the ad selection. * * If the [IllegalStateException] is thrown with error message "Failure of AdSelection * services.", it is caused by an internal failure of the ad selection service. * - * If the [TimeoutException] is thrown, it is caused when a timeout is encountered - * during bidding, scoring, or overall selection process to find winning Ad. + * If the [TimeoutException] is thrown, it is caused when a timeout is encountered during + * bidding, scoring, or overall selection process to find winning Ad. * - * If the [LimitExceededException] is thrown, it is caused when the calling package - * exceeds the allowed rate limits and is throttled. + * If the [LimitExceededException] is thrown, it is caused when the calling package exceeds the + * allowed rate limits and is throttled. * - * If the [SecurityException] is thrown, it is caused when the caller is not authorized - * or permission is not requested. + * If the [SecurityException] is thrown, it is caused when the caller is not authorized or + * permission is not requested. * * If the [UnsupportedOperationException] is thrown, it is caused when the Android API level and * AdServices module versions don't support this API. @@ -279,10 +277,10 @@ companion object { /** - * Creates [AdSelectionManager]. + * Creates [AdSelectionManager]. * - * @return AdSelectionManager object. If the device is running an incompatible - * build, the value returned is null. + * @return AdSelectionManager object. If the device is running an incompatible build, the + * value returned is null. */ @JvmStatic @SuppressLint("NewApi", "ClassVerificationFailure")
diff --git a/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/adselection/AdSelectionManagerApi31Ext9Impl.kt b/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/adselection/AdSelectionManagerApi31Ext9Impl.kt index d968dd2..54070d5 100644 --- a/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/adselection/AdSelectionManagerApi31Ext9Impl.kt +++ b/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/adselection/AdSelectionManagerApi31Ext9Impl.kt
@@ -25,5 +25,5 @@ @RestrictTo(RestrictTo.Scope.LIBRARY) @SuppressLint("NewApi", "ClassVerificationFailure") @RequiresExtension(extension = Build.VERSION_CODES.S, version = 9) -class AdSelectionManagerApi31Ext9Impl(context: Context) : AdSelectionManagerImplCommon( - android.adservices.adselection.AdSelectionManager.get(context)) +class AdSelectionManagerApi31Ext9Impl(context: Context) : + AdSelectionManagerImplCommon(android.adservices.adselection.AdSelectionManager.get(context))
diff --git a/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/adselection/AdSelectionManagerApi33Ext4Impl.kt b/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/adselection/AdSelectionManagerApi33Ext4Impl.kt index b3cdd9c..babf6a3 100644 --- a/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/adselection/AdSelectionManagerApi33Ext4Impl.kt +++ b/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/adselection/AdSelectionManagerApi33Ext4Impl.kt
@@ -25,6 +25,7 @@ @RestrictTo(RestrictTo.Scope.LIBRARY) @SuppressLint("NewApi", "ClassVerificationFailure") @RequiresExtension(extension = SdkExtensions.AD_SERVICES, version = 4) -class AdSelectionManagerApi33Ext4Impl(context: Context) : AdSelectionManagerImplCommon( - context.getSystemService( - android.adservices.adselection.AdSelectionManager::class.java)) +class AdSelectionManagerApi33Ext4Impl(context: Context) : + AdSelectionManagerImplCommon( + context.getSystemService(android.adservices.adselection.AdSelectionManager::class.java) + )
diff --git a/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/adselection/AdSelectionManagerImplCommon.kt b/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/adselection/AdSelectionManagerImplCommon.kt index 704b9564..cd21ad8 100644 --- a/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/adselection/AdSelectionManagerImplCommon.kt +++ b/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/adselection/AdSelectionManagerImplCommon.kt
@@ -36,40 +36,30 @@ @RequiresExtension(extension = Build.VERSION_CODES.S, version = 9) open class AdSelectionManagerImplCommon( protected val mAdSelectionManager: android.adservices.adselection.AdSelectionManager - ) : AdSelectionManager() { +) : AdSelectionManager() { @DoNotInline @RequiresPermission(AdServicesPermissions.ACCESS_ADSERVICES_CUSTOM_AUDIENCE) override suspend fun selectAds(adSelectionConfig: AdSelectionConfig): AdSelectionOutcome { - return AdSelectionOutcome( - selectAdsInternal( - adSelectionConfig.convertToAdServices() - ) - ) + return AdSelectionOutcome(selectAdsInternal(adSelectionConfig.convertToAdServices())) } @RequiresPermission(AdServicesPermissions.ACCESS_ADSERVICES_CUSTOM_AUDIENCE) private suspend fun selectAdsInternal( adSelectionConfig: android.adservices.adselection.AdSelectionConfig - ): android.adservices.adselection.AdSelectionOutcome = suspendCancellableCoroutine { cont - -> - mAdSelectionManager.selectAds( - adSelectionConfig, - Runnable::run, - cont.asOutcomeReceiver() - ) + ): android.adservices.adselection.AdSelectionOutcome = suspendCancellableCoroutine { cont -> + mAdSelectionManager.selectAds(adSelectionConfig, Runnable::run, cont.asOutcomeReceiver()) } @DoNotInline @RequiresPermission(AdServicesPermissions.ACCESS_ADSERVICES_CUSTOM_AUDIENCE) - override suspend fun selectAds(adSelectionFromOutcomesConfig: AdSelectionFromOutcomesConfig): - AdSelectionOutcome { - if (AdServicesInfo.adServicesVersion() >= 10 || - AdServicesInfo.extServicesVersionS() >= 10) { - return Ext10Impl.selectAds( - mAdSelectionManager, - adSelectionFromOutcomesConfig - ) + override suspend fun selectAds( + adSelectionFromOutcomesConfig: AdSelectionFromOutcomesConfig + ): AdSelectionOutcome { + if ( + AdServicesInfo.adServicesVersion() >= 10 || AdServicesInfo.extServicesVersionS() >= 10 + ) { + return Ext10Impl.selectAds(mAdSelectionManager, adSelectionFromOutcomesConfig) } throw UnsupportedOperationException("API is not available. Min version is API 31 ext 10") } @@ -90,13 +80,11 @@ @RequiresPermission(AdServicesPermissions.ACCESS_ADSERVICES_CUSTOM_AUDIENCE) override suspend fun reportEvent(reportEventRequest: ReportEventRequest) { if (AdServicesInfo.adServicesVersion() >= 8 || AdServicesInfo.extServicesVersionS() >= 9) { - return Ext8Impl.reportEvent( - mAdSelectionManager, - reportEventRequest - ) + return Ext8Impl.reportEvent(mAdSelectionManager, reportEventRequest) } - throw UnsupportedOperationException("API is unsupported. Min version is API 33 ext 8 or " + - "API 31/32 ext 9") + throw UnsupportedOperationException( + "API is unsupported. Min version is API 33 ext 8 or " + "API 31/32 ext 9" + ) } @DoNotInline @@ -110,8 +98,9 @@ updateAdCounterHistogramRequest ) } - throw UnsupportedOperationException("API is unsupported. Min version is API 33 ext 8 or " + - "API 31/32 ext 9") + throw UnsupportedOperationException( + "API is unsupported. Min version is API 33 ext 8 or " + "API 31/32 ext 9" + ) } @DoNotInline @@ -119,12 +108,10 @@ override suspend fun getAdSelectionData( getAdSelectionDataRequest: GetAdSelectionDataRequest ): GetAdSelectionDataOutcome { - if (AdServicesInfo.adServicesVersion() >= 10 || - AdServicesInfo.extServicesVersionS() >= 10) { - return Ext10Impl.getAdSelectionData( - mAdSelectionManager, - getAdSelectionDataRequest - ) + if ( + AdServicesInfo.adServicesVersion() >= 10 || AdServicesInfo.extServicesVersionS() >= 10 + ) { + return Ext10Impl.getAdSelectionData(mAdSelectionManager, getAdSelectionDataRequest) } throw UnsupportedOperationException("API is not available. Min version is API 31 ext 10") } @@ -134,8 +121,9 @@ override suspend fun persistAdSelectionResult( persistAdSelectionResultRequest: PersistAdSelectionResultRequest ): AdSelectionOutcome { - if (AdServicesInfo.adServicesVersion() >= 10 || - AdServicesInfo.extServicesVersionS() >= 10) { + if ( + AdServicesInfo.adServicesVersion() >= 10 || AdServicesInfo.extServicesVersionS() >= 10 + ) { return Ext10Impl.persistAdSelectionResult( mAdSelectionManager, persistAdSelectionResultRequest @@ -154,14 +142,17 @@ adSelectionManager: android.adservices.adselection.AdSelectionManager, getAdSelectionDataRequest: GetAdSelectionDataRequest ): GetAdSelectionDataOutcome { - return GetAdSelectionDataOutcome(suspendCancellableCoroutine< - android.adservices.adselection.GetAdSelectionDataOutcome> { continuation -> - adSelectionManager.getAdSelectionData( - getAdSelectionDataRequest.convertToAdServices(), - Runnable::run, - continuation.asOutcomeReceiver() - ) - }) + return GetAdSelectionDataOutcome( + suspendCancellableCoroutine< + android.adservices.adselection.GetAdSelectionDataOutcome + > { continuation -> + adSelectionManager.getAdSelectionData( + getAdSelectionDataRequest.convertToAdServices(), + Runnable::run, + continuation.asOutcomeReceiver() + ) + } + ) } @DoNotInline @@ -170,13 +161,15 @@ adSelectionManager: android.adservices.adselection.AdSelectionManager, persistAdSelectionResultRequest: PersistAdSelectionResultRequest ): AdSelectionOutcome { - return AdSelectionOutcome(suspendCancellableCoroutine { continuation -> - adSelectionManager.persistAdSelectionResult( - persistAdSelectionResultRequest.convertToAdServices(), - Runnable::run, - continuation.asOutcomeReceiver() - ) - }) + return AdSelectionOutcome( + suspendCancellableCoroutine { continuation -> + adSelectionManager.persistAdSelectionResult( + persistAdSelectionResultRequest.convertToAdServices(), + Runnable::run, + continuation.asOutcomeReceiver() + ) + } + ) } @DoNotInline @@ -185,13 +178,15 @@ adSelectionManager: android.adservices.adselection.AdSelectionManager, adSelectionFromOutcomesConfig: AdSelectionFromOutcomesConfig ): AdSelectionOutcome { - return AdSelectionOutcome(suspendCancellableCoroutine { continuation -> - adSelectionManager.selectAds( - adSelectionFromOutcomesConfig.convertToAdServices(), - Runnable::run, - continuation.asOutcomeReceiver() - ) - }) + return AdSelectionOutcome( + suspendCancellableCoroutine { continuation -> + adSelectionManager.selectAds( + adSelectionFromOutcomesConfig.convertToAdServices(), + Runnable::run, + continuation.asOutcomeReceiver() + ) + } + ) } } }
diff --git a/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/adselection/AdSelectionOutcome.kt b/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/adselection/AdSelectionOutcome.kt index f166e7b..4b437cb 100644 --- a/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/adselection/AdSelectionOutcome.kt +++ b/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/adselection/AdSelectionOutcome.kt
@@ -30,31 +30,27 @@ * [AdSelectionManager#selectAds] call. * * @param adSelectionId An ID unique only to a device user that identifies a successful ad - * selection. + * selection. * @param renderUri A render URL for the winning ad. */ @SuppressLint("ClassVerificationFailure") -class AdSelectionOutcome public constructor( - val adSelectionId: Long, - val renderUri: Uri -) { +class AdSelectionOutcome public constructor(val adSelectionId: Long, val renderUri: Uri) { - /** Checks whether two [AdSelectionOutcome] objects contain the same information. */ + /** Checks whether two [AdSelectionOutcome] objects contain the same information. */ override fun equals(other: Any?): Boolean { if (this === other) return true if (other !is AdSelectionOutcome) return false - return this.adSelectionId == other.adSelectionId && - this.renderUri == other.renderUri + return this.adSelectionId == other.adSelectionId && this.renderUri == other.renderUri } - /** Returns the hash of the [AdSelectionOutcome] object's data. */ + /** Returns the hash of the [AdSelectionOutcome] object's data. */ override fun hashCode(): Int { var hash = adSelectionId.hashCode() hash = 31 * hash + renderUri.hashCode() return hash } - /** Overrides the toString method. */ + /** Overrides the toString method. */ override fun toString(): String { return "AdSelectionOutcome: adSelectionId=$adSelectionId, renderUri=$renderUri" } @@ -68,7 +64,8 @@ companion object { /** Represents an AdSelectionOutcome with empty results. */ @ExperimentalFeatures.Ext10OptIn - @JvmField public val NO_OUTCOME = AdSelectionOutcome(0, Uri.EMPTY) + @JvmField + public val NO_OUTCOME = AdSelectionOutcome(0, Uri.EMPTY) } @RestrictTo(RestrictTo.Scope.LIBRARY)
diff --git a/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/adselection/GetAdSelectionDataOutcome.kt b/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/adselection/GetAdSelectionDataOutcome.kt index 9d96dab..7430a6f 100644 --- a/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/adselection/GetAdSelectionDataOutcome.kt +++ b/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/adselection/GetAdSelectionDataOutcome.kt
@@ -28,16 +28,14 @@ * [AdSelectionManager#getAdSelectionData] call. * * @param adSelectionId An ID unique only to a device user that identifies a successful ad - * selection. + * selection. * @param adSelectionData The adSelectionData that is collected from device. */ @ExperimentalFeatures.Ext10OptIn -class GetAdSelectionDataOutcome public constructor( - val adSelectionId: Long, - val adSelectionData: ByteArray? = null -) { +class GetAdSelectionDataOutcome +public constructor(val adSelectionId: Long, val adSelectionData: ByteArray? = null) { - /** Checks whether two [GetAdSelectionDataOutcome] objects contain the same information. */ + /** Checks whether two [GetAdSelectionDataOutcome] objects contain the same information. */ override fun equals(other: Any?): Boolean { if (this === other) return true if (other !is GetAdSelectionDataOutcome) return false @@ -45,14 +43,14 @@ this.adSelectionData.contentEquals(other.adSelectionData) } - /** Returns the hash of the [GetAdSelectionDataOutcome] object's data. */ + /** Returns the hash of the [GetAdSelectionDataOutcome] object's data. */ override fun hashCode(): Int { var hash = adSelectionId.hashCode() hash = 31 * hash + adSelectionData.hashCode() return hash } - /** Overrides the toString method. */ + /** Overrides the toString method. */ override fun toString(): String { return "GetAdSelectionDataOutcome: adSelectionId=$adSelectionId, " + "adSelectionData=$adSelectionData"
diff --git a/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/adselection/GetAdSelectionDataRequest.kt b/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/adselection/GetAdSelectionDataRequest.kt index 2bfba69..09e747c 100644 --- a/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/adselection/GetAdSelectionDataRequest.kt +++ b/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/adselection/GetAdSelectionDataRequest.kt
@@ -29,22 +29,23 @@ * @param seller AdTechIdentifier of the seller, for example "www.example-ssp.com". */ @ExperimentalFeatures.Ext10OptIn -class GetAdSelectionDataRequest public constructor( +class GetAdSelectionDataRequest +public constructor( val seller: AdTechIdentifier? = null, ) { - /** Checks whether two [GetAdSelectionDataRequest] objects contain the same information. */ + /** Checks whether two [GetAdSelectionDataRequest] objects contain the same information. */ override fun equals(other: Any?): Boolean { if (this === other) return true if (other !is GetAdSelectionDataRequest) return false return this.seller == other.seller } - /** Returns the hash of the [GetAdSelectionDataRequest] object's data. */ + /** Returns the hash of the [GetAdSelectionDataRequest] object's data. */ override fun hashCode(): Int { return seller.hashCode() } - /** Overrides the toString method. */ + /** Overrides the toString method. */ override fun toString(): String { return "GetAdSelectionDataRequest: seller=$seller" }
diff --git a/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/adselection/PersistAdSelectionResultRequest.kt b/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/adselection/PersistAdSelectionResultRequest.kt index b868550..35f30d0 100644 --- a/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/adselection/PersistAdSelectionResultRequest.kt +++ b/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/adselection/PersistAdSelectionResultRequest.kt
@@ -27,12 +27,13 @@ * Represent input parameters to the [AdSelectionManager#persistAdSelectionResult] API. * * @param adSelectionId An ID unique only to a device user that identifies a successful ad - * selection. + * selection. * @param seller AdTechIdentifier of the seller, for example "www.example-ssp.com". * @param adSelectionResult The adSelectionResult that is collected from device. */ @ExperimentalFeatures.Ext10OptIn -class PersistAdSelectionResultRequest public constructor( +class PersistAdSelectionResultRequest +public constructor( val adSelectionId: Long, val seller: AdTechIdentifier? = null, val adSelectionResult: ByteArray? = null,
diff --git a/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/adselection/ReportEventRequest.kt b/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/adselection/ReportEventRequest.kt index fbad84b..bb207b2 100644 --- a/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/adselection/ReportEventRequest.kt +++ b/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/adselection/ReportEventRequest.kt
@@ -31,16 +31,17 @@ * Represent input parameters to the reportImpression API. * * @param adSelectionId An ID unique only to a device user that identifies a successful ad - * selection. + * selection. * @param eventKey An event key, the type of ad event to be reported. * @param eventData The ad event data * @param reportingDestinations The bitfield of reporting destinations to report to (buyer, seller, - * or both). + * or both). * @param inputEvent The input event associated with the user interaction. */ @OptIn(ExperimentalFeatures.Ext10OptIn::class) @ExperimentalFeatures.Ext8OptIn -class ReportEventRequest public constructor( +class ReportEventRequest +public constructor( val adSelectionId: Long, val eventKey: String, val eventData: String, @@ -48,14 +49,16 @@ @property:ExperimentalFeatures.Ext10OptIn val inputEvent: InputEvent? = null ) { init { - require(0 < reportingDestinations && - reportingDestinations - <= (FLAG_REPORTING_DESTINATION_SELLER or FLAG_REPORTING_DESTINATION_BUYER)) { + require( + 0 < reportingDestinations && + reportingDestinations <= + (FLAG_REPORTING_DESTINATION_SELLER or FLAG_REPORTING_DESTINATION_BUYER) + ) { "Invalid reporting destinations bitfield." } } - /** Checks whether two [ReportImpressionRequest] objects contain the same information. */ + /** Checks whether two [ReportImpressionRequest] objects contain the same information. */ override fun equals(other: Any?): Boolean { if (this === other) return true if (other !is ReportEventRequest) return false @@ -66,7 +69,7 @@ this.inputEvent == other.inputEvent } - /** Returns the hash of the [ReportImpressionRequest] object's data. */ + /** Returns the hash of the [ReportImpressionRequest] object's data. */ override fun hashCode(): Int { var hash = adSelectionId.hashCode() hash = 31 * hash + eventKey.hashCode() @@ -76,7 +79,7 @@ return hash } - /** Overrides the toString method. */ + /** Overrides the toString method. */ override fun toString(): String { return "ReportEventRequest: adSelectionId=$adSelectionId, eventKey=$eventKey, " + "eventData=$eventData, reportingDestinations=$reportingDestinations" + @@ -87,9 +90,12 @@ @Retention(AnnotationRetention.SOURCE) @IntDef( flag = true, - value = [ - Companion.FLAG_REPORTING_DESTINATION_SELLER, - Companion.FLAG_REPORTING_DESTINATION_BUYER]) + value = + [ + Companion.FLAG_REPORTING_DESTINATION_SELLER, + Companion.FLAG_REPORTING_DESTINATION_BUYER + ] + ) annotation class ReportingDestination companion object { @@ -104,8 +110,9 @@ @RequiresExtension(extension = SdkExtensions.AD_SERVICES, version = 8) @RequiresExtension(extension = Build.VERSION_CODES.S, version = 9) internal fun convertToAdServices(): android.adservices.adselection.ReportEventRequest { - if (AdServicesInfo.adServicesVersion() >= 10 || - AdServicesInfo.extServicesVersionS() >= 10) { + if ( + AdServicesInfo.adServicesVersion() >= 10 || AdServicesInfo.extServicesVersionS() >= 10 + ) { return Ext10Impl.convertReportEventRequest(this) } return Ext8Impl.convertReportEventRequest(this) @@ -119,10 +126,11 @@ request: ReportEventRequest ): android.adservices.adselection.ReportEventRequest { return android.adservices.adselection.ReportEventRequest.Builder( - request.adSelectionId, - request.eventKey, - request.eventData, - request.reportingDestinations) + request.adSelectionId, + request.eventKey, + request.eventData, + request.reportingDestinations + ) .setInputEvent(request.inputEvent) .build() } @@ -136,13 +144,18 @@ fun convertReportEventRequest( request: ReportEventRequest ): android.adservices.adselection.ReportEventRequest { - request.inputEvent?.let { Log.w("ReportEventRequest", - "inputEvent is ignored. Min version to use inputEvent is API 31 ext 10") } + request.inputEvent?.let { + Log.w( + "ReportEventRequest", + "inputEvent is ignored. Min version to use inputEvent is API 31 ext 10" + ) + } return android.adservices.adselection.ReportEventRequest.Builder( - request.adSelectionId, - request.eventKey, - request.eventData, - request.reportingDestinations) + request.adSelectionId, + request.eventKey, + request.eventData, + request.reportingDestinations + ) .build() } }
diff --git a/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/adselection/ReportImpressionRequest.kt b/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/adselection/ReportImpressionRequest.kt index 0efa6c3..ddae9b6 100644 --- a/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/adselection/ReportImpressionRequest.kt +++ b/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/adselection/ReportImpressionRequest.kt
@@ -28,23 +28,21 @@ * Represent input parameters to the reportImpression API. * * @param adSelectionId An ID unique only to a device user that identifies a successful ad - * selection. + * selection. * @param adSelectionConfig optional config used in the selectAds() call identified by the provided - * ad selection ID. If the {@code adSelectionId} is for a on-device auction run using - * [AdSelectionManager#selectAds], then the config must be included. If the - * {@code adSelectionId} is for a server auction run where device info collected by - * [AdSelectionManager#getAdSelectionData} then the impression reporting request should - * only include the ad selection id. + * ad selection ID. If the {@code adSelectionId} is for a on-device auction run using + * [AdSelectionManager#selectAds], then the config must be included. If the {@code adSelectionId} + * is for a server auction run where device info collected + * by [AdSelectionManager#getAdSelectionData} then the impression reporting request should only + * include the ad selection id. */ @SuppressLint("ClassVerificationFailure") -class ReportImpressionRequest public constructor( - val adSelectionId: Long, - val adSelectionConfig: AdSelectionConfig -) { +class ReportImpressionRequest +public constructor(val adSelectionId: Long, val adSelectionConfig: AdSelectionConfig) { @ExperimentalFeatures.Ext8OptIn constructor(adSelectionId: Long) : this(adSelectionId, AdSelectionConfig.EMPTY) - /** Checks whether two [ReportImpressionRequest] objects contain the same information. */ + /** Checks whether two [ReportImpressionRequest] objects contain the same information. */ override fun equals(other: Any?): Boolean { if (this === other) return true if (other !is ReportImpressionRequest) return false @@ -52,14 +50,14 @@ this.adSelectionConfig == other.adSelectionConfig } - /** Returns the hash of the [ReportImpressionRequest] object's data. */ + /** Returns the hash of the [ReportImpressionRequest] object's data. */ override fun hashCode(): Int { var hash = adSelectionId.hashCode() hash = 31 * hash + adSelectionConfig.hashCode() return hash } - /** Overrides the toString method. */ + /** Overrides the toString method. */ override fun toString(): String { return "ReportImpressionRequest: adSelectionId=$adSelectionId, " + "adSelectionConfig=$adSelectionConfig" @@ -68,8 +66,9 @@ @SuppressLint("NewApi") @RestrictTo(RestrictTo.Scope.LIBRARY) internal fun convertToAdServices(): android.adservices.adselection.ReportImpressionRequest { - if (AdServicesInfo.adServicesVersion() >= 10 || - AdServicesInfo.extServicesVersionS() >= 10) { + if ( + AdServicesInfo.adServicesVersion() >= 10 || AdServicesInfo.extServicesVersionS() >= 10 + ) { return Ext10Impl.convertReportImpressionRequest(this) } return Ext4Impl.convertReportImpressionRequest(this) @@ -83,13 +82,12 @@ request: ReportImpressionRequest ): android.adservices.adselection.ReportImpressionRequest { return if (request.adSelectionConfig == AdSelectionConfig.EMPTY) + android.adservices.adselection.ReportImpressionRequest(request.adSelectionId) + else android.adservices.adselection.ReportImpressionRequest( - request.adSelectionId + request.adSelectionId, + request.adSelectionConfig.convertToAdServices() ) - else android.adservices.adselection.ReportImpressionRequest( - request.adSelectionId, - request.adSelectionConfig.convertToAdServices() - ) } } } @@ -102,8 +100,9 @@ request: ReportImpressionRequest ): android.adservices.adselection.ReportImpressionRequest { if (request.adSelectionConfig == AdSelectionConfig.EMPTY) { - throw UnsupportedOperationException("adSelectionConfig is mandatory for" + - "API versions lower than ext 10") + throw UnsupportedOperationException( + "adSelectionConfig is mandatory for" + "API versions lower than ext 10" + ) } return android.adservices.adselection.ReportImpressionRequest( request.adSelectionId,
diff --git a/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/adselection/UpdateAdCounterHistogramRequest.kt b/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/adselection/UpdateAdCounterHistogramRequest.kt index 38d8db8..1dd2173 100644 --- a/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/adselection/UpdateAdCounterHistogramRequest.kt +++ b/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/adselection/UpdateAdCounterHistogramRequest.kt
@@ -31,12 +31,13 @@ * the [AdSelectionManager#updateAdCounterHistogram] API. * * @param adSelectionId An ID unique only to a device user that identifies a successful ad - * selection. + * selection. * @param adEventType A render URL for the winning ad. * @param callerAdTech The caller adtech entity's [AdTechIdentifier]. */ @ExperimentalFeatures.Ext8OptIn -class UpdateAdCounterHistogramRequest public constructor( +class UpdateAdCounterHistogramRequest +public constructor( val adSelectionId: Long, @FrequencyCapFilters.AdEventType val adEventType: Int, val callerAdTech: AdTechIdentifier @@ -45,9 +46,11 @@ require(adEventType != FrequencyCapFilters.AD_EVENT_TYPE_WIN) { "Win event types cannot be manually updated." } - require(adEventType == FrequencyCapFilters.AD_EVENT_TYPE_IMPRESSION || - adEventType == FrequencyCapFilters.AD_EVENT_TYPE_VIEW || - adEventType == FrequencyCapFilters.AD_EVENT_TYPE_CLICK) { + require( + adEventType == FrequencyCapFilters.AD_EVENT_TYPE_IMPRESSION || + adEventType == FrequencyCapFilters.AD_EVENT_TYPE_VIEW || + adEventType == FrequencyCapFilters.AD_EVENT_TYPE_CLICK + ) { "Ad event type must be one of AD_EVENT_TYPE_IMPRESSION, AD_EVENT_TYPE_VIEW, or" + " AD_EVENT_TYPE_CLICK" } @@ -74,13 +77,14 @@ /** Overrides the toString method. */ override fun toString(): String { - val adEventTypeStr = when (adEventType) { - FrequencyCapFilters.AD_EVENT_TYPE_IMPRESSION -> "AD_EVENT_TYPE_IMPRESSION" - FrequencyCapFilters.AD_EVENT_TYPE_VIEW -> "AD_EVENT_TYPE_VIEW" - FrequencyCapFilters.AD_EVENT_TYPE_WIN -> "AD_EVENT_TYPE_WIN" - FrequencyCapFilters.AD_EVENT_TYPE_CLICK -> "AD_EVENT_TYPE_CLICK" - else -> "Invalid ad event type" - } + val adEventTypeStr = + when (adEventType) { + FrequencyCapFilters.AD_EVENT_TYPE_IMPRESSION -> "AD_EVENT_TYPE_IMPRESSION" + FrequencyCapFilters.AD_EVENT_TYPE_VIEW -> "AD_EVENT_TYPE_VIEW" + FrequencyCapFilters.AD_EVENT_TYPE_WIN -> "AD_EVENT_TYPE_WIN" + FrequencyCapFilters.AD_EVENT_TYPE_CLICK -> "AD_EVENT_TYPE_CLICK" + else -> "Invalid ad event type" + } return "UpdateAdCounterHistogramRequest: adSelectionId=$adSelectionId, " + "adEventType=$adEventTypeStr, callerAdTech=$callerAdTech" } @@ -91,9 +95,10 @@ internal fun convertToAdServices(): android.adservices.adselection.UpdateAdCounterHistogramRequest { return android.adservices.adselection.UpdateAdCounterHistogramRequest.Builder( - adSelectionId, - adEventType, - callerAdTech.convertToAdServices()) + adSelectionId, + adEventType, + callerAdTech.convertToAdServices() + ) .build() } }
diff --git a/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/appsetid/AppSetId.kt b/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/appsetid/AppSetId.kt index 508da63..011b961 100644 --- a/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/appsetid/AppSetId.kt +++ b/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/appsetid/AppSetId.kt
@@ -17,22 +17,19 @@ package androidx.privacysandbox.ads.adservices.appsetid /** - * A unique, per-device, per developer-account user-resettable ID for non-monetizing advertising - * use cases. + * A unique, per-device, per developer-account user-resettable ID for non-monetizing advertising use + * cases. * - * Represents the appSetID and scope of this appSetId from the - * [AppSetIdManager#getAppSetId()] API. The scope of the ID can be per app or per developer account - * associated with the user. AppSetId is used for analytics, spam detection, frequency capping and - * fraud prevention use cases, on a given device, that one may need to correlate usage or actions - * across a set of apps owned by an organization. + * Represents the appSetID and scope of this appSetId from the [AppSetIdManager#getAppSetId()] API. + * The scope of the ID can be per app or per developer account associated with the user. AppSetId is + * used for analytics, spam detection, frequency capping and fraud prevention use cases, on a given + * device, that one may need to correlate usage or actions across a set of apps owned by an + * organization. * * @param id The appSetID. * @param scope The scope of the ID. Can be AppSetId.SCOPE_APP or AppSetId.SCOPE_DEVELOPER. */ -class AppSetId public constructor( - val id: String, - val scope: Int -) { +class AppSetId public constructor(val id: String, val scope: Int) { init { require(scope == SCOPE_APP || scope == SCOPE_DEVELOPER) { "Scope undefined." } } @@ -40,8 +37,7 @@ override fun equals(other: Any?): Boolean { if (this === other) return true if (other !is AppSetId) return false - return this.id == other.id && - this.scope == other.scope + return this.id == other.id && this.scope == other.scope } override fun hashCode(): Int {
diff --git a/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/appsetid/AppSetIdManager.kt b/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/appsetid/AppSetIdManager.kt index 334d772..0b0e371 100644 --- a/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/appsetid/AppSetIdManager.kt +++ b/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/appsetid/AppSetIdManager.kt
@@ -38,10 +38,10 @@ companion object { /** - * Creates [AppSetIdManager]. + * Creates [AppSetIdManager]. * - * @return AppSetIdManager object. If the device is running an incompatible - * build, the value returned is null. + * @return AppSetIdManager object. If the device is running an incompatible build, the value + * returned is null. */ @JvmStatic @SuppressLint("NewApi", "ClassVerificationFailure")
diff --git a/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/appsetid/AppSetIdManagerApi31Ext9Impl.kt b/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/appsetid/AppSetIdManagerApi31Ext9Impl.kt index 390e785..eeddd6d 100644 --- a/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/appsetid/AppSetIdManagerApi31Ext9Impl.kt +++ b/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/appsetid/AppSetIdManagerApi31Ext9Impl.kt
@@ -25,5 +25,5 @@ @RestrictTo(RestrictTo.Scope.LIBRARY) @SuppressLint("NewApi", "ClassVerificationFailure") @RequiresExtension(extension = Build.VERSION_CODES.S, version = 9) -class AppSetIdManagerApi31Ext9Impl(context: Context) : AppSetIdManagerImplCommon( - android.adservices.appsetid.AppSetIdManager.get(context)) +class AppSetIdManagerApi31Ext9Impl(context: Context) : + AppSetIdManagerImplCommon(android.adservices.appsetid.AppSetIdManager.get(context))
diff --git a/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/appsetid/AppSetIdManagerApi33Ext4Impl.kt b/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/appsetid/AppSetIdManagerApi33Ext4Impl.kt index 84af87a..54983ca 100644 --- a/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/appsetid/AppSetIdManagerApi33Ext4Impl.kt +++ b/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/appsetid/AppSetIdManagerApi33Ext4Impl.kt
@@ -25,6 +25,7 @@ @RestrictTo(RestrictTo.Scope.LIBRARY) @SuppressLint("NewApi", "ClassVerificationFailure") @RequiresExtension(extension = SdkExtensions.AD_SERVICES, version = 4) -class AppSetIdManagerApi33Ext4Impl(context: Context) : AppSetIdManagerImplCommon( - context.getSystemService( - android.adservices.appsetid.AppSetIdManager::class.java)) +class AppSetIdManagerApi33Ext4Impl(context: Context) : + AppSetIdManagerImplCommon( + context.getSystemService(android.adservices.appsetid.AppSetIdManager::class.java) + )
diff --git a/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/appsetid/AppSetIdManagerImplCommon.kt b/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/appsetid/AppSetIdManagerImplCommon.kt index 720370d..0a422cc 100644 --- a/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/appsetid/AppSetIdManagerImplCommon.kt +++ b/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/appsetid/AppSetIdManagerImplCommon.kt
@@ -39,12 +39,8 @@ } private suspend fun getAppSetIdAsyncInternal(): android.adservices.appsetid.AppSetId = - suspendCancellableCoroutine { - continuation -> - mAppSetIdManager.getAppSetId( - Runnable::run, - continuation.asOutcomeReceiver() - ) + suspendCancellableCoroutine { continuation -> + mAppSetIdManager.getAppSetId(Runnable::run, continuation.asOutcomeReceiver()) } private fun convertResponse(response: android.adservices.appsetid.AppSetId): AppSetId {
diff --git a/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/common/AdData.kt b/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/common/AdData.kt index 10cf1ee..670608e 100644 --- a/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/common/AdData.kt +++ b/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/common/AdData.kt
@@ -102,11 +102,13 @@ @SuppressLint("NewApi") @RestrictTo(RestrictTo.Scope.LIBRARY) internal fun convertToAdServices(): android.adservices.common.AdData { - if (AdServicesInfo.adServicesVersion() >= 10 || - AdServicesInfo.extServicesVersionS() >= 10) { + if ( + AdServicesInfo.adServicesVersion() >= 10 || AdServicesInfo.extServicesVersionS() >= 10 + ) { return Ext10Impl.convertAdData(this) - } else if (AdServicesInfo.adServicesVersion() >= 8 || - AdServicesInfo.extServicesVersionS() >= 9) { + } else if ( + AdServicesInfo.adServicesVersion() >= 8 || AdServicesInfo.extServicesVersionS() >= 9 + ) { return Ext8Impl.convertAdData(this) } return Ext4Impl.convertAdData(this) @@ -133,9 +135,12 @@ private class Ext8Impl private constructor() { companion object { fun convertAdData(adData: AdData): android.adservices.common.AdData { - adData.adRenderId?.let { Log.w("AdData", - "adRenderId is ignored. Min version to use adRenderId is " + - "API 31 ext 10") } + adData.adRenderId?.let { + Log.w( + "AdData", + "adRenderId is ignored. Min version to use adRenderId is " + "API 31 ext 10" + ) + } return android.adservices.common.AdData.Builder() .setMetadata(adData.metadata) .setRenderUri(adData.renderUri) @@ -151,15 +156,26 @@ private class Ext4Impl private constructor() { companion object { fun convertAdData(adData: AdData): android.adservices.common.AdData { - if (adData.adCounterKeys.isNotEmpty()) { Log.w("AdData", - "adCounterKeys is ignored. Min version to use adCounterKeys is " + - "API 33 ext 8 or API 31/32 ext 9") } - adData.adFilters?.let { Log.w("AdData", - "adFilters is ignored. Min version to use adFilters is " + - "API 33 ext 8 or API 31/32 ext 9") } - adData.adRenderId?.let { Log.w("AdData", - "adRenderId is ignored. Min version to use adRenderId is " + - "API 31 ext 10") } + if (adData.adCounterKeys.isNotEmpty()) { + Log.w( + "AdData", + "adCounterKeys is ignored. Min version to use adCounterKeys is " + + "API 33 ext 8 or API 31/32 ext 9" + ) + } + adData.adFilters?.let { + Log.w( + "AdData", + "adFilters is ignored. Min version to use adFilters is " + + "API 33 ext 8 or API 31/32 ext 9" + ) + } + adData.adRenderId?.let { + Log.w( + "AdData", + "adRenderId is ignored. Min version to use adRenderId is " + "API 31 ext 10" + ) + } return android.adservices.common.AdData.Builder() .setMetadata(adData.metadata) .setRenderUri(adData.renderUri)
diff --git a/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/common/AdFilters.kt b/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/common/AdFilters.kt index 948fe40..d749851 100644 --- a/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/common/AdFilters.kt +++ b/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/common/AdFilters.kt
@@ -24,17 +24,15 @@ /** * A container class for filters which are associated with an ad. * - * If any of the filters in an [AdFilters] instance are not satisfied, the associated ad - * will not be eligible for ad selection. Filters are optional ad parameters and are not required as - * part of [AdData]. + * If any of the filters in an [AdFilters] instance are not satisfied, the associated ad will not be + * eligible for ad selection. Filters are optional ad parameters and are not required as part of + * [AdData]. * * @param frequencyCapFilters Gets the [FrequencyCapFilters] instance that represents all frequency - * cap filters for the ad. + * cap filters for the ad. */ @ExperimentalFeatures.Ext8OptIn -class AdFilters public constructor( - val frequencyCapFilters: FrequencyCapFilters? -) { +class AdFilters public constructor(val frequencyCapFilters: FrequencyCapFilters?) { /** Checks whether two [AdFilters] objects contain the same information. */ override fun equals(other: Any?): Boolean { if (this === other) return true
diff --git a/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/common/AdSelectionSignals.kt b/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/common/AdSelectionSignals.kt index 6cb0b4a..5d67943 100644 --- a/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/common/AdSelectionSignals.kt +++ b/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/common/AdSelectionSignals.kt
@@ -28,20 +28,20 @@ * href="https://developer.android.com/design-for-safety/privacy-sandbox/fledge">FLEDGE platform * code, but are merely validated and then passed to the appropriate JavaScript ad selection * function. + * * @param signals Any valid JSON string to create the AdSelectionSignals with. */ @SuppressLint("ClassVerificationFailure") class AdSelectionSignals public constructor(val signals: String) { /** * Compares this AdSelectionSignals to the specified object. The result is true if and only if - * the argument is not null and the signals property of the two objects are equal. - * Note that this method will not perform any JSON normalization so two AdSelectionSignals - * objects with the same JSON could be not equal if the String representations of the objects - * was not equal. + * the argument is not null and the signals property of the two objects are equal. Note that + * this method will not perform any JSON normalization so two AdSelectionSignals objects with + * the same JSON could be not equal if the String representations of the objects was not equal. * * @param other The object to compare this AdSelectionSignals against * @return true if the given object represents an AdSelectionSignals equivalent to this - * AdSelectionSignals, false otherwise + * AdSelectionSignals, false otherwise */ override fun equals(other: Any?): Boolean { if (this === other) return true @@ -51,8 +51,8 @@ /** * Returns a hash code corresponding to the string representation of this class obtained by - * calling [.toString]. Note that this method will not perform any JSON normalization so - * two AdSelectionSignals objects with the same JSON could have different hash codes if the + * calling [.toString]. Note that this method will not perform any JSON normalization so two + * AdSelectionSignals objects with the same JSON could have different hash codes if the * underlying string representation was different. * * @return a hash code value for this object. @@ -61,8 +61,7 @@ return signals.hashCode() } - /** @return The String form of the JSON wrapped by this class. - */ + /** @return The String form of the JSON wrapped by this class. */ override fun toString(): String { return "AdSelectionSignals: $signals" }
diff --git a/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/common/AdTechIdentifier.kt b/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/common/AdTechIdentifier.kt index 084d9f6..0273b1a 100644 --- a/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/common/AdTechIdentifier.kt +++ b/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/common/AdTechIdentifier.kt
@@ -31,15 +31,14 @@ class AdTechIdentifier public constructor(val identifier: String) { /** - * Compares this AdTechIdentifier to the specified object. The result is true if and only if - * the argument is not null and the identifier property of the two objects are equal. - * Note that this method will not perform any eTLD+1 normalization so two AdTechIdentifier - * objects with the same eTLD+1 could be not equal if the String representations of the objects - * was not equal. + * Compares this AdTechIdentifier to the specified object. The result is true if and only if the + * argument is not null and the identifier property of the two objects are equal. Note that this + * method will not perform any eTLD+1 normalization so two AdTechIdentifier objects with the + * same eTLD+1 could be not equal if the String representations of the objects was not equal. * * @param other The object to compare this AdTechIdentifier against * @return true if the given object represents an AdTechIdentifier equivalent to this - * AdTechIdentifier, false otherwise + * AdTechIdentifier, false otherwise */ override fun equals(other: Any?): Boolean { if (this === other) return true @@ -49,8 +48,8 @@ /** * Returns a hash code corresponding to the string representation of this class obtained by - * calling [.toString]. Note that this method will not perform any eTLD+1 normalization - * so two AdTechIdentifier objects with the same eTLD+1 could have different hash codes if the + * calling [.toString]. Note that this method will not perform any eTLD+1 normalization so two + * AdTechIdentifier objects with the same eTLD+1 could have different hash codes if the * underlying string representation was different. * * @return a hash code value for this object. @@ -59,8 +58,7 @@ return identifier.hashCode() } - /** @return The identifier in String form. - */ + /** @return The identifier in String form. */ override fun toString(): String { return "$identifier" }
diff --git a/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/common/ExperimentalFeatures.kt b/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/common/ExperimentalFeatures.kt index cdec101..e7dc376 100644 --- a/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/common/ExperimentalFeatures.kt +++ b/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/common/ExperimentalFeatures.kt
@@ -16,13 +16,9 @@ package androidx.privacysandbox.ads.adservices.common -/** - * Contains AdServices experimental feature opt-in annotations. - */ +/** Contains AdServices experimental feature opt-in annotations. */ sealed interface ExperimentalFeatures { - /** - * Clients should use it when they want to use [MeasurementManager#registerSource] API. - */ + /** Clients should use it when they want to use [MeasurementManager#registerSource] API. */ @RequiresOptIn("This API is experimental.", RequiresOptIn.Level.WARNING) annotation class RegisterSourceOptIn
diff --git a/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/common/FrequencyCapFilters.kt b/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/common/FrequencyCapFilters.kt index 9f1df84..913de40 100644 --- a/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/common/FrequencyCapFilters.kt +++ b/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/common/FrequencyCapFilters.kt
@@ -25,21 +25,23 @@ /** * A container for the ad filters that are based on frequency caps. * - * Frequency caps filters combine an event type with a list of [KeyedFrequencyCap] objects - * to define a collection of ad filters. If any of these frequency caps are exceeded for a given ad, - * the ad will be removed from the group of ads submitted to a buyer adtech's bidding function. + * Frequency caps filters combine an event type with a list of [KeyedFrequencyCap] objects to define + * a collection of ad filters. If any of these frequency caps are exceeded for a given ad, the ad + * will be removed from the group of ads submitted to a buyer adtech's bidding function. * * @param keyedFrequencyCapsForWinEvents The list of frequency caps applied to events which - * correlate to a win as interpreted by an adtech. + * correlate to a win as interpreted by an adtech. * @param keyedFrequencyCapsForImpressionEvents The list of frequency caps applied to events which - * correlate to an impression as interpreted by an adtech. + * correlate to an impression as interpreted by an adtech. * @param keyedFrequencyCapsForViewEvents The list of frequency caps applied to events which - * correlate to a view as interpreted by an adtech. + * correlate to a view as interpreted by an adtech. * @param keyedFrequencyCapsForClickEvents The list of frequency caps applied to events which - * correlate to a click as interpreted by an adtech. + * correlate to a click as interpreted by an adtech. */ @ExperimentalFeatures.Ext8OptIn -class FrequencyCapFilters @JvmOverloads public constructor( +class FrequencyCapFilters +@JvmOverloads +public constructor( val keyedFrequencyCapsForWinEvents: List= listOf(), val keyedFrequencyCapsForImpressionEvents: List= listOf(), val keyedFrequencyCapsForViewEvents: List= listOf(), @@ -80,7 +82,8 @@ Companion.AD_EVENT_TYPE_WIN, Companion.AD_EVENT_TYPE_VIEW, Companion.AD_EVENT_TYPE_CLICK, - Companion.AD_EVENT_TYPE_IMPRESSION) + Companion.AD_EVENT_TYPE_IMPRESSION + ) annotation class AdEventType companion object { @@ -102,9 +105,7 @@ public const val AD_EVENT_TYPE_IMPRESSION: Int = android.adservices.common.FrequencyCapFilters.AD_EVENT_TYPE_IMPRESSION - /** - * Represents the View event type which correlate to a view as interpreted by an adtech. - */ + /** Represents the View event type which correlate to a view as interpreted by an adtech. */ public const val AD_EVENT_TYPE_VIEW: Int = android.adservices.common.FrequencyCapFilters.AD_EVENT_TYPE_VIEW @@ -120,21 +121,23 @@ @RequiresExtension(extension = Build.VERSION_CODES.S, version = 9) internal fun convertToAdServices(): android.adservices.common.FrequencyCapFilters { return android.adservices.common.FrequencyCapFilters.Builder() - .setKeyedFrequencyCapsForWinEvents( - keyedFrequencyCapsForWinEvents.convertToAdServices()) + .setKeyedFrequencyCapsForWinEvents(keyedFrequencyCapsForWinEvents.convertToAdServices()) .setKeyedFrequencyCapsForImpressionEvents( - keyedFrequencyCapsForImpressionEvents.convertToAdServices()) + keyedFrequencyCapsForImpressionEvents.convertToAdServices() + ) .setKeyedFrequencyCapsForViewEvents( - keyedFrequencyCapsForViewEvents.convertToAdServices()) + keyedFrequencyCapsForViewEvents.convertToAdServices() + ) .setKeyedFrequencyCapsForClickEvents( - keyedFrequencyCapsForClickEvents.convertToAdServices()) + keyedFrequencyCapsForClickEvents.convertToAdServices() + ) .build() } @RequiresExtension(extension = SdkExtensions.AD_SERVICES, version = 8) @RequiresExtension(extension = Build.VERSION_CODES.S, version = 9) private fun List.convertToAdServices(): - MutableList{ + MutableList{ val result = mutableListOf() for (keyedFrequencyCap in this) { result.add(keyedFrequencyCap.convertToAdServices())
diff --git a/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/common/KeyedFrequencyCap.kt b/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/common/KeyedFrequencyCap.kt index 37f606b..b0d9411 100644 --- a/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/common/KeyedFrequencyCap.kt +++ b/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/common/KeyedFrequencyCap.kt
@@ -33,11 +33,8 @@ * @param interval The interval, as a [Duration] over which the frequency cap is calculated */ @ExperimentalFeatures.Ext8OptIn -class KeyedFrequencyCap public constructor( - val adCounterKey: Int, - val maxCount: Int, - val interval: Duration -) { +class KeyedFrequencyCap +public constructor(val adCounterKey: Int, val maxCount: Int, val interval: Duration) { /** Checks whether two [KeyedFrequencyCap] objects contain the same information. */ override fun equals(other: Any?): Boolean { if (this === other) return true @@ -65,10 +62,7 @@ @RequiresExtension(extension = SdkExtensions.AD_SERVICES, version = 8) @RequiresExtension(extension = Build.VERSION_CODES.S, version = 9) internal fun convertToAdServices(): android.adservices.common.KeyedFrequencyCap { - return android.adservices.common.KeyedFrequencyCap.Builder( - adCounterKey, - maxCount, - interval) + return android.adservices.common.KeyedFrequencyCap.Builder(adCounterKey, maxCount, interval) .build() } }
diff --git a/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/customaudience/CustomAudience.kt b/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/customaudience/CustomAudience.kt index 729d8ff..97da5c8 100644 --- a/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/customaudience/CustomAudience.kt +++ b/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/customaudience/CustomAudience.kt
@@ -31,24 +31,26 @@ * * @param buyer A buyer is identified by a domain in the form "buyerexample.com". * @param name The custom audience's name is an arbitrary string provided by the owner and buyer on - * creation of the [CustomAudience] object. + * creation of the [CustomAudience] object. * @param dailyUpdateUri a URI that points to a buyer-operated server that hosts updated bidding - * data and ads metadata to be used in the on-device ad selection process. The URI must use HTTPS. + * data and ads metadata to be used in the on-device ad selection process. The URI must use HTTPS. * @param biddingLogicUri the target URI used to fetch bidding logic when a custom audience - * participates in the ad selection process. The URI must use HTTPS. + * participates in the ad selection process. The URI must use HTTPS. * @param ads the list of [AdData] objects is a full and complete list of the ads that will be - * served by this [CustomAudience] during the ad selection process. + * served by this [CustomAudience] during the ad selection process. * @param activationTime optional activation time may be set in the future, in order to serve a - * delayed activation. If the field is not set, the object will be activated at the time of joining. + * delayed activation. If the field is not set, the object will be activated at the time of + * joining. * @param expirationTime optional expiration time. Once it has passed, a custom audience is no - * longer eligible for daily ad/bidding data updates or participation in the ad selection process. - * The custom audience will then be deleted from memory by the next daily update. + * longer eligible for daily ad/bidding data updates or participation in the ad selection process. + * The custom audience will then be deleted from memory by the next daily update. * @param userBiddingSignals optional User bidding signals, provided by buyers to be consumed by - * buyer-provided JavaScript during ad selection in an isolated execution environment. + * buyer-provided JavaScript during ad selection in an isolated execution environment. * @param trustedBiddingSignals optional trusted bidding data, consists of a URI pointing to a - * trusted server for buyers' bidding data and a list of keys to query the server with. + * trusted server for buyers' bidding data and a list of keys to query the server with. */ -class CustomAudience public constructor( +class CustomAudience +public constructor( val buyer: AdTechIdentifier, val name: String, val dailyUpdateUri: Uri, @@ -60,9 +62,7 @@ val trustedBiddingSignals: TrustedBiddingData? = null ) { - /** - * Checks whether two [CustomAudience] objects contain the same information. - */ + /** Checks whether two [CustomAudience] objects contain the same information. */ override fun equals(other: Any?): Boolean { if (this === other) return true if (other !is CustomAudience) return false @@ -76,9 +76,7 @@ this.ads == other.ads } - /** - * Returns the hash of the [CustomAudience] object's data. - */ + /** Returns the hash of the [CustomAudience] object's data. */ override fun hashCode(): Int { var hash = buyer.hashCode() hash = 31 * hash + name.hashCode() @@ -120,23 +118,19 @@ * * @param buyer A buyer is identified by a domain in the form "buyerexample.com". */ - fun setBuyer(buyer: AdTechIdentifier): Builder = apply { - this.buyer = buyer - } + fun setBuyer(buyer: AdTechIdentifier): Builder = apply { this.buyer = buyer } /** * Sets the [CustomAudience] object's name. * - * @param name The custom audience's name is an arbitrary string provided by the owner and - * buyer on creation of the [CustomAudience] object. + * @param name The custom audience's name is an arbitrary string provided by the owner and + * buyer on creation of the [CustomAudience] object. */ - fun setName(name: String): Builder = apply { - this.name = name - } + fun setName(name: String): Builder = apply { this.name = name } /** - * On creation of the [CustomAudience] object, an optional activation time may be set - * in the future, in order to serve a delayed activation. If the field is not set, the + * On creation of the [CustomAudience] object, an optional activation time may be set in the + * future, in order to serve a delayed activation. If the field is not set, the * [CustomAudience] will be activated at the time of joining. * * For example, a custom audience for lapsed users may not activate until a threshold of @@ -149,7 +143,7 @@ * If specified, the activation time must be an earlier instant than the expiration time. * * @param activationTime activation time, truncated to milliseconds, after which the - * [CustomAudience] will serve ads. + * [CustomAudience] will serve ads. */ fun setActivationTime(activationTime: Instant): Builder = apply { this.activationTime = activationTime @@ -165,8 +159,8 @@ * * The maximum expiry is 60 days from initial activation. * - * @param expirationTime the timestamp [Instant], truncated to milliseconds, after - * which the custom audience should be removed. + * @param expirationTime the timestamp [Instant], truncated to milliseconds, after which the + * custom audience should be removed. */ fun setExpirationTime(expirationTime: Instant): Builder = apply { this.expirationTime = expirationTime @@ -189,27 +183,27 @@ * If the user bidding signals are not a valid JSON object that can be consumed by the * buyer's JS, the custom audience will not be eligible for ad selection. * - * If not specified, the [CustomAudience] will not participate in ad selection - * until user bidding signals are provided via the daily update for the custom audience. + * If not specified, the [CustomAudience] will not participate in ad selection until user + * bidding signals are provided via the daily update for the custom audience. * - * @param userBiddingSignals an [AdSelectionSignals] object representing the user - * bidding signals for the custom audience + * @param userBiddingSignals an [AdSelectionSignals] object representing the user bidding + * signals for the custom audience */ fun setUserBiddingSignals(userBiddingSignals: AdSelectionSignals): Builder = apply { this.userBiddingSignals = userBiddingSignals } /** - * Trusted bidding data consists of a URI pointing to a trusted server for buyers' bidding data - * and a list of keys to query the server with. Note that the keys are arbitrary identifiers - * that will only be used to query the trusted server for a buyer's bidding logic during ad - * selection. + * Trusted bidding data consists of a URI pointing to a trusted server for buyers' bidding + * data and a list of keys to query the server with. Note that the keys are arbitrary + * identifiers that will only be used to query the trusted server for a buyer's bidding + * logic during ad selection. * - * If not specified, the [CustomAudience] will not participate in ad selection - * until trusted bidding data are provided via the daily update for the custom audience. + * If not specified, the [CustomAudience] will not participate in ad selection until trusted + * bidding data are provided via the daily update for the custom audience. * * @param trustedBiddingSignals a [TrustedBiddingData] object containing the custom - * audience's trusted bidding data. + * audience's trusted bidding data. */ @SuppressWarnings("MissingGetterMatchingBuilder") fun setTrustedBiddingData(trustedBiddingSignals: TrustedBiddingData): Builder = apply { @@ -217,8 +211,8 @@ } /** - * Returns the target URI used to fetch bidding logic when a custom audience participates in the - * ad selection process. The URI must use HTTPS. + * Returns the target URI used to fetch bidding logic when a custom audience participates in + * the ad selection process. The URI must use HTTPS. * * @param biddingLogicUri the URI for fetching buyer bidding logic */ @@ -227,23 +221,19 @@ } /** - * This list of [AdData] objects is a full and complete list of the ads that will be - * served by this [CustomAudience] during the ad selection process. + * This list of [AdData] objects is a full and complete list of the ads that will be served + * by this [CustomAudience] during the ad selection process. * * If not specified, or if an empty list is provided, the [CustomAudience] will not * participate in ad selection until a valid list of ads are provided via the daily update * for the custom audience. * - * @param ads a [List] of [AdData] objects representing ads currently served by - * the custom audience. + * @param ads a [List] of [AdData] objects representing ads currently served by the custom + * audience. */ - fun setAds(ads: List): Builder = apply { - this.ads = ads - } + fun setAds(ads: List): Builder = apply { this.ads = ads } - /** - * Builds an instance of a [CustomAudience]. - */ + /** Builds an instance of a [CustomAudience]. */ fun build(): CustomAudience { return CustomAudience( buyer,
diff --git a/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/customaudience/CustomAudienceManager.kt b/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/customaudience/CustomAudienceManager.kt index 9127b1d..db1f91e 100644 --- a/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/customaudience/CustomAudienceManager.kt +++ b/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/customaudience/CustomAudienceManager.kt
@@ -25,9 +25,7 @@ import androidx.privacysandbox.ads.adservices.internal.AdServicesInfo import androidx.privacysandbox.ads.adservices.internal.BackCompatManager -/** - * This class provides APIs for app and ad-SDKs to join / leave custom audiences. - */ +/** This class provides APIs for app and ad-SDKs to join / leave custom audiences. */ abstract class CustomAudienceManager internal constructor() { /** * Adds the user to the given [CustomAudience]. @@ -39,25 +37,22 @@ * Note that the ads list can be completely overwritten by the daily background fetch job. * * This call fails with an [SecurityException] if - * *- *
the {@code ownerPackageName} is not calling app's package name and/or - *the buyer is not authorized to use the API. + *the {@code ownerPackageName} is not calling app's package name and/or + *the buyer is not authorized to use the API. * * * This call fails with an [IllegalArgumentException] if - * *- *
the storage limit has been exceeded by the calling application and/or - *any URI parameters in the [CustomAudience] given are not authenticated with the - * [CustomAudience] buyer. + *the storage limit has been exceeded by the calling application and/or + *any URI parameters in the [CustomAudience] given are not authenticated with the + * [CustomAudience] buyer. * * - * This call fails with [LimitExceededException] if the calling package exceeds the - * allowed rate limits and is throttled. + * This call fails with [LimitExceededException] if the calling package exceeds the allowed rate + * limits and is throttled. * - * This call fails with an [IllegalStateException] if an internal service error is - * encountered. + * This call fails with an [IllegalStateException] if an internal service error is encountered. * * @param request The request to join custom audience. */ @@ -74,22 +69,20 @@ * Note that the ads list can be completely overwritten by the daily background fetch job. * * This call fails with an [SecurityException] if - * *- *
the {@code ownerPackageName} is not calling app's package name and/or - *the buyer is not authorized to use the API. + *the {@code ownerPackageName} is not calling app's package name and/or + *the buyer is not authorized to use the API. * * * This call fails with an [IllegalArgumentException] if - * *- *
the storage limit has been exceeded by the calling application and/or - *any URI parameters in the [CustomAudience] given are not authenticated with the - * [CustomAudience] buyer. + *the storage limit has been exceeded by the calling application and/or + *any URI parameters in the [CustomAudience] given are not authenticated with the + * [CustomAudience] buyer. * * - * This call fails with [LimitExceededException] if the calling package exceeds the - * allowed rate limits and is throttled. + * This call fails with [LimitExceededException] if the calling package exceeds the allowed rate + * limits and is throttled. * * This call fails with an [IllegalStateException] if an internal service error is encountered. * @@ -104,18 +97,16 @@ /** * Attempts to remove a user from a custom audience by deleting any existing [CustomAudience] - * data, identified by {@code ownerPackageName}, {@code buyer}, and {@code - * name}. + * data, identified by {@code ownerPackageName}, {@code buyer}, and {@code name}. * * This call fails with an [SecurityException] if - * *- *
the {@code ownerPackageName} is not calling app's package name; and/or - *the buyer is not authorized to use the API. + *the {@code ownerPackageName} is not calling app's package name; and/or + *the buyer is not authorized to use the API. * * - * This call fails with [LimitExceededException] if the calling package exceeds the - * allowed rate limits and is throttled. + * This call fails with [LimitExceededException] if the calling package exceeds the allowed rate + * limits and is throttled. * * This call does not inform the caller whether the custom audience specified existed in * on-device storage. In other words, it will fail silently when a buyer attempts to leave a @@ -128,10 +119,10 @@ companion object { /** - * Creates [CustomAudienceManager]. + * Creates [CustomAudienceManager]. * - * @return CustomAudienceManager object. If the device is running an incompatible - * build, the value returned is null. + * @return CustomAudienceManager object. If the device is running an incompatible build, the + * value returned is null. */ @JvmStatic @SuppressLint("NewApi", "ClassVerificationFailure")
diff --git a/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/customaudience/CustomAudienceManagerApi31Ext9Impl.kt b/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/customaudience/CustomAudienceManagerApi31Ext9Impl.kt index 1e294ce..ee9ddd0 100644 --- a/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/customaudience/CustomAudienceManagerApi31Ext9Impl.kt +++ b/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/customaudience/CustomAudienceManagerApi31Ext9Impl.kt
@@ -25,5 +25,7 @@ @RestrictTo(RestrictTo.Scope.LIBRARY) @SuppressLint("NewApi", "ClassVerificationFailure") @RequiresExtension(extension = Build.VERSION_CODES.S, version = 9) -class CustomAudienceManagerApi31Ext9Impl(context: Context) : CustomAudienceManagerImplCommon( - android.adservices.customaudience.CustomAudienceManager.get(context)) +class CustomAudienceManagerApi31Ext9Impl(context: Context) : + CustomAudienceManagerImplCommon( + android.adservices.customaudience.CustomAudienceManager.get(context) + )
diff --git a/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/customaudience/CustomAudienceManagerApi33Ext4Impl.kt b/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/customaudience/CustomAudienceManagerApi33Ext4Impl.kt index fd658d7..8ed1b45 100644 --- a/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/customaudience/CustomAudienceManagerApi33Ext4Impl.kt +++ b/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/customaudience/CustomAudienceManagerApi33Ext4Impl.kt
@@ -25,5 +25,9 @@ @RestrictTo(RestrictTo.Scope.LIBRARY) @SuppressLint("NewApi", "ClassVerificationFailure") @RequiresExtension(extension = SdkExtensions.AD_SERVICES, version = 4) -class CustomAudienceManagerApi33Ext4Impl(context: Context) : CustomAudienceManagerImplCommon( - context.getSystemService(android.adservices.customaudience.CustomAudienceManager::class.java)) +class CustomAudienceManagerApi33Ext4Impl(context: Context) : + CustomAudienceManagerImplCommon( + context.getSystemService( + android.adservices.customaudience.CustomAudienceManager::class.java + ) + )
diff --git a/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/customaudience/CustomAudienceManagerImplCommon.kt b/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/customaudience/CustomAudienceManagerImplCommon.kt index 623056c..9aff642 100644 --- a/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/customaudience/CustomAudienceManagerImplCommon.kt +++ b/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/customaudience/CustomAudienceManagerImplCommon.kt
@@ -37,7 +37,7 @@ @RequiresExtension(extension = Build.VERSION_CODES.S, version = 9) open class CustomAudienceManagerImplCommon( protected val customAudienceManager: android.adservices.customaudience.CustomAudienceManager - ) : CustomAudienceManager() { +) : CustomAudienceManager() { @DoNotInline @RequiresPermission(AdServicesPermissions.ACCESS_ADSERVICES_CUSTOM_AUDIENCE) override suspend fun joinCustomAudience(request: JoinCustomAudienceRequest) { @@ -53,8 +53,9 @@ @DoNotInline @RequiresPermission(AdServicesPermissions.ACCESS_ADSERVICES_CUSTOM_AUDIENCE) override suspend fun fetchAndJoinCustomAudience(request: FetchAndJoinCustomAudienceRequest) { - if (AdServicesInfo.adServicesVersion() >= 10 || - AdServicesInfo.extServicesVersionS() >= 10) { + if ( + AdServicesInfo.adServicesVersion() >= 10 || AdServicesInfo.extServicesVersionS() >= 10 + ) { return Ext10Impl.fetchAndJoinCustomAudience(customAudienceManager, request) } throw UnsupportedOperationException("API is not available. Min version is API 31 ext 10") @@ -105,9 +106,7 @@ .build() } - private fun convertAds( - input: List- ): List { + private fun convertAds(input: List): List val result = mutableListOf{ () for (ad in input) { result.add(ad.convertToAdServices())
diff --git a/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/customaudience/FetchAndJoinCustomAudienceRequest.kt b/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/customaudience/FetchAndJoinCustomAudienceRequest.kt index 6a73258..59ea6b4 100644 --- a/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/customaudience/FetchAndJoinCustomAudienceRequest.kt +++ b/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/customaudience/FetchAndJoinCustomAudienceRequest.kt
@@ -33,10 +33,11 @@ * @param activationTime The [Instant] by which joining the custom audience will be delayed. * @param expirationTime The [Instant] by when the membership to the custom audience will expire. * @param userBiddingSignals The [AdSelectionSignals] object representing the user bidding signals - * for the custom audience. + * for the custom audience. */ @ExperimentalFeatures.Ext10OptIn -class FetchAndJoinCustomAudienceRequest public constructor( +class FetchAndJoinCustomAudienceRequest +public constructor( val fetchUri: Uri, val name: String? = null, val activationTime: Instant? = null, @@ -56,9 +57,7 @@ this.userBiddingSignals == other.userBiddingSignals } - /** - * Returns the hash of the [FetchAndJoinCustomAudienceRequest] object's data. - */ + /** Returns the hash of the [FetchAndJoinCustomAudienceRequest] object's data. */ override fun hashCode(): Int { var hash = fetchUri.hashCode() hash = 31 * hash + name.hashCode() @@ -79,8 +78,7 @@ @RequiresExtension(extension = Build.VERSION_CODES.S, version = 10) internal fun convertToAdServices(): android.adservices.customaudience.FetchAndJoinCustomAudienceRequest { - return android.adservices.customaudience.FetchAndJoinCustomAudienceRequest - .Builder(fetchUri) + return android.adservices.customaudience.FetchAndJoinCustomAudienceRequest.Builder(fetchUri) .setName(name) .setActivationTime(activationTime) .setExpirationTime(expirationTime)
diff --git a/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/customaudience/JoinCustomAudienceRequest.kt b/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/customaudience/JoinCustomAudienceRequest.kt index 11d5703..91c4c7d 100644 --- a/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/customaudience/JoinCustomAudienceRequest.kt +++ b/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/customaudience/JoinCustomAudienceRequest.kt
@@ -22,18 +22,14 @@ * @param customAudience the custom audience to join. */ class JoinCustomAudienceRequest public constructor(val customAudience: CustomAudience) { - /** - * Checks whether two [JoinCustomAudienceRequest] objects contain the same information. - */ + /** Checks whether two [JoinCustomAudienceRequest] objects contain the same information. */ override fun equals(other: Any?): Boolean { if (this === other) return true if (other !is JoinCustomAudienceRequest) return false return this.customAudience == other.customAudience } - /** - * Returns the hash of the [JoinCustomAudienceRequest] object's data. - */ + /** Returns the hash of the [JoinCustomAudienceRequest] object's data. */ override fun hashCode(): Int { return customAudience.hashCode() }
diff --git a/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/customaudience/LeaveCustomAudienceRequest.kt b/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/customaudience/LeaveCustomAudienceRequest.kt index ca60ccf..b8ed8e2 100644 --- a/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/customaudience/LeaveCustomAudienceRequest.kt +++ b/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/customaudience/LeaveCustomAudienceRequest.kt
@@ -24,23 +24,16 @@ * @param buyer an [AdTechIdentifier] containing the custom audience's buyer's domain. * @param name the String name of the custom audience. */ -class LeaveCustomAudienceRequest public constructor( - val buyer: AdTechIdentifier, - val name: String - ) { +class LeaveCustomAudienceRequest public constructor(val buyer: AdTechIdentifier, val name: String) { - /** - * Checks whether two [LeaveCustomAudienceRequest] objects contain the same information. - */ + /** Checks whether two [LeaveCustomAudienceRequest] objects contain the same information. */ override fun equals(other: Any?): Boolean { if (this === other) return true if (other !is LeaveCustomAudienceRequest) return false return this.buyer == other.buyer && this.name == other.name } - /** - * Returns the hash of the [LeaveCustomAudienceRequest] object's data. - */ + /** Returns the hash of the [LeaveCustomAudienceRequest] object's data. */ override fun hashCode(): Int { return (31 * buyer.hashCode()) + name.hashCode() }
diff --git a/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/customaudience/TrustedBiddingData.kt b/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/customaudience/TrustedBiddingData.kt index 64c7d67..2b7158a 100644 --- a/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/customaudience/TrustedBiddingData.kt +++ b/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/customaudience/TrustedBiddingData.kt
@@ -24,17 +24,13 @@ * by buyer JavaScript logic running in an isolated execution environment. * * @param trustedBiddingUri the URI pointing to the trusted key-value server holding bidding - * signals. The URI must use HTTPS. + * signals. The URI must use HTTPS. * @param trustedBiddingKeys the list of keys to query from the trusted key-value server holding - * bidding signals. + * bidding signals. */ -class TrustedBiddingData public constructor( - val trustedBiddingUri: Uri, - val trustedBiddingKeys: List- ) { - /** - * @return `true` if two [TrustedBiddingData] objects contain the same information - */ +class TrustedBiddingData +public constructor(val trustedBiddingUri: Uri, val trustedBiddingKeys: List ) { + /** @return `true` if two [TrustedBiddingData] objects contain the same information */ override fun equals(other: Any?): Boolean { if (this === other) return true if (other !is TrustedBiddingData) return false @@ -42,9 +38,7 @@ this.trustedBiddingKeys == other.trustedBiddingKeys } - /** - * @return the hash of the [TrustedBiddingData] object's data - */ + /** @return the hash of the [TrustedBiddingData] object's data */ override fun hashCode(): Int { return (31 * trustedBiddingUri.hashCode()) + trustedBiddingKeys.hashCode() }
diff --git a/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/internal/AdServicesInfo.kt b/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/internal/AdServicesInfo.kt index a5eee78..a981294 100644 --- a/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/internal/AdServicesInfo.kt +++ b/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/internal/AdServicesInfo.kt
@@ -49,8 +49,7 @@ @RequiresApi(30) private object Extensions30Impl { @DoNotInline - fun getAdServicesVersion() = - SdkExtensions.getExtensionVersion(SdkExtensions.AD_SERVICES) + fun getAdServicesVersion() = SdkExtensions.getExtensionVersion(SdkExtensions.AD_SERVICES) } @RequiresApi(30) @@ -59,11 +58,9 @@ // for the build version. Use S for now, but this can be changed to R when we add // support for R later. @DoNotInline - fun getAdExtServicesVersionS() = - SdkExtensions.getExtensionVersion(Build.VERSION_CODES.S) + fun getAdExtServicesVersionS() = SdkExtensions.getExtensionVersion(Build.VERSION_CODES.S) @DoNotInline - fun getAdExtServicesVersionR() = - SdkExtensions.getExtensionVersion(Build.VERSION_CODES.R) + fun getAdExtServicesVersionR() = SdkExtensions.getExtensionVersion(Build.VERSION_CODES.R) } }
diff --git a/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/internal/AdServicesOutcomeReceiver.kt b/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/internal/AdServicesOutcomeReceiver.kt index 450650d..6f87e40 100644 --- a/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/internal/AdServicesOutcomeReceiver.kt +++ b/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/internal/AdServicesOutcomeReceiver.kt
@@ -26,10 +26,10 @@ import kotlin.coroutines.resumeWithException /* - This file is a modified version OutcomeReceiver.kt in androidx.core.os, designed to provide the same - functionality with the AdServicesOutcomeReceiver, to keep the implementation of the backward compatible - classes as close to identical as possible. - */ + This file is a modified version OutcomeReceiver.kt in androidx.core.os, designed to provide the same + functionality with the AdServicesOutcomeReceiver, to keep the implementation of the backward compatible + classes as close to identical as possible. +*/ @RequiresExtension(extension = Build.VERSION_CODES.R, version = 11) funContinuation .asAdServicesOutcomeReceiver():
diff --git a/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/measurement/DeletionRequest.kt b/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/measurement/DeletionRequest.kt index 10b87e9..a482855 100644 --- a/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/measurement/DeletionRequest.kt +++ b/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/measurement/DeletionRequest.kt
@@ -28,37 +28,31 @@ /** * Deletion Request. - * @param deletionMode Set the deletion mode for the supplied params. - * [DELETION_MODE_ALL]: All data associated with the selected records will be - * deleted. - * [DELETION_MODE_EXCLUDE_INTERNAL_DATA]: All data except the internal system - * data (e.g. rate limits) associated with the selected records will be deleted. * - * @param matchBehavior Set the match behavior for the supplied params. - * [MATCH_BEHAVIOR_DELETE]: This option will use the supplied params - * (Origin URIs & Domain URIs) for selecting records for deletion. - * [MATCH_BEHAVIOR_PRESERVE]: This option will preserve the data associated with the - * supplied params (Origin URIs & Domain URIs) and select remaining records for deletion. - * - * @param start [Instant] Set the start of the deletion range. Not setting this or - * passing in [java.time.Instant#MIN] will cause everything from the oldest record to - * the specified end be deleted. - * + * @param deletionMode Set the deletion mode for the supplied params. [DELETION_MODE_ALL]: All data + * associated with the selected records will be deleted. [DELETION_MODE_EXCLUDE_INTERNAL_DATA]: + * All data except the internal system data (e.g. rate limits) associated with the selected + * records will be deleted. + * @param matchBehavior Set the match behavior for the supplied params. [MATCH_BEHAVIOR_DELETE]: + * This option will use the supplied params (Origin URIs & Domain URIs) for selecting records for + * deletion. [MATCH_BEHAVIOR_PRESERVE]: This option will preserve the data associated with the + * supplied params (Origin URIs & Domain URIs) and select remaining records for deletion. + * @param start [Instant] Set the start of the deletion range. Not setting this or passing in + * [java.time.Instant#MIN] will cause everything from the oldest record to the specified end be + * deleted. * @param end [Instant] Set the end of the deletion range. Not setting this or passing in - * [java.time.Instant#MAX] will cause everything from the specified start until the - * newest record to be deleted. - * + * [java.time.Instant#MAX] will cause everything from the specified start until the newest record + * to be deleted. * @param domainUris the list of domain URI which will be used for matching. These will be matched - * with records using the same domain or any subdomains. E.g. If domainUri is {@code - * https://example.com}, then {@code https://a.example.com}, {@code https://example.com} and - * {@code https://b.example.com} will match; {@code https://abcexample.com} will NOT match. - * A null or empty list will match everything. - * + * with records using the same domain or any subdomains. E.g. If domainUri is {@code + * https://example.com}, then {@code https://a.example.com}, {@code https://example.com} and + * {@code https://b.example.com} will match; {@code https://abcexample.com} will NOT match. A null + * or empty list will match everything. * @param originUris the list of origin URI which will be used for matching. These will be matched - * with records using the same origin only, i.e. subdomains won't match. E.g. If originUri is - * {@code https://a.example.com}, then {@code https://a.example.com} will match; {@code - * https://example.com}, {@code https://b.example.com} and {@code https://abcexample.com} - * will NOT match. A null or empty list will match everything. + * with records using the same origin only, i.e. subdomains won't match. E.g. If originUri is + * {@code https://a.example.com}, then {@code https://a.example.com} will match; {@code + * https://example.com}, {@code https://b.example.com} and {@code https://abcexample.com} will NOT + * match. A null or empty list will match everything. */ @RequiresApi(android.os.Build.VERSION_CODES.O) class DeletionRequest( @@ -92,10 +86,12 @@ } override fun toString(): String { - val deletionModeStr = if (deletionMode == DELETION_MODE_ALL) "DELETION_MODE_ALL" - else "DELETION_MODE_EXCLUDE_INTERNAL_DATA" - val matchBehaviorStr = if (matchBehavior == MATCH_BEHAVIOR_DELETE) "MATCH_BEHAVIOR_DELETE" - else "MATCH_BEHAVIOR_PRESERVE" + val deletionModeStr = + if (deletionMode == DELETION_MODE_ALL) "DELETION_MODE_ALL" + else "DELETION_MODE_EXCLUDE_INTERNAL_DATA" + val matchBehaviorStr = + if (matchBehavior == MATCH_BEHAVIOR_DELETE) "MATCH_BEHAVIOR_DELETE" + else "MATCH_BEHAVIOR_PRESERVE" return "DeletionRequest { DeletionMode=$deletionModeStr, " + "MatchBehavior=$matchBehaviorStr, " + "Start=$start, End=$end, DomainUris=$domainUris, OriginUris=$originUris }" @@ -117,7 +113,7 @@ } companion object { - /** Deletion mode to delete all data associated with the selected records. */ + /** Deletion mode to delete all data associated with the selected records. */ public const val DELETION_MODE_ALL = 0 /** @@ -128,13 +124,10 @@ @RestrictTo(RestrictTo.Scope.LIBRARY) @Retention(AnnotationRetention.SOURCE) - @IntDef( - DELETION_MODE_ALL, - DELETION_MODE_EXCLUDE_INTERNAL_DATA - ) + @IntDef(DELETION_MODE_ALL, DELETION_MODE_EXCLUDE_INTERNAL_DATA) annotation class DeletionMode - /** Match behavior option to delete the supplied params (Origin/Domains). */ + /** Match behavior option to delete the supplied params (Origin/Domains). */ public const val MATCH_BEHAVIOR_DELETE = 0 /** @@ -145,10 +138,7 @@ @RestrictTo(RestrictTo.Scope.LIBRARY) @Retention(AnnotationRetention.SOURCE) - @IntDef( - MATCH_BEHAVIOR_DELETE, - MATCH_BEHAVIOR_PRESERVE - ) + @IntDef(MATCH_BEHAVIOR_DELETE, MATCH_BEHAVIOR_PRESERVE) annotation class MatchBehavior } @@ -156,19 +146,18 @@ * Builder for {@link DeletionRequest} objects. * * @param deletionMode {@link DeletionMode} Set the match behavior for the supplied params. - * {@link #DELETION_MODE_ALL}: All data associated with the selected records will be - * deleted. - * {@link #DELETION_MODE_EXCLUDE_INTERNAL_DATA}: All data except the internal system - * data (e.g. rate limits) associated with the selected records will be deleted. - * + * {@link #DELETION_MODE_ALL}: All data associated with the selected records will be deleted. + * {@link #DELETION_MODE_EXCLUDE_INTERNAL_DATA}: All data except the internal system data + * (e.g. rate limits) associated with the selected records will be deleted. * @param matchBehavior {@link MatchBehavior} Set the match behavior for the supplied params. - * {@link #MATCH_BEHAVIOR_DELETE}: This option will use the supplied params - * (Origin URIs & Domain URIs) for selecting records for deletion. - * {@link #MATCH_BEHAVIOR_PRESERVE}: This option will preserve the data associated with the - * supplied params (Origin URIs & Domain URIs) and select remaining records for deletion. + * {@link #MATCH_BEHAVIOR_DELETE}: This option will use the supplied params (Origin URIs & + * Domain URIs) for selecting records for deletion. {@link #MATCH_BEHAVIOR_PRESERVE}: This + * option will preserve the data associated with the supplied params (Origin URIs & Domain + * URIs) and select remaining records for deletion. */ @RequiresApi(android.os.Build.VERSION_CODES.O) - public class Builder constructor( + public class Builder + constructor( @DeletionMode private val deletionMode: Int, @MatchBehavior private val matchBehavior: Int ) { @@ -178,22 +167,18 @@ private var originUris: List= emptyList() /** - * Sets the start of the deletion range. Not setting this or passing in - * {@link java.time.Instant#MIN} will cause everything from the oldest record to the - * specified end be deleted. + * Sets the start of the deletion range. Not setting this or passing in {@link + * java.time.Instant#MIN} will cause everything from the oldest record to the specified end + * be deleted. */ - fun setStart(start: Instant): Builder = apply { - this.start = start - } + fun setStart(start: Instant): Builder = apply { this.start = start } /** - * Sets the end of the deletion range. Not setting this or passing in - * {@link java.time.Instant#MAX} will cause everything from the specified start until the - * newest record to be deleted. + * Sets the end of the deletion range. Not setting this or passing in {@link + * java.time.Instant#MAX} will cause everything from the specified start until the newest + * record to be deleted. */ - fun setEnd(end: Instant): Builder = apply { - this.end = end - } + fun setEnd(end: Instant): Builder = apply { this.end = end } /** * Set the list of domain URI which will be used for matching. These will be matched with @@ -202,9 +187,7 @@ * {@code https://b.example.com} will match; {@code https://abcexample.com} will NOT match. * A null or empty list will match everything. */ - fun setDomainUris(domainUris: List): Builder = apply { - this.domainUris = domainUris - } + fun setDomainUris(domainUris: List): Builder = apply { this.domainUris = domainUris } /** * Set the list of origin URI which will be used for matching. These will be matched with @@ -213,19 +196,11 @@ * https://example.com}, {@code https://b.example.com} and {@code https://abcexample.com} * will NOT match. A null or empty list will match everything. */ - fun setOriginUris(originUris: List): Builder = apply { - this.originUris = originUris - } + fun setOriginUris(originUris: List): Builder = apply { this.originUris = originUris } /** Builds a {@link DeletionRequest} instance. */ fun build(): DeletionRequest { - return DeletionRequest( - deletionMode, - matchBehavior, - start, - end, - domainUris, - originUris) + return DeletionRequest(deletionMode, matchBehavior, start, end, domainUris, originUris) } } }
diff --git a/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/measurement/MeasurementManager.kt b/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/measurement/MeasurementManager.kt index 7136af9..ebfdc16 100644 --- a/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/measurement/MeasurementManager.kt +++ b/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/measurement/MeasurementManager.kt
@@ -28,18 +28,15 @@ import androidx.privacysandbox.ads.adservices.internal.AdServicesInfo import androidx.privacysandbox.ads.adservices.internal.BackCompatManager -/** - * This class provides APIs to manage ads attribution using Privacy Sandbox. - */ +/** This class provides APIs to manage ads attribution using Privacy Sandbox. */ abstract class MeasurementManager { /** * Delete previous registrations. * * @param deletionRequest The request for deleting data. - * * @throws SecurityException if the caller is not authorized to call the API. - * @throws IllegalStateException if the API is disabled, the caller app is in background or - * user consent hasn't been granted yet. + * @throws IllegalStateException if the API is disabled, the caller app is in background or user + * consent hasn't been granted yet. * @throws LimitExceededException if the API invocation rate limit is exceeded. */ abstract suspend fun deleteRegistrations(deletionRequest: DeletionRequest) @@ -48,10 +45,9 @@ * Register an attribution source (click or view). * * @param attributionSource the platform issues a request to this URI in order to fetch metadata - * associated with the attribution source. + * associated with the attribution source. * @param inputEvent either an [InputEvent] object (for a click event) or null (for a view - * event). - * + * event). * @throws SecurityException if the caller is not authorized to call the API. * @throws IllegalStateException if the API is disabled or the caller app is in background. * @throws LimitExceededException if the API invocation rate limit is exceeded. @@ -64,11 +60,10 @@ * Register a trigger (conversion). * * @param trigger the API issues a request to this URI to fetch metadata associated with the - * trigger. - * + * trigger. * @throws SecurityException if the caller is not authorized to call the API. - * @throws IllegalStateException if the API is disabled, the caller app is in background or - * user consent hasn't been granted yet. + * @throws IllegalStateException if the API is disabled, the caller app is in background or user + * consent hasn't been granted yet. * @throws LimitExceededException if the API invocation rate limit is exceeded. * @throws IllegalArgumentException if the API is invoked with invalid arguments. */ @@ -82,10 +77,9 @@ * appDestination or webDestination parameters are required to be provided. * * @param request source registration request - * * @throws SecurityException if the caller is not authorized to call the API. - * @throws IllegalStateException if the API is disabled, the caller app is in background or - * user consent hasn't been granted yet. + * @throws IllegalStateException if the API is disabled, the caller app is in background or user + * consent hasn't been granted yet. * @throws LimitExceededException if the API invocation rate limit is exceeded. */ @RequiresPermission(ACCESS_ADSERVICES_ATTRIBUTION) @@ -96,10 +90,9 @@ * any redirects, all registration URLs should be supplied with the request. * * @param request trigger registration request - * * @throws SecurityException if the caller is not authorized to call the API. - * @throws IllegalStateException if the API is disabled, the caller app is in background or - * user consent hasn't been granted yet. + * @throws IllegalStateException if the API is disabled, the caller app is in background or user + * consent hasn't been granted yet. * @throws LimitExceededException if the API invocation rate limit is exceeded. */ @RequiresPermission(ACCESS_ADSERVICES_ATTRIBUTION) @@ -110,10 +103,9 @@ * redirects, all registration URLs should be supplied with the request. * * @param request source registration request - * * @throws SecurityException if the caller is not authorized to call the API. - * @throws IllegalStateException if the API is disabled, the caller app is in background or - * user consent hasn't been granted yet. + * @throws IllegalStateException if the API is disabled, the caller app is in background or user + * consent hasn't been granted yet. * @throws LimitExceededException if the API invocation rate limit is exceeded. */ @RequiresPermission(ACCESS_ADSERVICES_ATTRIBUTION) @@ -124,33 +116,33 @@ * Get Measurement API status. * * @return an integer value (see [MEASUREMENT_API_STATE_DISABLED] and - * [MEASUREMENT_API_STATE_ENABLED] for possible values). + * [MEASUREMENT_API_STATE_ENABLED] for possible values). */ @RequiresPermission(ACCESS_ADSERVICES_ATTRIBUTION) abstract suspend fun getMeasurementApiStatus(): Int companion object { /** - * This state indicates that Measurement APIs are unavailable. Invoking them will result - * in an [UnsupportedOperationException]. + * This state indicates that Measurement APIs are unavailable. Invoking them will result in + * an [UnsupportedOperationException]. */ public const val MEASUREMENT_API_STATE_DISABLED = 0 - /** - * This state indicates that Measurement APIs are enabled. - */ + /** This state indicates that Measurement APIs are enabled. */ public const val MEASUREMENT_API_STATE_ENABLED = 1 /** - * Creates [MeasurementManager]. + * Creates [MeasurementManager]. * - * @return MeasurementManager object. If the device is running an incompatible - * build, the value returned is null. + * @return MeasurementManager object. If the device is running an incompatible build, the + * value returned is null. */ @JvmStatic @SuppressLint("NewApi", "ClassVerificationFailure") fun obtain(context: Context): MeasurementManager? { - Log.d("MeasurementManager", - "AdServicesInfo.version=${AdServicesInfo.adServicesVersion()}") + Log.d( + "MeasurementManager", + "AdServicesInfo.version=${AdServicesInfo.adServicesVersion()}" + ) return if (AdServicesInfo.adServicesVersion() >= 5) { MeasurementManagerApi33Ext5Impl(context) } else if (AdServicesInfo.extServicesVersionS() >= 9) {
diff --git a/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/measurement/MeasurementManagerApi30Ext11Impl.kt b/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/measurement/MeasurementManagerApi30Ext11Impl.kt index 0a833a9..86ed67c 100644 --- a/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/measurement/MeasurementManagerApi30Ext11Impl.kt +++ b/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/measurement/MeasurementManagerApi30Ext11Impl.kt
@@ -70,7 +70,8 @@ mMeasurementManager.registerTrigger( trigger, Runnable::run, - continuation.asAdServicesOutcomeReceiver()) + continuation.asAdServicesOutcomeReceiver() + ) } } @@ -81,16 +82,15 @@ mMeasurementManager.registerWebSource( request.convertToAdServices(), Runnable::run, - continuation.asAdServicesOutcomeReceiver()) + continuation.asAdServicesOutcomeReceiver() + ) } } @DoNotInline @ExperimentalFeatures.RegisterSourceOptIn @RequiresPermission(AdServicesPermissions.ACCESS_ADSERVICES_ATTRIBUTION) - override suspend fun registerSource( - request: SourceRegistrationRequest - ): Unit = coroutineScope { + override suspend fun registerSource(request: SourceRegistrationRequest): Unit = coroutineScope { request.registrationUris.forEach { uri -> launch { suspendCancellableCoroutine{ continuation -> @@ -112,16 +112,18 @@ mMeasurementManager.registerWebTrigger( request.convertToAdServices(), Runnable::run, - continuation.asAdServicesOutcomeReceiver()) + continuation.asAdServicesOutcomeReceiver() + ) } } @DoNotInline @RequiresPermission(AdServicesPermissions.ACCESS_ADSERVICES_ATTRIBUTION) - override suspend fun getMeasurementApiStatus(): Int = suspendCancellableCoroutine { - continuation -> - mMeasurementManager.getMeasurementApiStatus( - Runnable::run, - continuation.asAdServicesOutcomeReceiver()) - } + override suspend fun getMeasurementApiStatus(): Int = + suspendCancellableCoroutine { continuation -> + mMeasurementManager.getMeasurementApiStatus( + Runnable::run, + continuation.asAdServicesOutcomeReceiver() + ) + } }
diff --git a/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/measurement/MeasurementManagerApi31Ext9Impl.kt b/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/measurement/MeasurementManagerApi31Ext9Impl.kt index 4d55606..359681d 100644 --- a/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/measurement/MeasurementManagerApi31Ext9Impl.kt +++ b/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/measurement/MeasurementManagerApi31Ext9Impl.kt
@@ -25,5 +25,5 @@ @RestrictTo(RestrictTo.Scope.LIBRARY) @SuppressLint("NewApi", "ClassVerificationFailure") @RequiresExtension(extension = Build.VERSION_CODES.S, version = 9) -class MeasurementManagerApi31Ext9Impl(context: Context) : MeasurementManagerImplCommon( - android.adservices.measurement.MeasurementManager.get(context)) +class MeasurementManagerApi31Ext9Impl(context: Context) : + MeasurementManagerImplCommon(android.adservices.measurement.MeasurementManager.get(context))
diff --git a/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/measurement/MeasurementManagerApi33Ext5Impl.kt b/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/measurement/MeasurementManagerApi33Ext5Impl.kt index cf0de76..f63061e 100644 --- a/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/measurement/MeasurementManagerApi33Ext5Impl.kt +++ b/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/measurement/MeasurementManagerApi33Ext5Impl.kt
@@ -25,5 +25,7 @@ @RestrictTo(RestrictTo.Scope.LIBRARY) @SuppressLint("NewApi", "ClassVerificationFailure") @RequiresExtension(extension = SdkExtensions.AD_SERVICES, version = 5) -class MeasurementManagerApi33Ext5Impl(context: Context) : MeasurementManagerImplCommon( - context.getSystemService(android.adservices.measurement.MeasurementManager::class.java)) +class MeasurementManagerApi33Ext5Impl(context: Context) : + MeasurementManagerImplCommon( + context.getSystemService(android.adservices.measurement.MeasurementManager::class.java) + )
diff --git a/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/measurement/MeasurementManagerImplCommon.kt b/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/measurement/MeasurementManagerImplCommon.kt index b33b627..2932b8e 100644 --- a/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/measurement/MeasurementManagerImplCommon.kt +++ b/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/measurement/MeasurementManagerImplCommon.kt
@@ -38,7 +38,7 @@ @RequiresExtension(extension = Build.VERSION_CODES.S, version = 9) open class MeasurementManagerImplCommon( protected val mMeasurementManager: android.adservices.measurement.MeasurementManager - ) : MeasurementManager() { +) : MeasurementManager() { @DoNotInline override suspend fun deleteRegistrations(deletionRequest: DeletionRequest) { suspendCancellableCoroutine{ continuation -> @@ -70,7 +70,8 @@ mMeasurementManager.registerTrigger( trigger, Runnable::run, - continuation.asOutcomeReceiver()) + continuation.asOutcomeReceiver() + ) } } @@ -81,16 +82,15 @@ mMeasurementManager.registerWebSource( request.convertToAdServices(), Runnable::run, - continuation.asOutcomeReceiver()) + continuation.asOutcomeReceiver() + ) } } @DoNotInline @ExperimentalFeatures.RegisterSourceOptIn @RequiresPermission(AdServicesPermissions.ACCESS_ADSERVICES_ATTRIBUTION) - override suspend fun registerSource( - request: SourceRegistrationRequest - ): Unit = coroutineScope { + override suspend fun registerSource(request: SourceRegistrationRequest): Unit = coroutineScope { request.registrationUris.forEach { uri -> launch { suspendCancellableCoroutine{ continuation -> @@ -112,16 +112,18 @@ mMeasurementManager.registerWebTrigger( request.convertToAdServices(), Runnable::run, - continuation.asOutcomeReceiver()) + continuation.asOutcomeReceiver() + ) } } @DoNotInline @RequiresPermission(AdServicesPermissions.ACCESS_ADSERVICES_ATTRIBUTION) - override suspend fun getMeasurementApiStatus(): Int = suspendCancellableCoroutine { - continuation -> - mMeasurementManager.getMeasurementApiStatus( - Runnable::run, - continuation.asOutcomeReceiver()) - } + override suspend fun getMeasurementApiStatus(): Int = + suspendCancellableCoroutine { continuation -> + mMeasurementManager.getMeasurementApiStatus( + Runnable::run, + continuation.asOutcomeReceiver() + ) + } }
diff --git a/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/measurement/SourceRegistrationRequest.kt b/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/measurement/SourceRegistrationRequest.kt index 7bda8bf..7361da5 100644 --- a/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/measurement/SourceRegistrationRequest.kt +++ b/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/measurement/SourceRegistrationRequest.kt
@@ -25,13 +25,11 @@ * * @param registrationUris [List] of Registration [Uri]s to fetch sources. * @param inputEvent User Interaction [InputEvent] used by the AttributionReporting API to - * distinguish clicks from views. + * distinguish clicks from views. */ @ExperimentalFeatures.RegisterSourceOptIn -class SourceRegistrationRequest constructor( - val registrationUris: List, - val inputEvent: InputEvent? = null - ) { +class SourceRegistrationRequest +constructor(val registrationUris: List, val inputEvent: InputEvent? = null) { override fun equals(other: Any?): Boolean { if (this === other) return true @@ -58,28 +56,21 @@ * * @param registrationUris source registration request [Uri] */ - class Builder( - private val registrationUris: List- ) { + class Builder(private val registrationUris: List ) { private var inputEvent: InputEvent? = null /** * Setter for input event. * * @param inputEvent User Interaction InputEvent used by the AttributionReporting API to - * distinguish clicks from views. + * distinguish clicks from views. * @return builder */ - fun setInputEvent(inputEvent: InputEvent): Builder = apply { - this.inputEvent = inputEvent - } + fun setInputEvent(inputEvent: InputEvent): Builder = apply { this.inputEvent = inputEvent } /** Pre-validates parameters and builds [SourceRegistrationRequest]. */ fun build(): SourceRegistrationRequest { - return SourceRegistrationRequest( - registrationUris, - inputEvent - ) + return SourceRegistrationRequest(registrationUris, inputEvent) } } }
diff --git a/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/measurement/WebSourceParams.kt b/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/measurement/WebSourceParams.kt index 21ad23e..c7bc6fe 100644 --- a/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/measurement/WebSourceParams.kt +++ b/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/measurement/WebSourceParams.kt
@@ -26,14 +26,11 @@ * Class holding source registration parameters. * * @param registrationUri URI that the Attribution Reporting API sends a request to in order to - * obtain source registration parameters. + * obtain source registration parameters. * @param debugKeyAllowed Used by the browser to indicate whether the debug key obtained from the - * registration URI is allowed to be used. + * registration URI is allowed to be used. */ -class WebSourceParams public constructor( - val registrationUri: Uri, - val debugKeyAllowed: Boolean - ) { +class WebSourceParams public constructor(val registrationUri: Uri, val debugKeyAllowed: Boolean) { override fun equals(other: Any?): Boolean { if (this === other) return true @@ -63,10 +60,11 @@ ): List{ var result = mutableListOf() for (param in request) { - result.add(android.adservices.measurement.WebSourceParams - .Builder(param.registrationUri) - .setDebugKeyAllowed(param.debugKeyAllowed) - .build()) + result.add( + android.adservices.measurement.WebSourceParams.Builder(param.registrationUri) + .setDebugKeyAllowed(param.debugKeyAllowed) + .build() + ) } return result }
diff --git a/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/measurement/WebSourceRegistrationRequest.kt b/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/measurement/WebSourceRegistrationRequest.kt index 4a90270..5d48214 100644 --- a/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/measurement/WebSourceRegistrationRequest.kt +++ b/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/measurement/WebSourceRegistrationRequest.kt
@@ -30,24 +30,25 @@ * @param webSourceParams Registration info to fetch sources. * @param topOriginUri Top level origin of publisher. * @param inputEvent User Interaction {@link InputEvent} used by the AttributionReporting API to - * distinguish clicks from views. + * distinguish clicks from views. * @param appDestination App destination of the source. It is the android app {@link Uri} where - * corresponding conversion is expected. At least one of app destination or web destination is - * required. + * corresponding conversion is expected. At least one of app destination or web destination is + * required. * @param webDestination Web destination of the source. It is the website {@link Uri} where - * corresponding conversion is expected. At least one of app destination or web destination is - * required. + * corresponding conversion is expected. At least one of app destination or web destination is + * required. * @param verifiedDestination Verified destination by the caller. This is where the user actually - * landed. + * landed. */ -class WebSourceRegistrationRequest public constructor( +class WebSourceRegistrationRequest +public constructor( val webSourceParams: List, val topOriginUri: Uri, val inputEvent: InputEvent? = null, val appDestination: Uri? = null, val webDestination: Uri? = null, val verifiedDestination: Uri? = null - ) { +) { override fun equals(other: Any?): Boolean { if (this === other) return true @@ -84,9 +85,10 @@ } override fun toString(): String { - val vals = "WebSourceParams=[$webSourceParams], TopOriginUri=$topOriginUri, " + - "InputEvent=$inputEvent, AppDestination=$appDestination, " + - "WebDestination=$webDestination, VerifiedDestination=$verifiedDestination" + val vals = + "WebSourceParams=[$webSourceParams], TopOriginUri=$topOriginUri, " + + "InputEvent=$inputEvent, AppDestination=$appDestination, " + + "WebDestination=$webDestination, VerifiedDestination=$verifiedDestination" return "WebSourceRegistrationRequest { $vals }" } @@ -96,10 +98,10 @@ @RequiresExtension(extension = Build.VERSION_CODES.R, version = 11) internal fun convertToAdServices(): android.adservices.measurement.WebSourceRegistrationRequest { - return android.adservices.measurement.WebSourceRegistrationRequest - .Builder( + return android.adservices.measurement.WebSourceRegistrationRequest.Builder( convertWebSourceParams(webSourceParams), - topOriginUri) + topOriginUri + ) .setWebDestination(webDestination) .setAppDestination(appDestination) .setInputEvent(inputEvent) @@ -110,8 +112,8 @@ /** * Builder for [WebSourceRegistrationRequest]. * - * @param webSourceParams source parameters containing source registration parameters, the - * list should not be empty + * @param webSourceParams source parameters containing source registration parameters, the list + * should not be empty * @param topOriginUri source publisher [Uri] */ public class Builder( @@ -127,12 +129,10 @@ * Setter for input event. * * @param inputEvent User Interaction InputEvent used by the AttributionReporting API to - * distinguish clicks from views. + * distinguish clicks from views. * @return builder */ - fun setInputEvent(inputEvent: InputEvent): Builder = apply { - this.inputEvent = inputEvent - } + fun setInputEvent(inputEvent: InputEvent): Builder = apply { this.inputEvent = inputEvent } /** * Setter for app destination. It is the android app {@link Uri} where corresponding
diff --git a/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/measurement/WebTriggerParams.kt b/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/measurement/WebTriggerParams.kt index 82f0527..2163701 100644 --- a/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/measurement/WebTriggerParams.kt +++ b/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/measurement/WebTriggerParams.kt
@@ -26,14 +26,11 @@ * Class holding trigger registration parameters. * * @param registrationUri URI that the Attribution Reporting API sends a request to in order to - * obtain trigger registration parameters. + * obtain trigger registration parameters. * @param debugKeyAllowed Used by the browser to indicate whether the debug key obtained from the - * registration URI is allowed to be used. + * registration URI is allowed to be used. */ -class WebTriggerParams public constructor( - val registrationUri: Uri, - val debugKeyAllowed: Boolean - ) { +class WebTriggerParams public constructor(val registrationUri: Uri, val debugKeyAllowed: Boolean) { override fun equals(other: Any?): Boolean { if (this === other) return true @@ -63,10 +60,11 @@ ): List{ var result = mutableListOf() for (param in request) { - result.add(android.adservices.measurement.WebTriggerParams - .Builder(param.registrationUri) - .setDebugKeyAllowed(param.debugKeyAllowed) - .build()) + result.add( + android.adservices.measurement.WebTriggerParams.Builder(param.registrationUri) + .setDebugKeyAllowed(param.debugKeyAllowed) + .build() + ) } return result }
diff --git a/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/measurement/WebTriggerRegistrationRequest.kt b/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/measurement/WebTriggerRegistrationRequest.kt index 1a280a1..f521339 100644 --- a/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/measurement/WebTriggerRegistrationRequest.kt +++ b/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/measurement/WebTriggerRegistrationRequest.kt
@@ -29,10 +29,8 @@ * @param webTriggerParams Registration info to fetch sources. * @param destination Destination [Uri]. */ -class WebTriggerRegistrationRequest public constructor( - val webTriggerParams: List, - val destination: Uri - ) { +class WebTriggerRegistrationRequest +public constructor(val webTriggerParams: List, val destination: Uri) { override fun equals(other: Any?): Boolean { if (this === other) return true if (other !is WebTriggerRegistrationRequest) return false @@ -57,10 +55,10 @@ @RequiresExtension(extension = Build.VERSION_CODES.R, version = 11) internal fun convertToAdServices(): android.adservices.measurement.WebTriggerRegistrationRequest { - return android.adservices.measurement.WebTriggerRegistrationRequest - .Builder( + return android.adservices.measurement.WebTriggerRegistrationRequest.Builder( convertWebTriggerParams(webTriggerParams), - destination) + destination + ) .build() } }
diff --git a/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/topics/EncryptedTopic.kt b/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/topics/EncryptedTopic.kt index 716c6ed..35fb075 100644 --- a/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/topics/EncryptedTopic.kt +++ b/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/topics/EncryptedTopic.kt
@@ -20,7 +20,8 @@ import java.util.Objects /** - * This class will be used to return encrypted topic cipher text along with necessary fields required to decrypt it. + * This class will be used to return encrypted topic cipher text along with necessary fields + * required to decrypt it. * *Decryption of {@link EncryptedTopic#getEncryptedTopic()} should give json string for {@link
* Topic}. Example of decrypted json string: {@code { "taxonomy_version": 5, "model_version": 2, @@ -34,15 +35,17 @@ * Guide. */ @ExperimentalFeatures.Ext11OptIn -class EncryptedTopic public constructor( +class EncryptedTopic +public constructor( val encryptedTopic: ByteArray, val keyIdentifier: String, val encapsulatedKey: ByteArray ) { override fun toString(): String { - val encryptedTopicString = "EncryptedTopic=${encryptedTopic.decodeToString()}" + - ", KeyIdentifier=$keyIdentifier" + - ", EncapsulatedKey=${encapsulatedKey.decodeToString()} }" + val encryptedTopicString = + "EncryptedTopic=${encryptedTopic.decodeToString()}" + + ", KeyIdentifier=$keyIdentifier" + + ", EncapsulatedKey=${encapsulatedKey.decodeToString()} }" return "EncryptedTopic { $encryptedTopicString" }
diff --git a/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/topics/GetTopicsRequest.kt b/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/topics/GetTopicsRequest.kt index 6dede0c..9002a29 100644 --- a/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/topics/GetTopicsRequest.kt +++ b/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/topics/GetTopicsRequest.kt
@@ -17,19 +17,19 @@ package androidx.privacysandbox.ads.adservices.topics /** - * Represents the request for the getTopics API (which takes a [GetTopicsRequest] and - * returns a [GetTopicsResponse]. + * Represents the request for the getTopics API (which takes a [GetTopicsRequest] and returns a + * [GetTopicsResponse]. * * @param adsSdkName The Ads SDK name. This must be called by SDKs running outside of the Sandbox. - * Other clients must not call it. + * Other clients must not call it. * @param shouldRecordObservation whether to record that the caller has observed the topics of the - * host app or not. This will be used to determine if the caller can receive the topic - * in the next epoch. + * host app or not. This will be used to determine if the caller can receive the topic in the next + * epoch. */ -class GetTopicsRequest public constructor( +class GetTopicsRequest +public constructor( val adsSdkName: String = "", - @get:JvmName("shouldRecordObservation") - val shouldRecordObservation: Boolean = false + @get:JvmName("shouldRecordObservation") val shouldRecordObservation: Boolean = false ) { override fun toString(): String { return "GetTopicsRequest: " + @@ -49,9 +49,7 @@ return hash } - /** - * Builder for [GetTopicsRequest]. - */ + /** Builder for [GetTopicsRequest]. */ public class Builder() { private var adsSdkName: String = "" private var shouldRecordObservation: Boolean = true @@ -72,9 +70,9 @@ /** * Set the Record Observation. * - * @param shouldRecordObservation whether to record that the caller has observed the topics of the - * host app or not. This will be used to determine if the caller can receive the topic - * in the next epoch. + * @param shouldRecordObservation whether to record that the caller has observed the topics + * of the host app or not. This will be used to determine if the caller can receive the + * topic in the next epoch. */ @Suppress("MissingGetterMatchingBuilder") fun setShouldRecordObservation(shouldRecordObservation: Boolean): Builder = apply {
diff --git a/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/topics/GetTopicsRequestHelper.kt b/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/topics/GetTopicsRequestHelper.kt index d664159..a44b7ca 100644 --- a/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/topics/GetTopicsRequestHelper.kt +++ b/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/topics/GetTopicsRequestHelper.kt
@@ -22,16 +22,15 @@ import androidx.annotation.RequiresExtension import androidx.annotation.RestrictTo -/** - * Helper class to consolidate conversion logic for GetTopicsRequest. - */ +/** Helper class to consolidate conversion logic for GetTopicsRequest. */ @RestrictTo(RestrictTo.Scope.LIBRARY) @SuppressLint("ClassVerificationFailure") object GetTopicsRequestHelper { @RequiresExtension(extension = SdkExtensions.AD_SERVICES, version = 5) @RequiresExtension(extension = Build.VERSION_CODES.S, version = 9) - internal fun convertRequestWithRecordObservation(request: GetTopicsRequest): - android.adservices.topics.GetTopicsRequest { + internal fun convertRequestWithRecordObservation( + request: GetTopicsRequest + ): android.adservices.topics.GetTopicsRequest { return android.adservices.topics.GetTopicsRequest.Builder() .setAdsSdkName(request.adsSdkName) .setShouldRecordObservation(request.shouldRecordObservation) @@ -40,8 +39,9 @@ @RequiresExtension(extension = SdkExtensions.AD_SERVICES, version = 4) @RequiresExtension(extension = Build.VERSION_CODES.S, version = 9) - internal fun convertRequestWithoutRecordObservation(request: GetTopicsRequest): - android.adservices.topics.GetTopicsRequest { + internal fun convertRequestWithoutRecordObservation( + request: GetTopicsRequest + ): android.adservices.topics.GetTopicsRequest { return android.adservices.topics.GetTopicsRequest.Builder() .setAdsSdkName(request.adsSdkName) .build()
diff --git a/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/topics/GetTopicsResponse.kt b/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/topics/GetTopicsResponse.kt index dbfcf53..64dc2e9 100644 --- a/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/topics/GetTopicsResponse.kt +++ b/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/topics/GetTopicsResponse.kt
@@ -21,7 +21,9 @@ /** Represent the result from the getTopics API. */ @OptIn(ExperimentalFeatures.Ext11OptIn::class) -class GetTopicsResponse @ExperimentalFeatures.Ext11OptIn constructor( +class GetTopicsResponse [email protected] +constructor( val topics: List, val encryptedTopics: List, ) { @@ -30,8 +32,8 @@ override fun equals(other: Any?): Boolean { if (this === other) return true if (other !is GetTopicsResponse) return false - if (topics.size != other.topics.size || - encryptedTopics.size != other.encryptedTopics.size) return false + if (topics.size != other.topics.size || encryptedTopics.size != other.encryptedTopics.size) + return false return HashSet(this.topics) == HashSet(other.topics) && HashSet(this.encryptedTopics) == HashSet(other.encryptedTopics) }
diff --git a/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/topics/GetTopicsResponseHelper.kt b/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/topics/GetTopicsResponseHelper.kt index d22fa00..414c766 100644 --- a/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/topics/GetTopicsResponseHelper.kt +++ b/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/topics/GetTopicsResponseHelper.kt
@@ -23,9 +23,7 @@ import androidx.annotation.RestrictTo import androidx.privacysandbox.ads.adservices.common.ExperimentalFeatures -/** - * Helper class to consolidate conversion logic for GetTopicsResponse. - */ +/** Helper class to consolidate conversion logic for GetTopicsResponse. */ @RestrictTo(RestrictTo.Scope.LIBRARY) @SuppressLint("ClassVerificationFailure") object GetTopicsResponseHelper { @@ -33,7 +31,7 @@ @RequiresExtension(extension = Build.VERSION_CODES.S, version = 9) internal fun convertResponse( response: android.adservices.topics.GetTopicsResponse, - ): GetTopicsResponse { + ): GetTopicsResponse { val topics = mutableListOf() for (topic in response.topics) { topics.add(Topic(topic.taxonomyVersion, topic.modelVersion, topic.topicId)) @@ -46,7 +44,7 @@ @ExperimentalFeatures.Ext11OptIn internal fun convertResponseWithEncryptedTopics( response: android.adservices.topics.GetTopicsResponse, - ): GetTopicsResponse { + ): GetTopicsResponse { val topics = mutableListOf() for (topic in response.topics) { topics.add(Topic(topic.taxonomyVersion, topic.modelVersion, topic.topicId))
diff --git a/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/topics/Topic.kt b/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/topics/Topic.kt index 30958de..4451611 100644 --- a/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/topics/Topic.kt +++ b/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/topics/Topic.kt
@@ -21,18 +21,16 @@ * * @param taxonomyVersion the version of the taxonomy. * @param modelVersion the version of the model. - * @param topicId the unique id of a topic. - * See https://developer.android.com/design-for-safety/privacy-sandbox/guides/topics for details. + * @param topicId the unique id of a topic. See + * https://developer.android.com/design-for-safety/privacy-sandbox/guides/topics for details. */ -class Topic public constructor( - val taxonomyVersion: Long, - val modelVersion: Long, - val topicId: Int -) { +class Topic +public constructor(val taxonomyVersion: Long, val modelVersion: Long, val topicId: Int) { override fun toString(): String { - val taxonomyVersionString = "TaxonomyVersion=$taxonomyVersion" + - ", ModelVersion=$modelVersion" + - ", TopicCode=$topicId }" + val taxonomyVersionString = + "TaxonomyVersion=$taxonomyVersion" + + ", ModelVersion=$modelVersion" + + ", TopicCode=$topicId }" return "Topic { $taxonomyVersionString" }
diff --git a/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/topics/TopicsManager.kt b/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/topics/TopicsManager.kt index a114dfe..a1bbde3 100644 --- a/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/topics/TopicsManager.kt +++ b/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/topics/TopicsManager.kt
@@ -33,20 +33,20 @@ * Return the topics. * * @param request The GetTopicsRequest for obtaining Topics. + * @return GetTopicsResponse * @throws SecurityException if caller is not authorized to call this API. * @throws IllegalStateException if this API is not available. * @throws LimitExceededException if rate limit was reached. - * @return GetTopicsResponse */ @RequiresPermission(AdServicesPermissions.ACCESS_ADSERVICES_TOPICS) abstract suspend fun getTopics(request: GetTopicsRequest): GetTopicsResponse companion object { /** - * Creates [TopicsManager]. + * Creates [TopicsManager]. * - * @return TopicsManagerCompat object. If the device is running an incompatible - * build, the value returned is null. + * @return TopicsManagerCompat object. If the device is running an incompatible build, the + * value returned is null. */ @JvmStatic @SuppressLint("NewApi", "ClassVerificationFailure")
diff --git a/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/topics/TopicsManagerApi31Ext11Impl.kt b/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/topics/TopicsManagerApi31Ext11Impl.kt index b6473f2..6352492 100644 --- a/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/topics/TopicsManagerApi31Ext11Impl.kt +++ b/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/topics/TopicsManagerApi31Ext11Impl.kt
@@ -26,9 +26,10 @@ @RestrictTo(RestrictTo.Scope.LIBRARY) @SuppressLint("NewApi", "ClassVerificationFailure") @RequiresExtension(extension = Build.VERSION_CODES.S, version = 11) -class TopicsManagerApi31Ext11Impl(context: Context) : TopicsManagerImplCommon( - android.adservices.topics.TopicsManager.get(context), -) { +class TopicsManagerApi31Ext11Impl(context: Context) : + TopicsManagerImplCommon( + android.adservices.topics.TopicsManager.get(context), + ) { override fun convertRequest( request: GetTopicsRequest ): android.adservices.topics.GetTopicsRequest {
diff --git a/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/topics/TopicsManagerApi31Ext9Impl.kt b/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/topics/TopicsManagerApi31Ext9Impl.kt index d4fbe99..cc73c22 100644 --- a/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/topics/TopicsManagerApi31Ext9Impl.kt +++ b/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/topics/TopicsManagerApi31Ext9Impl.kt
@@ -25,11 +25,13 @@ @RestrictTo(RestrictTo.Scope.LIBRARY) @SuppressLint("NewApi", "ClassVerificationFailure") @RequiresExtension(extension = Build.VERSION_CODES.S, version = 9) -class TopicsManagerApi31Ext9Impl(context: Context) : TopicsManagerImplCommon( - android.adservices.topics.TopicsManager.get(context), -) { - override fun convertRequest(request: GetTopicsRequest): - android.adservices.topics.GetTopicsRequest { +class TopicsManagerApi31Ext9Impl(context: Context) : + TopicsManagerImplCommon( + android.adservices.topics.TopicsManager.get(context), + ) { + override fun convertRequest( + request: GetTopicsRequest + ): android.adservices.topics.GetTopicsRequest { return GetTopicsRequestHelper.convertRequestWithRecordObservation(request) } }
diff --git a/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/topics/TopicsManagerApi33Ext11Impl.kt b/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/topics/TopicsManagerApi33Ext11Impl.kt index c5f2524..936ea08 100644 --- a/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/topics/TopicsManagerApi33Ext11Impl.kt +++ b/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/topics/TopicsManagerApi33Ext11Impl.kt
@@ -26,9 +26,10 @@ @RestrictTo(RestrictTo.Scope.LIBRARY) @SuppressLint("NewApi", "ClassVerificationFailure") @RequiresExtension(extension = SdkExtensions.AD_SERVICES, version = 11) -class TopicsManagerApi33Ext11Impl(context: Context) : TopicsManagerImplCommon( - context.getSystemService(android.adservices.topics.TopicsManager::class.java) -) { +class TopicsManagerApi33Ext11Impl(context: Context) : + TopicsManagerImplCommon( + context.getSystemService(android.adservices.topics.TopicsManager::class.java) + ) { override fun convertRequest( request: GetTopicsRequest
diff --git a/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/topics/TopicsManagerApi33Ext4Impl.kt b/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/topics/TopicsManagerApi33Ext4Impl.kt index 4820da3..55e576b 100644 --- a/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/topics/TopicsManagerApi33Ext4Impl.kt +++ b/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/topics/TopicsManagerApi33Ext4Impl.kt
@@ -25,5 +25,7 @@ @RestrictTo(RestrictTo.Scope.LIBRARY) @SuppressLint("NewApi", "ClassVerificationFailure") @RequiresExtension(extension = SdkExtensions.AD_SERVICES, version = 4) -class TopicsManagerApi33Ext4Impl(context: Context) : TopicsManagerImplCommon( - context.getSystemService(android.adservices.topics.TopicsManager::class.java)) +class TopicsManagerApi33Ext4Impl(context: Context) : + TopicsManagerImplCommon( + context.getSystemService(android.adservices.topics.TopicsManager::class.java) + )
diff --git a/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/topics/TopicsManagerApi33Ext5Impl.kt b/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/topics/TopicsManagerApi33Ext5Impl.kt index 4679954..4867b7f 100644 --- a/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/topics/TopicsManagerApi33Ext5Impl.kt +++ b/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/topics/TopicsManagerApi33Ext5Impl.kt
@@ -25,11 +25,13 @@ @RestrictTo(RestrictTo.Scope.LIBRARY) @SuppressLint("NewApi", "ClassVerificationFailure") @RequiresExtension(extension = SdkExtensions.AD_SERVICES, version = 5) -class TopicsManagerApi33Ext5Impl(context: Context) : TopicsManagerImplCommon( - context.getSystemService(android.adservices.topics.TopicsManager::class.java), -) { - override fun convertRequest(request: GetTopicsRequest): - android.adservices.topics.GetTopicsRequest { +class TopicsManagerApi33Ext5Impl(context: Context) : + TopicsManagerImplCommon( + context.getSystemService(android.adservices.topics.TopicsManager::class.java), + ) { + override fun convertRequest( + request: GetTopicsRequest + ): android.adservices.topics.GetTopicsRequest { return GetTopicsRequestHelper.convertRequestWithRecordObservation(request) } }
diff --git a/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/topics/TopicsManagerImplCommon.kt b/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/topics/TopicsManagerImplCommon.kt index 1c46ec7..1aeddab 100644 --- a/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/topics/TopicsManagerImplCommon.kt +++ b/privacysandbox/ads/ads-adservices/src/main/java/androidx/privacysandbox/ads/adservices/topics/TopicsManagerImplCommon.kt
@@ -43,13 +43,8 @@ @RequiresPermission(AdServicesPermissions.ACCESS_ADSERVICES_TOPICS) private suspend fun getTopicsAsyncInternal( getTopicsRequest: android.adservices.topics.GetTopicsRequest - ): android.adservices.topics.GetTopicsResponse = suspendCancellableCoroutine { continuation - -> - mTopicsManager.getTopics( - getTopicsRequest, - Runnable::run, - continuation.asOutcomeReceiver() - ) + ): android.adservices.topics.GetTopicsResponse = suspendCancellableCoroutine { continuation -> + mTopicsManager.getTopics(getTopicsRequest, Runnable::run, continuation.asOutcomeReceiver()) } internal open fun convertRequest(
diff --git a/privacysandbox/plugins/plugins-privacysandbox-library/src/main/java/androidx/privacysandboxlibraryplugin/AidlExecutableInputs.kt b/privacysandbox/plugins/plugins-privacysandbox-library/src/main/java/androidx/privacysandboxlibraryplugin/AidlExecutableInputs.kt index 851177f..08e4c3e 100644 --- a/privacysandbox/plugins/plugins-privacysandbox-library/src/main/java/androidx/privacysandboxlibraryplugin/AidlExecutableInputs.kt +++ b/privacysandbox/plugins/plugins-privacysandbox-library/src/main/java/androidx/privacysandboxlibraryplugin/AidlExecutableInputs.kt
@@ -25,12 +25,10 @@ internal abstract class AidlExecutableInputs : CommandLineArgumentProvider { - @get:Internal - abstract val aidl: RegularFileProperty + @get:Internal abstract val aidl: RegularFileProperty // Use the version of the build tools as the input to allow caching across platforms - @get:Input - abstract val buildToolsVersion: Property+ @get:Input abstract val buildToolsVersion: Property override fun asArguments(): Iterable { val aidlExecutable = aidl.get().asFile @@ -38,8 +36,6 @@ if (!aidlExecutable.exists()) { throw FileNotFoundException("Aidl executable not found at $aidlExecutablePath") } - return listOf( - "aidl_compiler_path=$aidlExecutablePath" - ) + return listOf("aidl_compiler_path=$aidlExecutablePath") } }
diff --git a/privacysandbox/plugins/plugins-privacysandbox-library/src/main/java/androidx/privacysandboxlibraryplugin/FrameworkAidlInputs.kt b/privacysandbox/plugins/plugins-privacysandbox-library/src/main/java/androidx/privacysandboxlibraryplugin/FrameworkAidlInputs.kt index bb41498..9f65c91 100644 --- a/privacysandbox/plugins/plugins-privacysandbox-library/src/main/java/androidx/privacysandboxlibraryplugin/FrameworkAidlInputs.kt +++ b/privacysandbox/plugins/plugins-privacysandbox-library/src/main/java/androidx/privacysandboxlibraryplugin/FrameworkAidlInputs.kt
@@ -25,11 +25,9 @@ internal abstract class FrameworkAidlInputs : CommandLineArgumentProvider { - @get:Internal - abstract val frameworkAidl: RegularFileProperty + @get:Internal abstract val frameworkAidl: RegularFileProperty - @get:Input - abstract val platformSdk: Property+ @get:Input abstract val platformSdk: Property override fun asArguments(): Iterable { val frameworkAidlFile = frameworkAidl.get().asFile
diff --git a/privacysandbox/plugins/plugins-privacysandbox-library/src/main/java/androidx/privacysandboxlibraryplugin/PrivacySandboxLibraryPlugin.kt b/privacysandbox/plugins/plugins-privacysandbox-library/src/main/java/androidx/privacysandboxlibraryplugin/PrivacySandboxLibraryPlugin.kt index 7d62c28..aafd90b 100644 --- a/privacysandbox/plugins/plugins-privacysandbox-library/src/main/java/androidx/privacysandboxlibraryplugin/PrivacySandboxLibraryPlugin.kt +++ b/privacysandbox/plugins/plugins-privacysandbox-library/src/main/java/androidx/privacysandboxlibraryplugin/PrivacySandboxLibraryPlugin.kt
@@ -25,10 +25,10 @@ import org.gradle.kotlin.dsl.dependencies /* -* For modules that are used by a privacy sandbox sdk module using Androidx, we need to configure -* KSP code generation. This plugin intends to apply KSP with the required dependencies and arguments -* such as the AIDL compiler path. -*/ + * For modules that are used by a privacy sandbox sdk module using Androidx, we need to configure + * KSP code generation. This plugin intends to apply KSP with the required dependencies and arguments + * such as the AIDL compiler path. + */ abstract class PrivacySandboxLibraryPlugin : Plugin{ override fun apply(project: Project) { @@ -56,20 +56,24 @@ } ) frameworkAidlInputs.platformSdk.set( - frameworkAidlInputs.frameworkAidl.map { it.asFile.parentFile.absolutePath }) - val aidlFile = sdkDirectory.map { - it.dir("build-tools").dir(libraryExtension.buildToolsVersion) - .file( - if (System.getProperty("os.name").startsWith("Windows")) { - "aidl.exe" - } else { - "aidl" - } - ) - } + frameworkAidlInputs.frameworkAidl.map { it.asFile.parentFile.absolutePath } + ) + val aidlFile = + sdkDirectory.map { + it.dir("build-tools") + .dir(libraryExtension.buildToolsVersion) + .file( + if (System.getProperty("os.name").startsWith("Windows")) { + "aidl.exe" + } else { + "aidl" + } + ) + } aidlExecutableInputs.aidl.set(aidlFile) aidlExecutableInputs.buildToolsVersion.set( - aidlExecutableInputs.aidl.map { it.asFile.parentFile.name }) + aidlExecutableInputs.aidl.map { it.asFile.parentFile.name } + ) val kspExtension = project.extensions.getByType(KspExtension::class.java) kspExtension.arg(aidlExecutableInputs) kspExtension.arg(frameworkAidlInputs) @@ -80,18 +84,9 @@ val toolsVersion = "1.0.0-alpha08" val sdkRuntimeVersion = "1.0.0-alpha13" project.dependencies { - add( - "ksp", - "androidx.privacysandbox.tools:tools-apicompiler:$toolsVersion" - ) - add( - "implementation", - "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.1" - ) - add( - "implementation", - "androidx.privacysandbox.tools:tools:$toolsVersion" - ) + add("ksp", "androidx.privacysandbox.tools:tools-apicompiler:$toolsVersion") + add("implementation", "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.1") + add("implementation", "androidx.privacysandbox.tools:tools:$toolsVersion") add( "implementation", "androidx.privacysandbox.sdkruntime:sdkruntime-core:$sdkRuntimeVersion"
diff --git a/privacysandbox/plugins/plugins-privacysandbox-library/src/test/java/androidx/privacysandboxlibraryplugin/PrivacySandboxLibraryPluginTest.kt b/privacysandbox/plugins/plugins-privacysandbox-library/src/test/java/androidx/privacysandboxlibraryplugin/PrivacySandboxLibraryPluginTest.kt index b616b20..df81875 100644 --- a/privacysandbox/plugins/plugins-privacysandbox-library/src/test/java/androidx/privacysandboxlibraryplugin/PrivacySandboxLibraryPluginTest.kt +++ b/privacysandbox/plugins/plugins-privacysandbox-library/src/test/java/androidx/privacysandboxlibraryplugin/PrivacySandboxLibraryPluginTest.kt
@@ -32,8 +32,7 @@ @RunWith(JUnit4::class) class PrivacySandboxLibraryPluginTest { - @get:Rule - val projectSetup = ProjectSetupRule() + @get:Rule val projectSetup = ProjectSetupRule() lateinit var gradleRunner: GradleRunner @@ -42,13 +41,16 @@ File(projectSetup.rootDir, "settings.gradle") .writeText("rootProject.name = \"test-privacysandbox-library\"") projectSetup.writeDefaultBuildGradle( - prefix = """ + prefix = + """ plugins { id("kotlin-android") id("androidx.privacysandbox.library") } - """.trimIndent(), - suffix = """ + """ + .trimIndent(), + suffix = + """ android { namespace "test.privacysandboxlibrary" compileOptions { @@ -62,10 +64,10 @@ """ ) - val myServiceSource = File( - projectSetup.rootDir, - "src/main/java/test/privacysandboxlibraryplugintest" - ).also { it.mkdirs() } + val myServiceSource = + File(projectSetup.rootDir, "src/main/java/test/privacysandboxlibraryplugintest").also { + it.mkdirs() + } myServiceSource.resolve("MyService.kt").also { Files.createFile(it.toPath()) @@ -82,14 +84,13 @@ ) } - gradleRunner = GradleRunner.create() - .withProjectDir(projectSetup.rootDir) - .withPluginClasspath() + gradleRunner = + GradleRunner.create().withProjectDir(projectSetup.rootDir).withPluginClasspath() } /* Test plugin applies successfully and produces KSP generated directory. The output of KSP - * is unit tested in :tools:apicompiler and integration tested in Android Gradle Plugin tests. - */ + * is unit tested in :tools:apicompiler and integration tested in Android Gradle Plugin tests. + */ @Test fun applyPlugin() { val output = gradleRunner.withArguments("build", "--stacktrace").build()
diff --git a/privacysandbox/sdkruntime/integration-tests/testapp/src/androidTest/java/androidx/privacysandbox/sdkruntime/integration/testapp/SimpleTest.kt b/privacysandbox/sdkruntime/integration-tests/testapp/src/androidTest/java/androidx/privacysandbox/sdkruntime/integration/testapp/SimpleTest.kt index 1129c85..4f04fc8 100644 --- a/privacysandbox/sdkruntime/integration-tests/testapp/src/androidTest/java/androidx/privacysandbox/sdkruntime/integration/testapp/SimpleTest.kt +++ b/privacysandbox/sdkruntime/integration-tests/testapp/src/androidTest/java/androidx/privacysandbox/sdkruntime/integration/testapp/SimpleTest.kt
@@ -36,24 +36,16 @@ fun setUp() { // TODO (b/305232796): Replace with tradefed preparer in config or rule val uiAutomation = InstrumentationRegistry.getInstrumentation().getUiAutomation() - uiAutomation.executeShellCommand( - "cmd sdk_sandbox set-state --enabled" - ) - uiAutomation.executeShellCommand( - "device_config set_sync_disabled_for_tests persistent" - ) + uiAutomation.executeShellCommand("cmd sdk_sandbox set-state --enabled") + uiAutomation.executeShellCommand("device_config set_sync_disabled_for_tests persistent") } @After fun tearDown() { // TODO (b/305232796): Replace with tradefed preparer in config or rule val uiAutomation = InstrumentationRegistry.getInstrumentation().getUiAutomation() - uiAutomation.executeShellCommand( - "device_config set_sync_disabled_for_tests none" - ) - uiAutomation.executeShellCommand( - "cmd sdk_sandbox set-state --reset" - ) + uiAutomation.executeShellCommand("device_config set_sync_disabled_for_tests none") + uiAutomation.executeShellCommand("cmd sdk_sandbox set-state --reset") } @Test
diff --git a/privacysandbox/sdkruntime/integration-tests/testapp/src/main/java/androidx/privacysandbox/sdkruntime/integration/testapp/TestMainActivity.kt b/privacysandbox/sdkruntime/integration-tests/testapp/src/main/java/androidx/privacysandbox/sdkruntime/integration/testapp/TestMainActivity.kt index e6956c6..1459e53 100644 --- a/privacysandbox/sdkruntime/integration-tests/testapp/src/main/java/androidx/privacysandbox/sdkruntime/integration/testapp/TestMainActivity.kt +++ b/privacysandbox/sdkruntime/integration-tests/testapp/src/main/java/androidx/privacysandbox/sdkruntime/integration/testapp/TestMainActivity.kt
@@ -50,8 +50,11 @@ onLoadedSdk(loadedSdk) } catch (e: LoadSdkCompatException) { Log.i( - TAG, "loadSdk failed with errorCode: " + e.loadSdkErrorCode + - " and errorMsg: " + e.message + TAG, + "loadSdk failed with errorCode: " + + e.loadSdkErrorCode + + " and errorMsg: " + + e.message ) } } @@ -72,9 +75,7 @@ companion object { private const val TAG = "TestMainActivity" - /** - * Name of the SDK to be loaded. - */ + /** Name of the SDK to be loaded. */ private const val SDK_NAME = "androidx.privacysandbox.sdkruntime.integrationtest.sdk" } }
diff --git a/privacysandbox/sdkruntime/sdkruntime-client/src/androidTest/java/androidx/privacysandbox/sdkruntime/client/EmptyActivity.kt b/privacysandbox/sdkruntime/sdkruntime-client/src/androidTest/java/androidx/privacysandbox/sdkruntime/client/EmptyActivity.kt index 1dfed64..037ba92 100644 --- a/privacysandbox/sdkruntime/sdkruntime-client/src/androidTest/java/androidx/privacysandbox/sdkruntime/client/EmptyActivity.kt +++ b/privacysandbox/sdkruntime/sdkruntime-client/src/androidTest/java/androidx/privacysandbox/sdkruntime/client/EmptyActivity.kt
@@ -19,8 +19,8 @@ import androidx.activity.ComponentActivity /** - * Activity for components tests. - * [androidx.privacysandbox.sdkruntime.client.activity.SdkActivity] can't be used for most tests as - * it will be moved to finished state during creation when no valid token provided. + * Activity for components tests. [androidx.privacysandbox.sdkruntime.client.activity.SdkActivity] + * can't be used for most tests as it will be moved to finished state during creation when no valid + * token provided. */ class EmptyActivity : ComponentActivity()
diff --git a/privacysandbox/sdkruntime/sdkruntime-client/src/androidTest/java/androidx/privacysandbox/sdkruntime/client/SdkSandboxManagerAppOwnedInterfacesTest.kt b/privacysandbox/sdkruntime/sdkruntime-client/src/androidTest/java/androidx/privacysandbox/sdkruntime/client/SdkSandboxManagerAppOwnedInterfacesTest.kt index a29c74b..7e5fdc6 100644 --- a/privacysandbox/sdkruntime/sdkruntime-client/src/androidTest/java/androidx/privacysandbox/sdkruntime/client/SdkSandboxManagerAppOwnedInterfacesTest.kt +++ b/privacysandbox/sdkruntime/sdkruntime-client/src/androidTest/java/androidx/privacysandbox/sdkruntime/client/SdkSandboxManagerAppOwnedInterfacesTest.kt
@@ -43,8 +43,8 @@ import org.junit.runner.RunWith /** - * Tests related to AppOwnedInterfaces support in SdkSandboxManagerCompat. - * Later most of them will be extracted to E2E test with separate test app/sdk. + * Tests related to AppOwnedInterfaces support in SdkSandboxManagerCompat. Later most of them will + * be extracted to E2E test with separate test app/sdk. */ @SmallTest @RunWith(AndroidJUnit4::class) @@ -71,11 +71,8 @@ @Test fun registerAppOwnedSdkSandboxInterfaceTest() { - val appOwnedInterface = AppOwnedSdkSandboxInterfaceCompat( - name = "TestSDK", - version = 1, - binder = Binder() - ) + val appOwnedInterface = + AppOwnedSdkSandboxInterfaceCompat(name = "TestSDK", version = 1, binder = Binder()) sandboxManagerCompat.registerAppOwnedSdkSandboxInterface(appOwnedInterface) @@ -98,11 +95,8 @@ isAppOwnedInterfacesApiAvailable() ) - val appOwnedInterface = AppOwnedSdkSandboxInterfaceCompat( - name = "TestSDK", - version = 1, - binder = Binder() - ) + val appOwnedInterface = + AppOwnedSdkSandboxInterfaceCompat(name = "TestSDK", version = 1, binder = Binder()) sandboxManagerCompat.registerAppOwnedSdkSandboxInterface(appOwnedInterface) val platformRegisteredInterfaces = getRegisteredInterfaces(context) @@ -112,11 +106,8 @@ @Test fun unregisterAppOwnedSdkSandboxInterfaceTest() { - val appOwnedInterface = AppOwnedSdkSandboxInterfaceCompat( - name = "TestSDK", - version = 1, - binder = Binder() - ) + val appOwnedInterface = + AppOwnedSdkSandboxInterfaceCompat(name = "TestSDK", version = 1, binder = Binder()) sandboxManagerCompat.registerAppOwnedSdkSandboxInterface(appOwnedInterface) sandboxManagerCompat.unregisterAppOwnedSdkSandboxInterface(appOwnedInterface.getName()) @@ -135,11 +126,8 @@ isAppOwnedInterfacesApiAvailable() ) - val appOwnedInterface = AppOwnedSdkSandboxInterfaceCompat( - name = "TestSDK", - version = 1, - binder = Binder() - ) + val appOwnedInterface = + AppOwnedSdkSandboxInterfaceCompat(name = "TestSDK", version = 1, binder = Binder()) sandboxManagerCompat.registerAppOwnedSdkSandboxInterface(appOwnedInterface) sandboxManagerCompat.unregisterAppOwnedSdkSandboxInterface(appOwnedInterface.getName()) @@ -151,17 +139,11 @@ @Test fun sdkController_getAppOwnedSdkSandboxInterfaces_returnsRegisteredAppOwnedInterfaces() { val localSdk = runBlocking { - sandboxManagerCompat.loadSdk( - TestSdkConfigs.forSdkName("v4").packageName, - Bundle() - ) + sandboxManagerCompat.loadSdk(TestSdkConfigs.forSdkName("v4").packageName, Bundle()) } - val registeredAppOwnedSdk = AppOwnedSdkSandboxInterfaceCompat( - name = "TestSDK", - version = 1, - binder = Binder() - ) + val registeredAppOwnedSdk = + AppOwnedSdkSandboxInterfaceCompat(name = "TestSDK", version = 1, binder = Binder()) sandboxManagerCompat.registerAppOwnedSdkSandboxInterface(registeredAppOwnedSdk) val testSdk = localSdk.asTestSdk() @@ -178,9 +160,7 @@ @RequiresExtension(extension = SdkExtensions.AD_SERVICES, version = 8) companion object AppOwnedInterfacesApi { // to avoid class verification fails @DoNotInline - fun getRegisteredInterfaces( - context: Context - ): List{ + fun getRegisteredInterfaces(context: Context): List{ val sandboxManager = context.getSystemService()!! val results = sandboxManager.getAppOwnedSdkSandboxInterfaces() return results.map { AppOwnedSdkSandboxInterfaceCompat(it) }
diff --git a/privacysandbox/sdkruntime/sdkruntime-client/src/androidTest/java/androidx/privacysandbox/sdkruntime/client/SdkSandboxManagerCompatSandboxedTest.kt b/privacysandbox/sdkruntime/sdkruntime-client/src/androidTest/java/androidx/privacysandbox/sdkruntime/client/SdkSandboxManagerCompatSandboxedTest.kt index 1d50290..6d17076 100644 --- a/privacysandbox/sdkruntime/sdkruntime-client/src/androidTest/java/androidx/privacysandbox/sdkruntime/client/SdkSandboxManagerCompatSandboxedTest.kt +++ b/privacysandbox/sdkruntime/sdkruntime-client/src/androidTest/java/androidx/privacysandbox/sdkruntime/client/SdkSandboxManagerCompatSandboxedTest.kt
@@ -76,16 +76,9 @@ val sdkName = "test" val params = Bundle() - runBlocking { - managerCompat.loadSdk(sdkName, params) - } + runBlocking { managerCompat.loadSdk(sdkName, params) } - verify(sdkSandboxManager).loadSdk( - eq(sdkName), - eq(params), - any(), - any() - ) + verify(sdkSandboxManager).loadSdk(eq(sdkName), eq(params), any(), any()) } @Test @@ -97,9 +90,7 @@ val managerCompat = SdkSandboxManagerCompat.from(mContext) - val result = runBlocking { - managerCompat.loadSdk("test", Bundle()) - } + val result = runBlocking { managerCompat.loadSdk("test", Bundle()) } assertThat(result.getInterface()).isEqualTo(sandboxedSdk.getInterface()) } @@ -108,19 +99,15 @@ fun loadSdk_whenNoLocalSdkExistsAndSandboxAvailable_rethrowsExceptionFromPlatformLoadSdk() { val sdkSandboxManager = mockSandboxManager(mContext) - val loadSdkException = LoadSdkException( - RuntimeException(), - Bundle() - ) + val loadSdkException = LoadSdkException(RuntimeException(), Bundle()) setupLoadSdkAnswer(sdkSandboxManager, loadSdkException) val managerCompat = SdkSandboxManagerCompat.from(mContext) - val result = assertThrows(LoadSdkCompatException::class.java) { - runBlocking { - managerCompat.loadSdk("test", Bundle()) + val result = + assertThrows(LoadSdkCompatException::class.java) { + runBlocking { managerCompat.loadSdk("test", Bundle()) } } - } assertThat(result.cause).isEqualTo(loadSdkException.cause) assertThat(result.extraInformation).isEqualTo(loadSdkException.extraInformation) @@ -136,9 +123,7 @@ managerCompat.unloadSdk(sdkName) - verify(sdkSandboxManager).unloadSdk( - eq(sdkName) - ) + verify(sdkSandboxManager).unloadSdk(eq(sdkName)) } @Test @@ -149,11 +134,9 @@ val callback = mock(SdkSandboxProcessDeathCallbackCompat::class.java) managerCompat.addSdkSandboxProcessDeathCallback(Runnable::run, callback) - val argumentCaptor = ArgumentCaptor.forClass( - SdkSandboxManager.SdkSandboxProcessDeathCallback::class.java - ) - verify(sdkSandboxManager) - .addSdkSandboxProcessDeathCallback(any(), argumentCaptor.capture()) + val argumentCaptor = + ArgumentCaptor.forClass(SdkSandboxManager.SdkSandboxProcessDeathCallback::class.java) + verify(sdkSandboxManager).addSdkSandboxProcessDeathCallback(any(), argumentCaptor.capture()) val platformCallback = argumentCaptor.value platformCallback.onSdkSandboxDied() @@ -180,17 +163,15 @@ val callback = mock(SdkSandboxProcessDeathCallbackCompat::class.java) managerCompat.addSdkSandboxProcessDeathCallback(Runnable::run, callback) - val addArgumentCaptor = ArgumentCaptor.forClass( - SdkSandboxManager.SdkSandboxProcessDeathCallback::class.java - ) + val addArgumentCaptor = + ArgumentCaptor.forClass(SdkSandboxManager.SdkSandboxProcessDeathCallback::class.java) verify(sdkSandboxManager) .addSdkSandboxProcessDeathCallback(any(), addArgumentCaptor.capture()) val addedPlatformCallback = addArgumentCaptor.value managerCompat.removeSdkSandboxProcessDeathCallback(callback) - val removeArgumentCaptor = ArgumentCaptor.forClass( - SdkSandboxManager.SdkSandboxProcessDeathCallback::class.java - ) + val removeArgumentCaptor = + ArgumentCaptor.forClass(SdkSandboxManager.SdkSandboxProcessDeathCallback::class.java) verify(sdkSandboxManager) .removeSdkSandboxProcessDeathCallback(removeArgumentCaptor.capture()) val removedPlatformCallback = removeArgumentCaptor.value @@ -206,44 +187,33 @@ val callback = mock(SdkSandboxProcessDeathCallbackCompat::class.java) managerCompat.removeSdkSandboxProcessDeathCallback(callback) - verify(sdkSandboxManager, never()) - .removeSdkSandboxProcessDeathCallback(any()) + verify(sdkSandboxManager, never()).removeSdkSandboxProcessDeathCallback(any()) } @Test fun getSandboxedSdks_whenSandboxAvailable_returnCombinedLocalAndPlatformResult() { val sdkSandboxManager = mockSandboxManager(mContext) val sandboxedSdk = SandboxedSdk(Binder()) - `when`(sdkSandboxManager.sandboxedSdks) - .thenReturn(listOf(sandboxedSdk)) + `when`(sdkSandboxManager.sandboxedSdks).thenReturn(listOf(sandboxedSdk)) val managerCompat = SdkSandboxManagerCompat.from(mContext) val localSdk = runBlocking { - managerCompat.loadSdk( - TestSdkConfigs.CURRENT.packageName, - Bundle() - ) + managerCompat.loadSdk(TestSdkConfigs.CURRENT.packageName, Bundle()) } val result = managerCompat.getSandboxedSdks().map { it.getInterface() } - assertThat(result).containsExactly( - sandboxedSdk.getInterface(), localSdk.getInterface() - ) + assertThat(result).containsExactly(sandboxedSdk.getInterface(), localSdk.getInterface()) } @Test fun sdkController_getSandboxedSdks_dontIncludeSandboxedSdk() { val sdkSandboxManager = mockSandboxManager(mContext) val sandboxedSdk = SandboxedSdk(Binder()) - `when`(sdkSandboxManager.sandboxedSdks) - .thenReturn(listOf(sandboxedSdk)) + `when`(sdkSandboxManager.sandboxedSdks).thenReturn(listOf(sandboxedSdk)) val managerCompat = SdkSandboxManagerCompat.from(mContext) val localSdk = runBlocking { - managerCompat.loadSdk( - TestSdkConfigs.forSdkName("v2").packageName, - Bundle() - ) + managerCompat.loadSdk(TestSdkConfigs.forSdkName("v2").packageName, Bundle()) } val testSdk = localSdk.asTestSdk() @@ -271,13 +241,7 @@ receiver.onResult(sandboxedSdk) null } - doAnswer(answer) - .`when`(sdkSandboxManager).loadSdk( - any(), - any(), - any(), - any() - ) + doAnswer(answer).`when`(sdkSandboxManager).loadSdk(any(), any(), any(), any()) } private fun setupLoadSdkAnswer( @@ -289,12 +253,6 @@ receiver.onError(loadSdkException) null } - doAnswer(answer) - .`when`(sdkSandboxManager).loadSdk( - any(), - any(), - any(), - any() - ) + doAnswer(answer).`when`(sdkSandboxManager).loadSdk(any(), any(), any(), any()) } }
diff --git a/privacysandbox/sdkruntime/sdkruntime-client/src/androidTest/java/androidx/privacysandbox/sdkruntime/client/SdkSandboxManagerCompatTest.kt b/privacysandbox/sdkruntime/sdkruntime-client/src/androidTest/java/androidx/privacysandbox/sdkruntime/client/SdkSandboxManagerCompatTest.kt index 9ddb9e0..0416f3c 100644 --- a/privacysandbox/sdkruntime/sdkruntime-client/src/androidTest/java/androidx/privacysandbox/sdkruntime/client/SdkSandboxManagerCompatTest.kt +++ b/privacysandbox/sdkruntime/sdkruntime-client/src/androidTest/java/androidx/privacysandbox/sdkruntime/client/SdkSandboxManagerCompatTest.kt
@@ -77,14 +77,12 @@ val context = ApplicationProvider.getApplicationContext() val managerCompat = SdkSandboxManagerCompat.from(context) - val result = assertThrows(LoadSdkCompatException::class.java) { - runBlocking { - managerCompat.loadSdk("sdk-not-exists", Bundle()) + val result = + assertThrows(LoadSdkCompatException::class.java) { + runBlocking { managerCompat.loadSdk("sdk-not-exists", Bundle()) } } - } - assertThat(result.loadSdkErrorCode) - .isEqualTo(LoadSdkCompatException.LOAD_SDK_NOT_FOUND) + assertThat(result.loadSdkErrorCode).isEqualTo(LoadSdkCompatException.LOAD_SDK_NOT_FOUND) } @Test @@ -93,22 +91,14 @@ val managerCompat = SdkSandboxManagerCompat.from(context) val result = runBlocking { - managerCompat.loadSdk( - TestSdkConfigs.CURRENT.packageName, - Bundle() - ) + managerCompat.loadSdk(TestSdkConfigs.CURRENT.packageName, Bundle()) } assertThat(result.getInterface()!!.javaClass.classLoader) .isNotSameInstanceAs(managerCompat.javaClass.classLoader) assertThat(result.getSdkInfo()) - .isEqualTo( - SandboxedSdkInfo( - name = TestSdkConfigs.CURRENT.packageName, - version = 42 - ) - ) + .isEqualTo(SandboxedSdkInfo(name = TestSdkConfigs.CURRENT.packageName, version = 42)) } @Test @@ -119,14 +109,10 @@ val params = Bundle() params.putBoolean("needFail", true) - val result = assertThrows(LoadSdkCompatException::class.java) { - runBlocking { - managerCompat.loadSdk( - TestSdkConfigs.CURRENT.packageName, - params - ) + val result = + assertThrows(LoadSdkCompatException::class.java) { + runBlocking { managerCompat.loadSdk(TestSdkConfigs.CURRENT.packageName, params) } } - } assertThat(result.extraInformation).isEqualTo(params) assertThat(result.loadSdkErrorCode).isEqualTo(LOAD_SDK_SDK_DEFINED_ERROR) @@ -147,13 +133,10 @@ val sdkName = TestSdkConfigs.CURRENT.packageName - runBlocking { - managerCompat.loadSdk(sdkName, Bundle()) - } + runBlocking { managerCompat.loadSdk(sdkName, Bundle()) } managerCompat.unloadSdk(sdkName) - assertThat(managerCompat.getSandboxedSdks()) - .isEmpty() + assertThat(managerCompat.getSandboxedSdks()).isEmpty() } @Test @@ -162,11 +145,12 @@ val context = ApplicationProvider.getApplicationContext() val managerCompat = SdkSandboxManagerCompat.from(context) - managerCompat.addSdkSandboxProcessDeathCallback(Runnable::run, object : - SdkSandboxProcessDeathCallbackCompat { - override fun onSdkSandboxDied() { + managerCompat.addSdkSandboxProcessDeathCallback( + Runnable::run, + object : SdkSandboxProcessDeathCallbackCompat { + override fun onSdkSandboxDied() {} } - }) + ) } @Test @@ -175,11 +159,11 @@ val context = ApplicationProvider.getApplicationContext() val managerCompat = SdkSandboxManagerCompat.from(context) - managerCompat.removeSdkSandboxProcessDeathCallback(object : - SdkSandboxProcessDeathCallbackCompat { - override fun onSdkSandboxDied() { + managerCompat.removeSdkSandboxProcessDeathCallback( + object : SdkSandboxProcessDeathCallbackCompat { + override fun onSdkSandboxDied() {} } - }) + ) } @Test @@ -189,10 +173,7 @@ val managerCompat = SdkSandboxManagerCompat.from(context) val localSdk = runBlocking { - managerCompat.loadSdk( - TestSdkConfigs.CURRENT.packageName, - Bundle() - ) + managerCompat.loadSdk(TestSdkConfigs.CURRENT.packageName, Bundle()) } val sandboxedSdks = managerCompat.getSandboxedSdks() @@ -207,9 +188,7 @@ val managerCompat = SdkSandboxManagerCompat.from(context) with(ActivityScenario.launch(EmptyActivity::class.java)) { - withActivity { - managerCompat.startSdkSandboxActivity(this, Binder()) - } + withActivity { managerCompat.startSdkSandboxActivity(this, Binder()) } } } @@ -226,9 +205,7 @@ val token = testSdk.registerSdkSandboxActivityHandler(handler) with(ActivityScenario.launch(EmptyActivity::class.java)) { - withActivity { - managerCompat.startSdkSandboxActivity(this, token) - } + withActivity { managerCompat.startSdkSandboxActivity(this, token) } } val activityHolder = handler.waitForActivity() @@ -243,17 +220,15 @@ val localSdk = managerCompat.loadSdkWithFeature(ClientFeature.LOAD_SDK) val anotherLocalSdkName = TestSdkConfigs.forSdkName("v5").packageName - val anotherLocalSdk = localSdk.asTestSdk().loadSdk( - anotherLocalSdkName, - Bundle() - ) + val anotherLocalSdk = localSdk.asTestSdk().loadSdk(anotherLocalSdkName, Bundle()) assertThat(anotherLocalSdk.getSdkName()).isEqualTo(anotherLocalSdkName) val interfaces = managerCompat.getSandboxedSdks().map { it.getInterface() } - assertThat(interfaces).containsExactly( - localSdk.getInterface(), - anotherLocalSdk.getInterface(), - ) + assertThat(interfaces) + .containsExactly( + localSdk.getInterface(), + anotherLocalSdk.getInterface(), + ) } @Test @@ -266,22 +241,23 @@ val params = Bundle() params.putBoolean("needFail", true) - val result = assertThrows(LoadSdkCompatException::class.java) { - runBlocking { - localSdk.asTestSdk().loadSdk( - TestSdkConfigs.forSdkName("v5").packageName, - params - ) + val result = + assertThrows(LoadSdkCompatException::class.java) { + runBlocking { + localSdk + .asTestSdk() + .loadSdk(TestSdkConfigs.forSdkName("v5").packageName, params) + } } - } assertThat(result.loadSdkErrorCode).isEqualTo(LOAD_SDK_SDK_DEFINED_ERROR) assertThat(result.extraInformation).isEqualTo(params) val interfaces = managerCompat.getSandboxedSdks().map { it.getInterface() } - assertThat(interfaces).containsExactly( - localSdk.getInterface(), - ) + assertThat(interfaces) + .containsExactly( + localSdk.getInterface(), + ) } @Test @@ -290,40 +266,29 @@ val managerCompat = SdkSandboxManagerCompat.from(context) val localSdk = runBlocking { - managerCompat.loadSdk( - TestSdkConfigs.forSdkName("v2").packageName, - Bundle() - ) + managerCompat.loadSdk(TestSdkConfigs.forSdkName("v2").packageName, Bundle()) } val anotherLocalSdk = runBlocking { - managerCompat.loadSdk( - TestSdkConfigs.CURRENT.packageName, - Bundle() - ) + managerCompat.loadSdk(TestSdkConfigs.CURRENT.packageName, Bundle()) } val testSdk = localSdk.asTestSdk() - val interfaces = testSdk.getSandboxedSdks() - .map { it.getInterface() } + val interfaces = testSdk.getSandboxedSdks().map { it.getInterface() } - assertThat(interfaces).containsExactly( - localSdk.getInterface(), - anotherLocalSdk.getInterface(), - ) + assertThat(interfaces) + .containsExactly( + localSdk.getInterface(), + anotherLocalSdk.getInterface(), + ) } private fun SdkSandboxManagerCompat.loadSdkWithFeature( clientFeature: ClientFeature ): SandboxedSdkCompat { return if (clientFeature.availableFrom <= ClientApiVersion.CURRENT_VERSION) { - runBlocking { - loadSdk( - TestSdkConfigs.CURRENT.packageName, - Bundle() - ) - } + runBlocking { loadSdk(TestSdkConfigs.CURRENT.packageName, Bundle()) } } else { loadLocalSdkWithVersionOverride( TestSdkConfigs.CURRENT.packageName,
diff --git a/privacysandbox/sdkruntime/sdkruntime-client/src/androidTest/java/androidx/privacysandbox/sdkruntime/client/TestSdkConfigs.kt b/privacysandbox/sdkruntime/sdkruntime-client/src/androidTest/java/androidx/privacysandbox/sdkruntime/client/TestSdkConfigs.kt index 9fb1eb1..c1b02da 100644 --- a/privacysandbox/sdkruntime/sdkruntime-client/src/androidTest/java/androidx/privacysandbox/sdkruntime/client/TestSdkConfigs.kt +++ b/privacysandbox/sdkruntime/sdkruntime-client/src/androidTest/java/androidx/privacysandbox/sdkruntime/client/TestSdkConfigs.kt
@@ -21,40 +21,30 @@ import androidx.test.core.app.ApplicationProvider import java.io.FileNotFoundException -/** - * Holds information about all TestSDKs. - */ +/** Holds information about all TestSDKs. */ internal object TestSdkConfigs { private val ALL_CONFIGS: LocalSdkConfigsHolder by lazy { LocalSdkConfigsHolder.load(ApplicationProvider.getApplicationContext()) } - /** - * Minimal TestSDK which built with HEAD version of sdkruntime-core library. - */ - val CURRENT: LocalSdkConfig by lazy { - forSdkName("current") - } + /** Minimal TestSDK which built with HEAD version of sdkruntime-core library. */ + val CURRENT: LocalSdkConfig by lazy { forSdkName("current") } /** * Same as [CURRENT] but also has optional fields set, such as: * 1) [LocalSdkConfig.javaResourcesRoot] * 2) [LocalSdkConfig.resourceRemapping] */ - val CURRENT_WITH_RESOURCES: LocalSdkConfig by lazy { - forSdkName("currentWithResources") - } + val CURRENT_WITH_RESOURCES: LocalSdkConfig by lazy { forSdkName("currentWithResources") } /** - * Return LocalSdkConfig for TestSDK. - * TestSDK should be registered in RuntimeEnabledSdkTable.xml with package name: - * "androidx.privacysandbox.sdkruntime.testsdk.[testSdkName]" + * Return LocalSdkConfig for TestSDK. TestSDK should be registered in RuntimeEnabledSdkTable.xml + * with package name: "androidx.privacysandbox.sdkruntime.testsdk.[testSdkName]" */ fun forSdkName(testSdkName: String): LocalSdkConfig { val sdkPackageName = "androidx.privacysandbox.sdkruntime.testsdk.$testSdkName" - return ALL_CONFIGS - .getSdkConfig(sdkPackageName) + return ALL_CONFIGS.getSdkConfig(sdkPackageName) ?: throw FileNotFoundException("Can't find LocalSdkConfig for $sdkPackageName") } }
diff --git a/privacysandbox/sdkruntime/sdkruntime-client/src/androidTest/java/androidx/privacysandbox/sdkruntime/client/activity/LocalSdkActivityStarterTest.kt b/privacysandbox/sdkruntime/sdkruntime-client/src/androidTest/java/androidx/privacysandbox/sdkruntime/client/activity/LocalSdkActivityStarterTest.kt index 2c89122..1e5e572 100644 --- a/privacysandbox/sdkruntime/sdkruntime-client/src/androidTest/java/androidx/privacysandbox/sdkruntime/client/activity/LocalSdkActivityStarterTest.kt +++ b/privacysandbox/sdkruntime/sdkruntime-client/src/androidTest/java/androidx/privacysandbox/sdkruntime/client/activity/LocalSdkActivityStarterTest.kt
@@ -41,11 +41,9 @@ val intent = Intent(Intent.ACTION_MAIN) intent.addCategory(Intent.CATEGORY_LAUNCHER) - val launcherActivities = packageManager - .queryIntentActivities(intent, 0) - .mapNotNull { it.activityInfo?.name } - assertThat(launcherActivities) - .doesNotContain(SdkActivity::class.qualifiedName) + val launcherActivities = + packageManager.queryIntentActivities(intent, 0).mapNotNull { it.activityInfo?.name } + assertThat(launcherActivities).doesNotContain(SdkActivity::class.qualifiedName) } @Test @@ -60,16 +58,13 @@ assertThat(activityHolder.getOnBackPressedDispatcher()) .isSameInstanceAs(sdkActivity.onBackPressedDispatcher) } - val registeredToken = LocalSdkActivityHandlerRegistry.register( - "LocalSdkActivityStarterTest.sdk", - handler - ) + val registeredToken = + LocalSdkActivityHandlerRegistry.register("LocalSdkActivityStarterTest.sdk", handler) - val startResult = with(ActivityScenario.launch(EmptyActivity::class.java)) { - withActivity { - LocalSdkActivityStarter.tryStart(this, registeredToken) + val startResult = + with(ActivityScenario.launch(EmptyActivity::class.java)) { + withActivity { LocalSdkActivityStarter.tryStart(this, registeredToken) } } - } assertThat(startResult).isTrue() @@ -80,18 +75,16 @@ fun tryStart_whenHandlerNotRegistered_ReturnFalse() { val unregisteredToken = Binder() - val startResult = with(ActivityScenario.launch(EmptyActivity::class.java)) { - withActivity { - LocalSdkActivityStarter.tryStart(this, unregisteredToken) + val startResult = + with(ActivityScenario.launch(EmptyActivity::class.java)) { + withActivity { LocalSdkActivityStarter.tryStart(this, unregisteredToken) } } - } assertThat(startResult).isFalse() } - private class ActivityValidationHandler( - private val validator: Consumer- ) : SdkSandboxActivityHandlerCompat { + private class ActivityValidationHandler(private val validator: Consumer ) : + SdkSandboxActivityHandlerCompat { val async = CountDownLatch(1) override fun onActivityCreated(activityHolder: ActivityHolder) {
diff --git a/privacysandbox/sdkruntime/sdkruntime-client/src/androidTest/java/androidx/privacysandbox/sdkruntime/client/config/LocalSdkConfigParserTest.kt b/privacysandbox/sdkruntime/sdkruntime-client/src/androidTest/java/androidx/privacysandbox/sdkruntime/client/config/LocalSdkConfigParserTest.kt index 42f370a..e2c9589 100644 --- a/privacysandbox/sdkruntime/sdkruntime-client/src/androidTest/java/androidx/privacysandbox/sdkruntime/client/config/LocalSdkConfigParserTest.kt +++ b/privacysandbox/sdkruntime/sdkruntime-client/src/androidTest/java/androidx/privacysandbox/sdkruntime/client/config/LocalSdkConfigParserTest.kt
@@ -31,7 +31,8 @@ @Test fun parse_skipUnknownTagsAndReturnParsedResult() { - val xml = """ + val xml = + """compat.sdk.provider new parameter from future library version @@ -47,7 +48,8 @@42 - """.trimIndent() + """ + .trimIndent() val result = tryParse(xml, packageName = "com.test.sdk.package", versionMajor = 1) @@ -59,22 +61,25 @@ dexPaths = listOf("1.dex", "2.dex"), entryPoint = "compat.sdk.provider", javaResourcesRoot = "javaResPath/", - resourceRemapping = ResourceRemappingConfig( - rPackageClassName = "com.test.sdk.RPackage", - packageId = 42 - ) + resourceRemapping = + ResourceRemappingConfig( + rPackageClassName = "com.test.sdk.RPackage", + packageId = 42 + ) ) ) } @Test fun parse_whenOnlyMandatoryElements_returnParsedResult() { - val xml = """ + val xml = + """compat.sdk.provider 1.dex - """.trimIndent() + """ + .trimIndent() val result = tryParse(xml, packageName = "com.test.sdk.package") @@ -94,11 +99,13 @@ @Test fun parse_whenNoEntryPoint_throwsException() { assertParsingFailWithReason( - xml = """ + xml = + """1.dex - """.trimIndent(), + """ + .trimIndent(), reason = "No compat-entrypoint tag found" ) } @@ -106,13 +113,15 @@ @Test fun parse_whenDuplicateEntryPoint_throwsException() { assertParsingFailWithReason( - xml = """ + xml = + """compat.sdk.provider compat.sdk.provider2 1.dex - """.trimIndent(), + """ + .trimIndent(), reason = "Duplicate compat-entrypoint tag found" ) } @@ -120,11 +129,13 @@ @Test fun parse_whenNoDexPath_throwsException() { assertParsingFailWithReason( - xml = """ + xml = + """compat.sdk.provider - """.trimIndent(), + """ + .trimIndent(), reason = "No dex-path tags found" ) } @@ -132,14 +143,16 @@ @Test fun parse_whenDuplicateJavaResourceRoot_throwsException() { assertParsingFailWithReason( - xml = """ + xml = + """compat.sdk.provider 1.dex path1/ path2/ - """.trimIndent(), + """ + .trimIndent(), reason = "Duplicate java-resources-root-path tag found" ) } @@ -147,7 +160,8 @@ @Test fun parse_whenDuplicateResourceRemapping_throwsException() { assertParsingFailWithReason( - xml = """ + xml = + """compat.sdk.provider 1.dex @@ -160,7 +174,8 @@42 - """.trimIndent(), + """ + .trimIndent(), reason = "Duplicate resource-id-remapping tag found" ) } @@ -168,7 +183,8 @@ @Test fun parse_whenNoClassInResourceRemapping_throwsException() { assertParsingFailWithReason( - xml = """ + xml = + """compat.sdk.provider 1.dex @@ -176,7 +192,8 @@42 - """.trimIndent(), + """ + .trimIndent(), reason = "No r-package-class tag found" ) } @@ -184,7 +201,8 @@ @Test fun parse_whenDuplicateClassInResourceRemapping_throwsException() { assertParsingFailWithReason( - xml = """ + xml = + """compat.sdk.provider 1.dex @@ -194,7 +212,8 @@42 - """.trimIndent(), + """ + .trimIndent(), reason = "Duplicate r-package-class tag found" ) } @@ -202,7 +221,8 @@ @Test fun parse_whenNoPackageIdInResourceRemapping_throwsException() { assertParsingFailWithReason( - xml = """ + xml = + """compat.sdk.provider 1.dex @@ -210,7 +230,8 @@com.test.sdk.RPackage - """.trimIndent(), + """ + .trimIndent(), reason = "No resources-package-id tag found" ) } @@ -218,7 +239,8 @@ @Test fun parse_whenDuplicatePackageIdInResourceRemapping_throwsException() { assertParsingFailWithReason( - xml = """ + xml = + """compat.sdk.provider 1.dex @@ -228,17 +250,14 @@42 - """.trimIndent(), + """ + .trimIndent(), reason = "Duplicate resources-package-id tag found" ) } private fun assertParsingFailWithReason(xml: String, reason: String) { - assertThrows{ - tryParse(xml) - }.hasMessageThat().isEqualTo( - reason - ) + assertThrows{ tryParse(xml) }.hasMessageThat().isEqualTo(reason) } private fun tryParse(
diff --git a/privacysandbox/sdkruntime/sdkruntime-client/src/androidTest/java/androidx/privacysandbox/sdkruntime/client/config/LocalSdkConfigsHolderTest.kt b/privacysandbox/sdkruntime/sdkruntime-client/src/androidTest/java/androidx/privacysandbox/sdkruntime/client/config/LocalSdkConfigsHolderTest.kt index de29be9..b2e5212 100644 --- a/privacysandbox/sdkruntime/sdkruntime-client/src/androidTest/java/androidx/privacysandbox/sdkruntime/client/config/LocalSdkConfigsHolderTest.kt +++ b/privacysandbox/sdkruntime/sdkruntime-client/src/androidTest/java/androidx/privacysandbox/sdkruntime/client/config/LocalSdkConfigsHolderTest.kt
@@ -29,39 +29,35 @@ @Test fun load_whenSdkTableNotExists_doesNotThrowException() { - val configHolder = LocalSdkConfigsHolder.load( - ApplicationProvider.getApplicationContext(), - sdkTableAssetName = "not-exists" - ) + val configHolder = + LocalSdkConfigsHolder.load( + ApplicationProvider.getApplicationContext(), + sdkTableAssetName = "not-exists" + ) val result = configHolder.getSdkConfig("sdk") assertThat(result).isNull() } @Test fun getSdkConfig_whenSdkExists_returnSdkInfo() { - val configHolder = LocalSdkConfigsHolder.load( - ApplicationProvider.getApplicationContext() - ) + val configHolder = LocalSdkConfigsHolder.load(ApplicationProvider.getApplicationContext()) - val result = configHolder.getSdkConfig( - TestSdkConfigs.CURRENT.packageName - ) + val result = configHolder.getSdkConfig(TestSdkConfigs.CURRENT.packageName) - val expectedConfig = LocalSdkConfig( - packageName = "androidx.privacysandbox.sdkruntime.testsdk.current", - versionMajor = 42, - dexPaths = listOf("test-sdks/current/classes.dex"), - entryPoint = "androidx.privacysandbox.sdkruntime.testsdk.CompatProvider", - ) + val expectedConfig = + LocalSdkConfig( + packageName = "androidx.privacysandbox.sdkruntime.testsdk.current", + versionMajor = 42, + dexPaths = listOf("test-sdks/current/classes.dex"), + entryPoint = "androidx.privacysandbox.sdkruntime.testsdk.CompatProvider", + ) assertThat(result).isEqualTo(expectedConfig) } @Test fun getSdkConfig_whenSdkNotExists_returnNull() { - val configHolder = LocalSdkConfigsHolder.load( - ApplicationProvider.getApplicationContext() - ) + val configHolder = LocalSdkConfigsHolder.load(ApplicationProvider.getApplicationContext()) val result = configHolder.getSdkConfig("not-exists")
diff --git a/privacysandbox/sdkruntime/sdkruntime-client/src/androidTest/java/androidx/privacysandbox/sdkruntime/client/config/SdkTableConfigParserTest.kt b/privacysandbox/sdkruntime/sdkruntime-client/src/androidTest/java/androidx/privacysandbox/sdkruntime/client/config/SdkTableConfigParserTest.kt index e8fe29b..513215c 100644 --- a/privacysandbox/sdkruntime/sdkruntime-client/src/androidTest/java/androidx/privacysandbox/sdkruntime/client/config/SdkTableConfigParserTest.kt +++ b/privacysandbox/sdkruntime/sdkruntime-client/src/androidTest/java/androidx/privacysandbox/sdkruntime/client/config/SdkTableConfigParserTest.kt
@@ -32,7 +32,8 @@ @Test fun parse_skipUnknownTagsAndReturnSetWithSdkTableEntries() { - val xml = """ + val xml = + """sdk1 @@ -49,7 +50,8 @@config2.xml - """.trimIndent() + """ + .trimIndent() val result = tryParse(xml) @@ -70,10 +72,12 @@ @Test fun parse_whenEmptyTable_returnsEmptyMap() { - val xml = """ + val xml = + """- """.trimIndent() + """ + .trimIndent() val result = tryParse(xml) @@ -82,24 +86,25 @@ @Test fun parse_whenNoPackageName_throwsException() { - val xml = """ + val xml = + """ config1.xml - """.trimIndent() + """ + .trimIndent() - assertThrows{ - tryParse(xml) - }.hasMessageThat().isEqualTo( - "No package-name tag found" - ) + assertThrows{ tryParse(xml) } + .hasMessageThat() + .isEqualTo("No package-name tag found") } @Test fun parse_whenMultiplePackageNames_throwsException() { - val xml = """ + val xml = + """sdk1 @@ -107,18 +112,18 @@config1.xml - """.trimIndent() + """ + .trimIndent() - assertThrows{ - tryParse(xml) - }.hasMessageThat().isEqualTo( - "Duplicate package-name tag found" - ) + assertThrows{ tryParse(xml) } + .hasMessageThat() + .isEqualTo("Duplicate package-name tag found") } @Test fun parse_whenMultipleVersionMajor_throwsException() { - val xml = """ + val xml = + """sdk1 @@ -127,35 +132,35 @@config1.xml - """.trimIndent() + """ + .trimIndent() - assertThrows{ - tryParse(xml) - }.hasMessageThat().isEqualTo( - "Duplicate version-major tag found" - ) + assertThrows{ tryParse(xml) } + .hasMessageThat() + .isEqualTo("Duplicate version-major tag found") } @Test fun parse_whenNoConfigPath_throwsException() { - val xml = """ + val xml = + """sdk1 - """.trimIndent() + """ + .trimIndent() - assertThrows{ - tryParse(xml) - }.hasMessageThat().isEqualTo( - "No compat-config-path tag found" - ) + assertThrows{ tryParse(xml) } + .hasMessageThat() + .isEqualTo("No compat-config-path tag found") } @Test fun parse_whenMultipleConfigPaths_throwsException() { - val xml = """ + val xml = + """sdk1 @@ -163,18 +168,18 @@config2.xml - """.trimIndent() + """ + .trimIndent() - assertThrows{ - tryParse(xml) - }.hasMessageThat().isEqualTo( - "Duplicate compat-config-path tag found" - ) + assertThrows{ tryParse(xml) } + .hasMessageThat() + .isEqualTo("Duplicate compat-config-path tag found") } @Test fun parse_whenDuplicatePackageName_throwsException() { - val xml = """ + val xml = + """sdk1 @@ -185,13 +190,12 @@config2.xml - """.trimIndent() + """ + .trimIndent() - assertThrows{ - tryParse(xml) - }.hasMessageThat().isEqualTo( - "Duplicate entry for sdk1 found" - ) + assertThrows{ tryParse(xml) } + .hasMessageThat() + .isEqualTo("Duplicate entry for sdk1 found") } private fun tryParse(xml: String): Set{
diff --git a/privacysandbox/sdkruntime/sdkruntime-client/src/androidTest/java/androidx/privacysandbox/sdkruntime/client/controller/LocalControllerTest.kt b/privacysandbox/sdkruntime/sdkruntime-client/src/androidTest/java/androidx/privacysandbox/sdkruntime/client/controller/LocalControllerTest.kt index be47b03..289ec70 100644 --- a/privacysandbox/sdkruntime/sdkruntime-client/src/androidTest/java/androidx/privacysandbox/sdkruntime/client/controller/LocalControllerTest.kt +++ b/privacysandbox/sdkruntime/sdkruntime-client/src/androidTest/java/androidx/privacysandbox/sdkruntime/client/controller/LocalControllerTest.kt
@@ -88,11 +88,8 @@ @Test fun getAppOwnedSdkSandboxInterfaces_returnsResultsFromAppOwnedSdkRegistry() { - val appOwnedInterface = AppOwnedSdkSandboxInterfaceCompat( - name = "TestSDK", - version = 1, - binder = Binder() - ) + val appOwnedInterface = + AppOwnedSdkSandboxInterfaceCompat(name = "TestSDK", version = 1, binder = Binder()) appOwnedSdkRegistry.appOwnedSdks = listOf(appOwnedInterface) val result = controller.getAppOwnedSdkSandboxInterfaces() @@ -101,11 +98,12 @@ @Test fun registerSdkSandboxActivityHandler_delegateToLocalSdkActivityHandlerRegistry() { - val handler = object : SdkSandboxActivityHandlerCompat { - override fun onActivityCreated(activityHolder: ActivityHolder) { - // do nothing + val handler = + object : SdkSandboxActivityHandlerCompat { + override fun onActivityCreated(activityHolder: ActivityHolder) { + // do nothing + } } - } val token = controller.registerSdkSandboxActivityHandler(handler) @@ -116,22 +114,22 @@ @Test fun registerSdkSandboxActivityHandler_registerWithCorrectSdkPackageName() { val token = - controller.registerSdkSandboxActivityHandler(object : SdkSandboxActivityHandlerCompat { + controller.registerSdkSandboxActivityHandler( + object : SdkSandboxActivityHandlerCompat { + override fun onActivityCreated(activityHolder: ActivityHolder) { + // do nothing + } + } + ) + + val anotherSdkController = + LocalController("LocalControllerTest.anotherSdk", localSdkRegistry, appOwnedSdkRegistry) + val anotherSdkHandler = + object : SdkSandboxActivityHandlerCompat { override fun onActivityCreated(activityHolder: ActivityHolder) { // do nothing } - }) - - val anotherSdkController = LocalController( - "LocalControllerTest.anotherSdk", - localSdkRegistry, - appOwnedSdkRegistry - ) - val anotherSdkHandler = object : SdkSandboxActivityHandlerCompat { - override fun onActivityCreated(activityHolder: ActivityHolder) { - // do nothing } - } val anotherSdkToken = anotherSdkController.registerSdkSandboxActivityHandler(anotherSdkHandler) @@ -143,11 +141,12 @@ @Test fun unregisterSdkSandboxActivityHandler_delegateToLocalSdkActivityHandlerRegistry() { - val handler = object : SdkSandboxActivityHandlerCompat { - override fun onActivityCreated(activityHolder: ActivityHolder) { - // do nothing + val handler = + object : SdkSandboxActivityHandlerCompat { + override fun onActivityCreated(activityHolder: ActivityHolder) { + // do nothing + } } - } val token = controller.registerSdkSandboxActivityHandler(handler) controller.unregisterSdkSandboxActivityHandler(handler)
diff --git a/privacysandbox/sdkruntime/sdkruntime-client/src/androidTest/java/androidx/privacysandbox/sdkruntime/client/controller/impl/LocalAppOwnedSdkRegistryTest.kt b/privacysandbox/sdkruntime/sdkruntime-client/src/androidTest/java/androidx/privacysandbox/sdkruntime/client/controller/impl/LocalAppOwnedSdkRegistryTest.kt index 8bbddbf..e6f7b0e 100644 --- a/privacysandbox/sdkruntime/sdkruntime-client/src/androidTest/java/androidx/privacysandbox/sdkruntime/client/controller/impl/LocalAppOwnedSdkRegistryTest.kt +++ b/privacysandbox/sdkruntime/sdkruntime-client/src/androidTest/java/androidx/privacysandbox/sdkruntime/client/controller/impl/LocalAppOwnedSdkRegistryTest.kt
@@ -40,11 +40,8 @@ @Test fun registerAppOwnedSdkSandboxInterfaceTest() { - val appOwnedInterface = AppOwnedSdkSandboxInterfaceCompat( - name = "TestSDK", - version = 1, - binder = Binder() - ) + val appOwnedInterface = + AppOwnedSdkSandboxInterfaceCompat(name = "TestSDK", version = 1, binder = Binder()) sdkRegistry.registerAppOwnedSdkSandboxInterface(appOwnedInterface) @@ -59,19 +56,17 @@ @Test fun registerAppOwnedSdkSandboxInterface_whenAlreadyRegistered_throwsIllegalStateException() { - val appOwnedInterface = AppOwnedSdkSandboxInterfaceCompat( - name = "TestSDK", - version = 1, - binder = Binder() - ) + val appOwnedInterface = + AppOwnedSdkSandboxInterfaceCompat(name = "TestSDK", version = 1, binder = Binder()) sdkRegistry.registerAppOwnedSdkSandboxInterface(appOwnedInterface) - val interfaceWithSameName = AppOwnedSdkSandboxInterfaceCompat( - name = appOwnedInterface.getName(), - version = 1, - binder = Binder() - ) + val interfaceWithSameName = + AppOwnedSdkSandboxInterfaceCompat( + name = appOwnedInterface.getName(), + version = 1, + binder = Binder() + ) assertThrows{ sdkRegistry.registerAppOwnedSdkSandboxInterface(interfaceWithSameName) } @@ -79,11 +74,8 @@ @Test fun unregisterAppOwnedSdkSandboxInterfaceTest() { - val appOwnedInterface = AppOwnedSdkSandboxInterfaceCompat( - name = "TestSDK", - version = 1, - binder = Binder() - ) + val appOwnedInterface = + AppOwnedSdkSandboxInterfaceCompat(name = "TestSDK", version = 1, binder = Binder()) sdkRegistry.registerAppOwnedSdkSandboxInterface(appOwnedInterface) sdkRegistry.unregisterAppOwnedSdkSandboxInterface(appOwnedInterface.getName())
diff --git a/privacysandbox/sdkruntime/sdkruntime-client/src/androidTest/java/androidx/privacysandbox/sdkruntime/client/controller/impl/LocalSdkRegistryTest.kt b/privacysandbox/sdkruntime/sdkruntime-client/src/androidTest/java/androidx/privacysandbox/sdkruntime/client/controller/impl/LocalSdkRegistryTest.kt index b386ed3..adc0970 100644 --- a/privacysandbox/sdkruntime/sdkruntime-client/src/androidTest/java/androidx/privacysandbox/sdkruntime/client/controller/impl/LocalSdkRegistryTest.kt +++ b/privacysandbox/sdkruntime/sdkruntime-client/src/androidTest/java/androidx/privacysandbox/sdkruntime/client/controller/impl/LocalSdkRegistryTest.kt
@@ -61,21 +61,13 @@ @Test fun loadSdk_whenLocalSdkExists_returnsLocallyLoadedSdk() { - val result = localSdkRegistry.loadSdk( - TestSdkConfigs.CURRENT.packageName, - Bundle() - ) + val result = localSdkRegistry.loadSdk(TestSdkConfigs.CURRENT.packageName, Bundle()) assertThat(result.getInterface()!!.javaClass.classLoader) .isNotSameInstanceAs(localSdkRegistry.javaClass.classLoader) assertThat(result.getSdkInfo()) - .isEqualTo( - SandboxedSdkInfo( - name = TestSdkConfigs.CURRENT.packageName, - version = 42 - ) - ) + .isEqualTo(SandboxedSdkInfo(name = TestSdkConfigs.CURRENT.packageName, version = 42)) assertThat(localSdkRegistry.getLoadedSdks()).containsExactly(result) } @@ -85,32 +77,29 @@ val params = Bundle() params.putBoolean("needFail", true) - val result = Assert.assertThrows(LoadSdkCompatException::class.java) { - localSdkRegistry.loadSdk( - TestSdkConfigs.CURRENT.packageName, - params - ) - } + val result = + Assert.assertThrows(LoadSdkCompatException::class.java) { + localSdkRegistry.loadSdk(TestSdkConfigs.CURRENT.packageName, params) + } assertThat(result.extraInformation).isEqualTo(params) - assertThat(result.loadSdkErrorCode).isEqualTo( - LoadSdkCompatException.LOAD_SDK_SDK_DEFINED_ERROR - ) + assertThat(result.loadSdkErrorCode) + .isEqualTo(LoadSdkCompatException.LOAD_SDK_SDK_DEFINED_ERROR) assertThat(localSdkRegistry.getLoadedSdks()).isEmpty() } @Test fun loadSdk_whenLocalSdkFailedToLoad_throwsInternalErrorException() { - val result = Assert.assertThrows(LoadSdkCompatException::class.java) { - localSdkRegistry.loadSdk( - TestSdkConfigs.forSdkName("invalidEntryPoint").packageName, - Bundle() - ) - } + val result = + Assert.assertThrows(LoadSdkCompatException::class.java) { + localSdkRegistry.loadSdk( + TestSdkConfigs.forSdkName("invalidEntryPoint").packageName, + Bundle() + ) + } - assertThat(result.loadSdkErrorCode).isEqualTo( - LoadSdkCompatException.LOAD_SDK_INTERNAL_ERROR - ) + assertThat(result.loadSdkErrorCode) + .isEqualTo(LoadSdkCompatException.LOAD_SDK_INTERNAL_ERROR) assertThat(result.message).isEqualTo("Failed to instantiate local SDK") assertThat(localSdkRegistry.getLoadedSdks()).isEmpty() } @@ -120,24 +109,22 @@ val sdkName = TestSdkConfigs.CURRENT.packageName val firstTimeLoadedSdk = localSdkRegistry.loadSdk(sdkName, Bundle()) - val result = Assert.assertThrows(LoadSdkCompatException::class.java) { - localSdkRegistry.loadSdk(sdkName, Bundle()) - } + val result = + Assert.assertThrows(LoadSdkCompatException::class.java) { + localSdkRegistry.loadSdk(sdkName, Bundle()) + } - assertThat(result.loadSdkErrorCode).isEqualTo( - LoadSdkCompatException.LOAD_SDK_ALREADY_LOADED - ) + assertThat(result.loadSdkErrorCode) + .isEqualTo(LoadSdkCompatException.LOAD_SDK_ALREADY_LOADED) assertThat(localSdkRegistry.getLoadedSdks()).containsExactly(firstTimeLoadedSdk) } @Test fun loadSdk_whenNoLocalSdkExists_throwsSdkNotFoundException() { - val result = Assert.assertThrows(LoadSdkCompatException::class.java) { - localSdkRegistry.loadSdk( - "sdk-doesnt-exist", - Bundle() - ) - } + val result = + Assert.assertThrows(LoadSdkCompatException::class.java) { + localSdkRegistry.loadSdk("sdk-doesnt-exist", Bundle()) + } assertThat(result.loadSdkErrorCode).isEqualTo(LoadSdkCompatException.LOAD_SDK_NOT_FOUND) assertThat(localSdkRegistry.getLoadedSdks()).isEmpty() @@ -151,10 +138,8 @@ localSdkRegistry.unloadSdk(sdkName) val reloadedSdk = localSdkRegistry.loadSdk(sdkName, Bundle()) - assertThat(localSdkRegistry.getLoadedSdks()) - .containsExactly(reloadedSdk) - assertThat(reloadedSdk.getInterface()) - .isNotEqualTo(sdkToUnload.getInterface()) + assertThat(localSdkRegistry.getLoadedSdks()).containsExactly(reloadedSdk) + assertThat(reloadedSdk.getInterface()).isNotEqualTo(sdkToUnload.getInterface()) } @Test @@ -165,9 +150,8 @@ localSdkRegistry.unloadSdk(sdkName) - val isBeforeUnloadSdkCalled = sdkProvider.extractSdkProviderFieldValue( - fieldName = "isBeforeUnloadSdkCalled" - ) + val isBeforeUnloadSdkCalled = + sdkProvider.extractSdkProviderFieldValue(fieldName = "isBeforeUnloadSdkCalled") assertThat(isBeforeUnloadSdkCalled).isTrue() assertThat(localSdkRegistry.getLoadedSdks()).isEmpty() } @@ -180,10 +164,7 @@ @Test fun unloadSdk_unregisterActivityHandlers() { val packageName = TestSdkConfigs.CURRENT.packageName - val localSdk = localSdkRegistry.loadSdk( - packageName, - Bundle() - ) + val localSdk = localSdkRegistry.loadSdk(packageName, Bundle()) val testSdk = localSdk.asTestSdk() val token = testSdk.registerSdkSandboxActivityHandler(CatchingSdkActivityHandler())
diff --git a/privacysandbox/sdkruntime/sdkruntime-client/src/androidTest/java/androidx/privacysandbox/sdkruntime/client/controller/impl/PlatformAppOwnedSdkRegistryTest.kt b/privacysandbox/sdkruntime/sdkruntime-client/src/androidTest/java/androidx/privacysandbox/sdkruntime/client/controller/impl/PlatformAppOwnedSdkRegistryTest.kt index 80c7f9a..b9d81ba 100644 --- a/privacysandbox/sdkruntime/sdkruntime-client/src/androidTest/java/androidx/privacysandbox/sdkruntime/client/controller/impl/PlatformAppOwnedSdkRegistryTest.kt +++ b/privacysandbox/sdkruntime/sdkruntime-client/src/androidTest/java/androidx/privacysandbox/sdkruntime/client/controller/impl/PlatformAppOwnedSdkRegistryTest.kt
@@ -68,11 +68,8 @@ @Test fun registerAppOwnedSdkSandboxInterface_registerInPlatform() { - val appOwnedInterface = AppOwnedSdkSandboxInterfaceCompat( - name = "TestSDK", - version = 1, - binder = Binder() - ) + val appOwnedInterface = + AppOwnedSdkSandboxInterfaceCompat(name = "TestSDK", version = 1, binder = Binder()) sdkRegistry.registerAppOwnedSdkSandboxInterface(appOwnedInterface) @@ -87,11 +84,8 @@ @Test fun unregisterAppOwnedSdkSandboxInterface_unregisterFromPlatform() { - val appOwnedInterface = AppOwnedSdkSandboxInterfaceCompat( - name = "TestSDK", - version = 1, - binder = Binder() - ) + val appOwnedInterface = + AppOwnedSdkSandboxInterfaceCompat(name = "TestSDK", version = 1, binder = Binder()) sdkRegistry.registerAppOwnedSdkSandboxInterface(appOwnedInterface) sdkRegistry.unregisterAppOwnedSdkSandboxInterface(appOwnedInterface.getName()) @@ -102,11 +96,8 @@ @Test fun getAppOwnedSdkSandboxInterfaces_returnsRegisteredSdkInterfaces() { - val appOwnedInterface = AppOwnedSdkSandboxInterfaceCompat( - name = "TestSDK", - version = 1, - binder = Binder() - ) + val appOwnedInterface = + AppOwnedSdkSandboxInterfaceCompat(name = "TestSDK", version = 1, binder = Binder()) sdkRegistry.registerAppOwnedSdkSandboxInterface(appOwnedInterface) val results = sdkRegistry.getAppOwnedSdkSandboxInterfaces()
diff --git a/privacysandbox/sdkruntime/sdkruntime-client/src/androidTest/java/androidx/privacysandbox/sdkruntime/client/loader/FileClassLoaderFactoryTest.kt b/privacysandbox/sdkruntime/sdkruntime-client/src/androidTest/java/androidx/privacysandbox/sdkruntime/client/loader/FileClassLoaderFactoryTest.kt index 05470dd..2aa8a24 100644 --- a/privacysandbox/sdkruntime/sdkruntime-client/src/androidTest/java/androidx/privacysandbox/sdkruntime/client/loader/FileClassLoaderFactoryTest.kt +++ b/privacysandbox/sdkruntime/sdkruntime-client/src/androidTest/java/androidx/privacysandbox/sdkruntime/client/loader/FileClassLoaderFactoryTest.kt
@@ -47,15 +47,14 @@ val sdkDexFiles = extractTestSdkDexFiles() val fallback = TestFallbackFactory() - val fileClassLoaderFactory = FileClassLoaderFactory( - StubSdkStorage(result = sdkDexFiles), - fallback - ) + val fileClassLoaderFactory = + FileClassLoaderFactory(StubSdkStorage(result = sdkDexFiles), fallback) - val classLoader = fileClassLoaderFactory.createClassLoaderFor( - testSdkConfig, - javaClass.classLoader!!.parent!! - ) + val classLoader = + fileClassLoaderFactory.createClassLoaderFor( + testSdkConfig, + javaClass.classLoader!!.parent!! + ) val loadedEntryPointClass = classLoader.loadClass(testSdkConfig.entryPoint) assertThat(loadedEntryPointClass.classLoader).isEqualTo(classLoader) @@ -66,15 +65,9 @@ @Test fun createClassLoaderFor_whenSdkStorageReturnNull_delegateToFallback() { val fallback = TestFallbackFactory(testSdkConfig, javaClass.classLoader!!.parent) - val fileClassLoaderFactory = FileClassLoaderFactory( - StubSdkStorage(result = null), - fallback - ) + val fileClassLoaderFactory = FileClassLoaderFactory(StubSdkStorage(result = null), fallback) - fileClassLoaderFactory.createClassLoaderFor( - testSdkConfig, - javaClass.classLoader!!.parent!! - ) + fileClassLoaderFactory.createClassLoaderFor(testSdkConfig, javaClass.classLoader!!.parent!!) assertThat(fallback.loadSdkCalled).isTrue() } @@ -82,28 +75,22 @@ @Test fun createClassLoaderFor_whenSdkStorageThrows_delegateToFallback() { val fallback = TestFallbackFactory(testSdkConfig, javaClass.classLoader!!.parent) - val fileClassLoaderFactory = FileClassLoaderFactory( - ThrowingSdkStorage(exception = Exception("Something wrong")), - fallback - ) + val fileClassLoaderFactory = + FileClassLoaderFactory( + ThrowingSdkStorage(exception = Exception("Something wrong")), + fallback + ) - fileClassLoaderFactory.createClassLoaderFor( - testSdkConfig, - javaClass.classLoader!!.parent!! - ) + fileClassLoaderFactory.createClassLoaderFor(testSdkConfig, javaClass.classLoader!!.parent!!) assertThat(fallback.loadSdkCalled).isTrue() } - private class StubSdkStorage( - private val result: LocalSdkDexFiles? - ) : LocalSdkStorage { + private class StubSdkStorage(private val result: LocalSdkDexFiles?) : LocalSdkStorage { override fun dexFilesFor(sdkConfig: LocalSdkConfig) = result } - private class ThrowingSdkStorage( - private val exception: Exception - ) : LocalSdkStorage { + private class ThrowingSdkStorage(private val exception: Exception) : LocalSdkStorage { override fun dexFilesFor(sdkConfig: LocalSdkConfig): LocalSdkDexFiles? { throw exception } @@ -130,10 +117,11 @@ private fun extractTestSdkDexFiles(): LocalSdkDexFiles { val context = ApplicationProvider.getApplicationContext() - val testStorage = TestLocalSdkStorage( - context, - rootFolder = File(context.cacheDir, "FileClassLoaderFactoryTest") - ) + val testStorage = + TestLocalSdkStorage( + context, + rootFolder = File(context.cacheDir, "FileClassLoaderFactoryTest") + ) return testStorage.dexFilesFor(testSdkConfig) }
diff --git a/privacysandbox/sdkruntime/sdkruntime-client/src/androidTest/java/androidx/privacysandbox/sdkruntime/client/loader/InMemorySdkClassLoaderFactoryTest.kt b/privacysandbox/sdkruntime/sdkruntime-client/src/androidTest/java/androidx/privacysandbox/sdkruntime/client/loader/InMemorySdkClassLoaderFactoryTest.kt index 275eda1..fb619d7 100644 --- a/privacysandbox/sdkruntime/sdkruntime-client/src/androidTest/java/androidx/privacysandbox/sdkruntime/client/loader/InMemorySdkClassLoaderFactoryTest.kt +++ b/privacysandbox/sdkruntime/sdkruntime-client/src/androidTest/java/androidx/privacysandbox/sdkruntime/client/loader/InMemorySdkClassLoaderFactoryTest.kt
@@ -39,9 +39,8 @@ @Before fun setUp() { - factoryUnderTest = InMemorySdkClassLoaderFactory.create( - ApplicationProvider.getApplicationContext() - ) + factoryUnderTest = + InMemorySdkClassLoaderFactory.create(ApplicationProvider.getApplicationContext()) singleDexSdkInfo = TestSdkConfigs.CURRENT assertThat(singleDexSdkInfo.dexPaths.size).isEqualTo(1) @@ -52,10 +51,8 @@ @Test @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O_MR1) fun createClassLoaderFor_whenApi27AndMultipleDex_returnClassloader() { - val classLoader = factoryUnderTest.createClassLoaderFor( - multipleDexSdkInfo, - javaClass.classLoader!! - ) + val classLoader = + factoryUnderTest.createClassLoaderFor(multipleDexSdkInfo, javaClass.classLoader!!) val loadedEntryPointClass = classLoader.loadClass(multipleDexSdkInfo.entryPoint) assertThat(loadedEntryPointClass.classLoader).isEqualTo(classLoader) } @@ -63,10 +60,8 @@ @Test @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O) fun createClassLoaderFor_whenApi26AndSingleDex_returnClassloader() { - val classLoader = factoryUnderTest.createClassLoaderFor( - singleDexSdkInfo, - javaClass.classLoader!! - ) + val classLoader = + factoryUnderTest.createClassLoaderFor(singleDexSdkInfo, javaClass.classLoader!!) val loadedEntryPointClass = classLoader.loadClass(singleDexSdkInfo.entryPoint) assertThat(loadedEntryPointClass.classLoader).isEqualTo(classLoader) } @@ -74,34 +69,26 @@ @Test @SdkSuppress(maxSdkVersion = Build.VERSION_CODES.O) fun createClassLoaderFor_whenApiPre27AndMultipleDex_throwsSandboxDisabledException() { - val ex = assertThrows(LoadSdkCompatException::class.java) { - factoryUnderTest.createClassLoaderFor( - multipleDexSdkInfo, - javaClass.classLoader!! - ) - } + val ex = + assertThrows(LoadSdkCompatException::class.java) { + factoryUnderTest.createClassLoaderFor(multipleDexSdkInfo, javaClass.classLoader!!) + } assertThat(ex.loadSdkErrorCode) .isEqualTo(LoadSdkCompatException.LOAD_SDK_SDK_SANDBOX_DISABLED) - assertThat(ex) - .hasMessageThat() - .startsWith("Can't use InMemoryDexClassLoader") + assertThat(ex).hasMessageThat().startsWith("Can't use InMemoryDexClassLoader") } @Test @SdkSuppress(maxSdkVersion = Build.VERSION_CODES.N_MR1) fun createClassLoaderFor_whenApiPre26AndSingleDex_throwsSandboxDisabledException() { - val ex = assertThrows(LoadSdkCompatException::class.java) { - factoryUnderTest.createClassLoaderFor( - singleDexSdkInfo, - javaClass.classLoader!! - ) - } + val ex = + assertThrows(LoadSdkCompatException::class.java) { + factoryUnderTest.createClassLoaderFor(singleDexSdkInfo, javaClass.classLoader!!) + } assertThat(ex.loadSdkErrorCode) .isEqualTo(LoadSdkCompatException.LOAD_SDK_SDK_SANDBOX_DISABLED) - assertThat(ex) - .hasMessageThat() - .isEqualTo("Can't use InMemoryDexClassLoader") + assertThat(ex).hasMessageThat().isEqualTo("Can't use InMemoryDexClassLoader") } }
diff --git a/privacysandbox/sdkruntime/sdkruntime-client/src/androidTest/java/androidx/privacysandbox/sdkruntime/client/loader/JavaResourcesLoadingClassLoaderFactoryTest.kt b/privacysandbox/sdkruntime/sdkruntime-client/src/androidTest/java/androidx/privacysandbox/sdkruntime/client/loader/JavaResourcesLoadingClassLoaderFactoryTest.kt index 530c76a1..29500a0 100644 --- a/privacysandbox/sdkruntime/sdkruntime-client/src/androidTest/java/androidx/privacysandbox/sdkruntime/client/loader/JavaResourcesLoadingClassLoaderFactoryTest.kt +++ b/privacysandbox/sdkruntime/sdkruntime-client/src/androidTest/java/androidx/privacysandbox/sdkruntime/client/loader/JavaResourcesLoadingClassLoaderFactoryTest.kt
@@ -36,37 +36,36 @@ @Before fun setUp() { appClassloader = javaClass.classLoader!! - factoryUnderTest = JavaResourcesLoadingClassLoaderFactory( - appClassloader, - codeClassLoaderFactory = object : SdkLoader.ClassLoaderFactory { - override fun createClassLoaderFor(sdkConfig: LocalSdkConfig, parent: ClassLoader) = - parent - } - ) + factoryUnderTest = + JavaResourcesLoadingClassLoaderFactory( + appClassloader, + codeClassLoaderFactory = + object : SdkLoader.ClassLoaderFactory { + override fun createClassLoaderFor( + sdkConfig: LocalSdkConfig, + parent: ClassLoader + ) = parent + } + ) testSdkConfig = TestSdkConfigs.CURRENT_WITH_RESOURCES } @Test fun getResource_delegateToAppClassloaderWithPrefix() { - val classLoader = factoryUnderTest.createClassLoaderFor( - testSdkConfig, - appClassloader.parent!! - ) + val classLoader = + factoryUnderTest.createClassLoaderFor(testSdkConfig, appClassloader.parent!!) val resource = classLoader.getResource("test.txt") - val appResource = appClassloader.getResource( - "assets/RuntimeEnabledSdks/javaresources/test.txt" - ) + val appResource = + appClassloader.getResource("assets/RuntimeEnabledSdks/javaresources/test.txt") assertThat(resource).isNotNull() assertThat(resource).isEqualTo(appResource) } @Test fun getResource_whenAppResource_returnNull() { - val classLoader = factoryUnderTest.createClassLoaderFor( - testSdkConfig, - appClassloader.parent!! - ) + val classLoader = + factoryUnderTest.createClassLoaderFor(testSdkConfig, appClassloader.parent!!) val resource = classLoader.getResource("assets/RuntimeEnabledSdkTable.xml") val appResource = appClassloader.getResource("assets/RuntimeEnabledSdkTable.xml") @@ -77,29 +76,22 @@ @Test fun getResources_delegateToAppClassloaderWithPrefix() { - val classLoader = factoryUnderTest.createClassLoaderFor( - testSdkConfig, - appClassloader.parent!! - ) + val classLoader = + factoryUnderTest.createClassLoaderFor(testSdkConfig, appClassloader.parent!!) - val resources = classLoader - .getResources("test.txt") - .toList() + val resources = classLoader.getResources("test.txt").toList() assertThat(resources.isEmpty()).isFalse() - val appResources = appClassloader - .getResources("assets/RuntimeEnabledSdks/javaresources/test.txt") - .toList() + val appResources = + appClassloader.getResources("assets/RuntimeEnabledSdks/javaresources/test.txt").toList() assertThat(appResources).isEqualTo(resources) } @Test fun getResources_whenAppResource_returnEmpty() { - val classLoader = factoryUnderTest.createClassLoaderFor( - testSdkConfig, - appClassloader.parent!! - ) + val classLoader = + factoryUnderTest.createClassLoaderFor(testSdkConfig, appClassloader.parent!!) val resources = classLoader.getResources("assets/RuntimeEnabledSdkTable.xml") val appResources = appClassloader.getResources("assets/RuntimeEnabledSdkTable.xml")
diff --git a/privacysandbox/sdkruntime/sdkruntime-client/src/androidTest/java/androidx/privacysandbox/sdkruntime/client/loader/LocalSdkProviderTest.kt b/privacysandbox/sdkruntime/sdkruntime-client/src/androidTest/java/androidx/privacysandbox/sdkruntime/client/loader/LocalSdkProviderTest.kt index 5e45032..5d5d62a 100644 --- a/privacysandbox/sdkruntime/sdkruntime-client/src/androidTest/java/androidx/privacysandbox/sdkruntime/client/loader/LocalSdkProviderTest.kt +++ b/privacysandbox/sdkruntime/sdkruntime-client/src/androidTest/java/androidx/privacysandbox/sdkruntime/client/loader/LocalSdkProviderTest.kt
@@ -69,21 +69,20 @@ controller = TestStubController() - val overrideVersionHandshake = if (originalSdkVersion != forcedSdkVersion) { - VersionHandshake(forcedSdkVersion) - } else { - null - } + val overrideVersionHandshake = + if (originalSdkVersion != forcedSdkVersion) { + VersionHandshake(forcedSdkVersion) + } else { + null + } loadedSdk = loadTestSdkFromAssets(sdkConfig, controller, overrideVersionHandshake) - assertThat(loadedSdk.extractApiVersion()) - .isEqualTo(originalSdkVersion) + assertThat(loadedSdk.extractApiVersion()).isEqualTo(originalSdkVersion) } @Test fun loadSdk_attachCorrectContext() { val sdkContext = loadedSdk.extractSdkContext() - assertThat(sdkContext.javaClass.name) - .isEqualTo(SandboxedSdkContextCompat::class.java.name) + assertThat(sdkContext.javaClass.name).isEqualTo(SandboxedSdkContextCompat::class.java.name) } @Test @@ -92,14 +91,16 @@ val sandboxedSdkCompat = loadedSdk.onLoadSdk(params) - val expectedBinder = loadedSdk.extractSdkProviderFieldValue( - fieldName = "onLoadSdkBinder", - ) + val expectedBinder = + loadedSdk.extractSdkProviderFieldValue( + fieldName = "onLoadSdkBinder", + ) assertThat(sandboxedSdkCompat.getInterface()).isEqualTo(expectedBinder) - val lastParams = loadedSdk.extractSdkProviderFieldValue( - fieldName = "lastOnLoadSdkParams", - ) + val lastParams = + loadedSdk.extractSdkProviderFieldValue( + fieldName = "lastOnLoadSdkParams", + ) assertThat(lastParams).isEqualTo(params) } @@ -108,9 +109,7 @@ val params = Bundle() params.putBoolean("needFail", true) - val ex = assertThrows(LoadSdkCompatException::class.java) { - loadedSdk.onLoadSdk(params) - } + val ex = assertThrows(LoadSdkCompatException::class.java) { loadedSdk.onLoadSdk(params) } assertThat(ex.extraInformation).isEqualTo(params) } @@ -119,9 +118,8 @@ fun beforeUnloadSdk_callBeforeUnloadSdk() { loadedSdk.beforeUnloadSdk() - val isBeforeUnloadSdkCalled = loadedSdk.extractSdkProviderFieldValue( - fieldName = "isBeforeUnloadSdkCalled" - ) + val isBeforeUnloadSdkCalled = + loadedSdk.extractSdkProviderFieldValue(fieldName = "isBeforeUnloadSdkCalled") assertThat(isBeforeUnloadSdkCalled).isTrue() } @@ -130,16 +128,12 @@ fun getSandboxedSdks_delegateToSdkController() { assumeFeatureAvailable(ClientFeature.SDK_SANDBOX_CONTROLLER) - val expectedResult = SandboxedSdkCompat( - sdkInterface = Binder(), - sdkInfo = SandboxedSdkInfo( - name = "sdkName", - version = 42 + val expectedResult = + SandboxedSdkCompat( + sdkInterface = Binder(), + sdkInfo = SandboxedSdkInfo(name = "sdkName", version = 42) ) - ) - controller.sandboxedSdksResult = listOf( - expectedResult - ) + controller.sandboxedSdksResult = listOf(expectedResult) val testSdk = loadedSdk.loadTestSdk() val sandboxedSdks = testSdk.getSandboxedSdks() @@ -155,14 +149,13 @@ fun getAppOwnedSdkSandboxInterfaces_delegateToSdkController() { assumeFeatureAvailable(ClientFeature.APP_OWNED_INTERFACES) - val expectedResult = AppOwnedSdkSandboxInterfaceCompat( - name = "TestAppOwnedSdk", - version = 42, - binder = Binder(), - ) - controller.appOwnedSdksResult = listOf( - expectedResult - ) + val expectedResult = + AppOwnedSdkSandboxInterfaceCompat( + name = "TestAppOwnedSdk", + version = 42, + binder = Binder(), + ) + controller.appOwnedSdksResult = listOf(expectedResult) val testSdk = loadedSdk.loadTestSdk() val appOwnedSdks = testSdk.getAppOwnedSdkSandboxInterfaces() @@ -258,17 +251,19 @@ fun loadSdk_rethrowsExceptionFromSdkController() { assumeFeatureAvailable(ClientFeature.LOAD_SDK) - val expectedError = LoadSdkCompatException( - LoadSdkCompatException.LOAD_SDK_INTERNAL_ERROR, - "message", - RuntimeException(), - Bundle() - ) + val expectedError = + LoadSdkCompatException( + LoadSdkCompatException.LOAD_SDK_INTERNAL_ERROR, + "message", + RuntimeException(), + Bundle() + ) controller.loadSdkError = expectedError - val result = assertThrows(LoadSdkCompatException::class.java) { - loadedSdk.loadTestSdk().loadSdk("SDK", Bundle()) - } + val result = + assertThrows(LoadSdkCompatException::class.java) { + loadedSdk.loadTestSdk().loadSdk("SDK", Bundle()) + } assertThat(result.loadSdkErrorCode).isEqualTo(expectedError.loadSdkErrorCode) assertThat(result.message).isEqualTo(expectedError.message) @@ -276,9 +271,8 @@ assertThat(result.extraInformation).isSameInstanceAs(expectedError.extraInformation) } - internal class TestClassLoaderFactory( - private val testStorage: TestLocalSdkStorage - ) : SdkLoader.ClassLoaderFactory { + internal class TestClassLoaderFactory(private val testStorage: TestLocalSdkStorage) : + SdkLoader.ClassLoaderFactory { override fun createClassLoaderFor( sdkConfig: LocalSdkConfig, parent: ClassLoader @@ -309,9 +303,9 @@ companion object { /** - * Create test params for each supported [ClientApiVersion] + current and future. - * Each released version must have test-sdk named as "vX" (where X is version to test). - * These TestSDKs should be registered in RuntimeEnabledSdkTable.xml and be compatible with + * Create test params for each supported [ClientApiVersion] + current and future. Each + * released version must have test-sdk named as "vX" (where X is version to test). These + * TestSDKs should be registered in RuntimeEnabledSdkTable.xml and be compatible with * [TestSdkWrapper]. */ @Parameterized.Parameters(name = "{0}") @@ -356,17 +350,16 @@ overrideVersionHandshake: VersionHandshake? ): LocalSdkProvider { val context = ApplicationProvider.getApplicationContext() - val testStorage = TestLocalSdkStorage( - context, - rootFolder = File(context.cacheDir, "LocalSdkTest") - ) - val sdkLoader = SdkLoader( - TestClassLoaderFactory(testStorage), - context, - object : SdkLoader.ControllerFactory { - override fun createControllerFor(sdkConfig: LocalSdkConfig) = controller - } - ) + val testStorage = + TestLocalSdkStorage(context, rootFolder = File(context.cacheDir, "LocalSdkTest")) + val sdkLoader = + SdkLoader( + TestClassLoaderFactory(testStorage), + context, + object : SdkLoader.ControllerFactory { + override fun createControllerFor(sdkConfig: LocalSdkConfig) = controller + } + ) return sdkLoader.loadSdk(sdkConfig, overrideVersionHandshake) } } @@ -393,9 +386,7 @@ lastLoadSdkParams = params if (loadSdkResult != null) { - executor.execute { - callback.onResult(loadSdkResult!!) - } + executor.execute { callback.onResult(loadSdkResult!!) } } else { executor.execute { callback.onError(
diff --git a/privacysandbox/sdkruntime/sdkruntime-client/src/androidTest/java/androidx/privacysandbox/sdkruntime/client/loader/LocalSdkTestUtils.kt b/privacysandbox/sdkruntime/sdkruntime-client/src/androidTest/java/androidx/privacysandbox/sdkruntime/client/loader/LocalSdkTestUtils.kt index bf7f249..f0225b7 100644 --- a/privacysandbox/sdkruntime/sdkruntime-client/src/androidTest/java/androidx/privacysandbox/sdkruntime/client/loader/LocalSdkTestUtils.kt +++ b/privacysandbox/sdkruntime/sdkruntime-client/src/androidTest/java/androidx/privacysandbox/sdkruntime/client/loader/LocalSdkTestUtils.kt
@@ -32,65 +32,45 @@ import java.util.concurrent.CountDownLatch import kotlin.reflect.cast -/** - * Extract value of [Versions.API_VERSION] from loaded SDK. - */ -internal fun LocalSdkProvider.extractApiVersion(): Int = - extractVersionValue("API_VERSION") +/** Extract value of [Versions.API_VERSION] from loaded SDK. */ +internal fun LocalSdkProvider.extractApiVersion(): Int = extractVersionValue("API_VERSION") -/** - * Extract value of [Versions.CLIENT_VERSION] from loaded SDK. - */ -internal fun LocalSdkProvider.extractClientVersion(): Int = - extractVersionValue("CLIENT_VERSION") +/** Extract value of [Versions.CLIENT_VERSION] from loaded SDK. */ +internal fun LocalSdkProvider.extractClientVersion(): Int = extractVersionValue("CLIENT_VERSION") -/** - * Extract [SandboxedSdkProviderCompat.context] from loaded SDK. - */ +/** Extract [SandboxedSdkProviderCompat.context] from loaded SDK. */ internal fun LocalSdkProvider.extractSdkContext(): Context { - val getContextMethod = sdkProvider - .javaClass - .getMethod("getContext") + val getContextMethod = sdkProvider.javaClass.getMethod("getContext") val rawContext = getContextMethod.invoke(sdkProvider) return Context::class.cast(rawContext) } -/** - * Extract field value from [SandboxedSdkProviderCompat] - */ +/** Extract field value from [SandboxedSdkProviderCompat] */ internal inline funLocalSdkProvider.extractSdkProviderFieldValue( fieldName: String ): T { - return sdkProvider - .javaClass - .getField(fieldName) - .get(sdkProvider)!! as T + return sdkProvider.javaClass.getField(fieldName).get(sdkProvider)!! as T } -/** - * Extract classloader that was used for loading of [SandboxedSdkProviderCompat]. - */ +/** Extract classloader that was used for loading of [SandboxedSdkProviderCompat]. */ internal fun LocalSdkProvider.extractSdkProviderClassloader(): ClassLoader = sdkProvider.javaClass.classLoader!! /** - * Reflection wrapper for TestSDK object. - * Underlying TestSDK should implement and delegate to + * Reflection wrapper for TestSDK object. Underlying TestSDK should implement and delegate to * [androidx.privacysandbox.sdkruntime.core.controller.SdkSandboxControllerCompat]: - * 1) getSandboxedSdks() : List- * 2) getAppOwnedSdkSandboxInterfaces() : List - * 3) registerSdkSandboxActivityHandler(SdkSandboxActivityHandlerCompat) : IBinder - * 4) unregisterSdkSandboxActivityHandler(SdkSandboxActivityHandlerCompat) - * 5) loadSdk(sdkName, sdkParams) : SandboxedSdkCompat + * 1) getSandboxedSdks() : List + * 2) getAppOwnedSdkSandboxInterfaces() : List + * 3) registerSdkSandboxActivityHandler(SdkSandboxActivityHandlerCompat) : IBinder + * 4) unregisterSdkSandboxActivityHandler(SdkSandboxActivityHandlerCompat) + * 5) loadSdk(sdkName, sdkParams) : SandboxedSdkCompat */ -internal class TestSdkWrapper( - private val sdk: Any -) { +internal class TestSdkWrapper(private val sdk: Any) { fun loadSdk(sdkName: String, sdkParams: Bundle): SandboxedSdkWrapper { - val loadSdkMethod = sdk.javaClass - .getMethod("loadSdk", String::class.java, Bundle::class.java) + val loadSdkMethod = + sdk.javaClass.getMethod("loadSdk", String::class.java, Bundle::class.java) try { val rawSandboxedSdkCompat = loadSdkMethod.invoke(sdk, sdkName, sdkParams) as Any @@ -106,54 +86,41 @@ } val errorCode = rawException.callMethod("getLoadSdkErrorCode") as Int val params = rawException.callMethod("getExtraInformation") as Bundle - return LoadSdkCompatException( - errorCode, - rawException.message, - rawException.cause, - params - ) + return LoadSdkCompatException(errorCode, rawException.message, rawException.cause, params) } fun getSandboxedSdks(): List { - val sdks = sdk.callMethod( - methodName = "getSandboxedSdks" - ) as List<*> + val sdks = sdk.callMethod(methodName = "getSandboxedSdks") as List<*> return sdks.map { SandboxedSdkWrapper(it!!) } } fun getAppOwnedSdkSandboxInterfaces(): List{ - val sdks = sdk.callMethod( - methodName = "getAppOwnedSdkSandboxInterfaces" - ) as List<*> + val sdks = sdk.callMethod(methodName = "getAppOwnedSdkSandboxInterfaces") as List<*> return sdks.map { AppOwnedSdkWrapper(it!!) } } fun registerSdkSandboxActivityHandler(handler: CatchingSdkActivityHandler): IBinder { val classLoader = sdk.javaClass.classLoader!! - val activityHandlerClass = Class.forName( - SdkSandboxActivityHandlerCompat::class.java.name, - false, - classLoader - ) + val activityHandlerClass = + Class.forName(SdkSandboxActivityHandlerCompat::class.java.name, false, classLoader) - val proxy = Proxy.newProxyInstance( - classLoader, - arrayOf(activityHandlerClass) - ) { proxy, method, args -> - when (method.name) { - "hashCode" -> hashCode() - "equals" -> proxy === args[0] - "onActivityCreated" -> handler.setResult(args[0]) - else -> { - throw UnsupportedOperationException( - "Unexpected method call object:$proxy, method: $method, args: $args" - ) + val proxy = + Proxy.newProxyInstance(classLoader, arrayOf(activityHandlerClass)) { proxy, method, args + -> + when (method.name) { + "hashCode" -> hashCode() + "equals" -> proxy === args[0] + "onActivityCreated" -> handler.setResult(args[0]) + else -> { + throw UnsupportedOperationException( + "Unexpected method call object:$proxy, method: $method, args: $args" + ) + } } } - } - val registerMethod = sdk.javaClass - .getMethod("registerSdkSandboxActivityHandler", activityHandlerClass) + val registerMethod = + sdk.javaClass.getMethod("registerSdkSandboxActivityHandler", activityHandlerClass) val token = registerMethod.invoke(sdk, proxy) as IBinder handler.proxy = proxy @@ -163,38 +130,27 @@ fun unregisterSdkSandboxActivityHandler(handler: CatchingSdkActivityHandler) { val classLoader = sdk.javaClass.classLoader!! - val activityHandlerClass = Class.forName( - SdkSandboxActivityHandlerCompat::class.java.name, - false, - classLoader - ) + val activityHandlerClass = + Class.forName(SdkSandboxActivityHandlerCompat::class.java.name, false, classLoader) - val unregisterMethod = sdk.javaClass - .getMethod("unregisterSdkSandboxActivityHandler", activityHandlerClass) + val unregisterMethod = + sdk.javaClass.getMethod("unregisterSdkSandboxActivityHandler", activityHandlerClass) unregisterMethod.invoke(sdk, handler.proxy) handler.proxy = null } } -/** - * Reflection wrapper for [SandboxedSdkCompat] - */ -internal class SandboxedSdkWrapper( - private val sdk: Any -) { +/** Reflection wrapper for [SandboxedSdkCompat] */ +internal class SandboxedSdkWrapper(private val sdk: Any) { fun getInterface(): IBinder? { - return sdk.callMethod( - methodName = "getInterface" - ) as IBinder? + return sdk.callMethod(methodName = "getInterface") as IBinder? } fun getSdkName(): String? { val sdkInfo = getSdkInfo() if (sdkInfo != null) { - return sdkInfo.callMethod( - methodName = "getName" - ) as String + return sdkInfo.callMethod(methodName = "getName") as String } return null } @@ -202,48 +158,34 @@ fun getSdkVersion(): Long? { val sdkInfo = getSdkInfo() if (sdkInfo != null) { - return sdkInfo.callMethod( - methodName = "getVersion" - ) as Long + return sdkInfo.callMethod(methodName = "getVersion") as Long } return null } private fun getSdkInfo(): Any? { - return sdk.callMethod( - methodName = "getSdkInfo" - ) + return sdk.callMethod(methodName = "getSdkInfo") } } -/** - * Reflection wrapper for [AppOwnedSdkSandboxInterfaceCompat] - */ -internal class AppOwnedSdkWrapper( - private val sdk: Any -) { +/** Reflection wrapper for [AppOwnedSdkSandboxInterfaceCompat] */ +internal class AppOwnedSdkWrapper(private val sdk: Any) { fun getName(): String { - return sdk.callMethod( - methodName = "getName" - ) as String + return sdk.callMethod(methodName = "getName") as String } fun getVersion(): Long { - return sdk.callMethod( - methodName = "getVersion" - ) as Long + return sdk.callMethod(methodName = "getVersion") as Long } fun getInterface(): IBinder { - return sdk.callMethod( - methodName = "getInterface" - ) as IBinder + return sdk.callMethod(methodName = "getInterface") as IBinder } } /** - * ActivityHandler to use with [TestSdkWrapper.registerSdkSandboxActivityHandler]. - * Store received ActivityHolder. + * ActivityHandler to use with [TestSdkWrapper.registerSdkSandboxActivityHandler]. Store received + * ActivityHolder. */ internal class CatchingSdkActivityHandler { var proxy: Any? = null @@ -261,34 +203,23 @@ async.countDown() } -/** - * Reflection wrapper for [androidx.privacysandbox.sdkruntime.core.activity.ActivityHolder] - */ -internal class ActivityHolderWrapper( - private val activityHolder: Any -) { +/** Reflection wrapper for [androidx.privacysandbox.sdkruntime.core.activity.ActivityHolder] */ +internal class ActivityHolderWrapper(private val activityHolder: Any) { fun getActivity(): Activity { - return activityHolder.callMethod( - methodName = "getActivity" - ) as Activity + return activityHolder.callMethod(methodName = "getActivity") as Activity } fun getLifeCycleCurrentState(): Lifecycle.State { - val lifecycle = activityHolder.callMethod( - methodName = "getLifecycle" - ) - val currentState = lifecycle!!.callMethod( - methodName = "getCurrentState" - ) - val currentStateString = currentState!!.callMethod( - methodName = "name" - ) as String + val lifecycle = activityHolder.callMethod(methodName = "getLifecycle") + val currentState = lifecycle!!.callMethod(methodName = "getCurrentState") + val currentStateString = currentState!!.callMethod(methodName = "name") as String return Lifecycle.State.valueOf(currentStateString) } } /** * Load SDK and wrap it as TestSDK. + * * @see [TestSdkWrapper] */ internal fun LocalSdkProvider.loadTestSdk(): TestSdkWrapper { @@ -297,6 +228,7 @@ /** * Wrap SandboxedSdkCompat as TestSDK. + * * @see [SandboxedSdkWrapper] */ internal fun SandboxedSdkCompat.asTestSdk(): TestSdkWrapper { @@ -304,16 +236,11 @@ } private fun Any.callMethod(methodName: String): Any? { - return javaClass - .getMethod(methodName) - .invoke(this) + return javaClass.getMethod(methodName).invoke(this) } private fun LocalSdkProvider.extractVersionValue(versionFieldName: String): Int { - val versionsClass = Class.forName( - Versions::class.java.name, - false, - extractSdkProviderClassloader() - ) + val versionsClass = + Class.forName(Versions::class.java.name, false, extractSdkProviderClassloader()) return versionsClass.getDeclaredField(versionFieldName).get(null) as Int }
diff --git a/privacysandbox/sdkruntime/sdkruntime-client/src/androidTest/java/androidx/privacysandbox/sdkruntime/client/loader/SandboxedSdkContextCompatTest.kt b/privacysandbox/sdkruntime/sdkruntime-client/src/androidTest/java/androidx/privacysandbox/sdkruntime/client/loader/SandboxedSdkContextCompatTest.kt index d454082..af2fbef 100644 --- a/privacysandbox/sdkruntime/sdkruntime-client/src/androidTest/java/androidx/privacysandbox/sdkruntime/client/loader/SandboxedSdkContextCompatTest.kt +++ b/privacysandbox/sdkruntime/sdkruntime-client/src/androidTest/java/androidx/privacysandbox/sdkruntime/client/loader/SandboxedSdkContextCompatTest.kt
@@ -41,8 +41,7 @@ @Test fun getClassloader_returnSdkClassloader() { val sdkClassLoader = javaClass.classLoader!!.parent!! - assertThat(sdkContextCompat.classLoader) - .isEqualTo(sdkClassLoader) + assertThat(sdkContextCompat.classLoader).isEqualTo(sdkClassLoader) } @Test @@ -50,8 +49,7 @@ val expectedSdksRoot = appStorageContext.getDir(SDK_ROOT_FOLDER, Context.MODE_PRIVATE) val expectedSdkDataDir = File(expectedSdksRoot, SDK_PACKAGE_NAME) - assertThat(sdkContextCompat.dataDir) - .isEqualTo(expectedSdkDataDir) + assertThat(sdkContextCompat.dataDir).isEqualTo(expectedSdkDataDir) assertThat(expectedSdkDataDir.exists()).isTrue() } @@ -61,8 +59,7 @@ val expectedSdksCacheRoot = File(appStorageContext.cacheDir, SDK_ROOT_FOLDER) val expectedSdkCache = File(expectedSdksCacheRoot, SDK_PACKAGE_NAME) - assertThat(sdkContextCompat.cacheDir) - .isEqualTo(expectedSdkCache) + assertThat(sdkContextCompat.cacheDir).isEqualTo(expectedSdkCache) assertThat(expectedSdkCache.exists()).isTrue() } @@ -73,8 +70,7 @@ val expectedSdksCodeCacheRoot = File(appStorageContext.codeCacheDir, SDK_ROOT_FOLDER) val expectedSdkCodeCache = File(expectedSdksCodeCacheRoot, SDK_PACKAGE_NAME) - assertThat(sdkContextCompat.codeCacheDir) - .isEqualTo(expectedSdkCodeCache) + assertThat(sdkContextCompat.codeCacheDir).isEqualTo(expectedSdkCodeCache) assertThat(expectedSdkCodeCache.exists()).isTrue() } @@ -85,8 +81,7 @@ val expectedSdksNoBackupRoot = File(appStorageContext.noBackupFilesDir, SDK_ROOT_FOLDER) val expectedSdkNoBackupDir = File(expectedSdksNoBackupRoot, SDK_PACKAGE_NAME) - assertThat(sdkContextCompat.noBackupFilesDir) - .isEqualTo(expectedSdkNoBackupDir) + assertThat(sdkContextCompat.noBackupFilesDir).isEqualTo(expectedSdkNoBackupDir) assertThat(expectedSdkNoBackupDir.exists()).isTrue() } @@ -95,8 +90,7 @@ fun getDir_returnDirWithPrefixInSdkDataDir() { val expectedDir = File(sdkContextCompat.dataDir, "app_test") - assertThat(sdkContextCompat.getDir("test", Context.MODE_PRIVATE)) - .isEqualTo(expectedDir) + assertThat(sdkContextCompat.getDir("test", Context.MODE_PRIVATE)).isEqualTo(expectedDir) assertThat(expectedDir.exists()).isTrue() } @@ -105,8 +99,7 @@ fun getFilesDir_returnFilesDirInSdkDataDir() { val expectedFilesDir = File(sdkContextCompat.dataDir, "files") - assertThat(sdkContextCompat.filesDir) - .isEqualTo(expectedFilesDir) + assertThat(sdkContextCompat.filesDir).isEqualTo(expectedFilesDir) assertThat(expectedFilesDir.exists()).isTrue() } @@ -115,77 +108,60 @@ fun openFileInput_openFileInSdkFilesDir() { val fileToOpen = File(sdkContextCompat.filesDir, "testOpenFileInput") fileToOpen.outputStream().use { outputStream -> - DataOutputStream(outputStream).use { dataStream -> - dataStream.writeInt(42) - } + DataOutputStream(outputStream).use { dataStream -> dataStream.writeInt(42) } } - val content = sdkContextCompat.openFileInput("testOpenFileInput") - .use { inputStream -> - DataInputStream(inputStream).use { dataStream -> - dataStream.readInt() - } + val content = + sdkContextCompat.openFileInput("testOpenFileInput").use { inputStream -> + DataInputStream(inputStream).use { dataStream -> dataStream.readInt() } } - assertThat(content) - .isEqualTo(42) + assertThat(content).isEqualTo(42) } @Test fun openFileInput_whenFileNameContainsFileSeparator_throwsIllegalArgumentException() { - assertThrows{ - sdkContextCompat.openFileInput("folder/file") - } + assertThrows{ sdkContextCompat.openFileInput("folder/file") } } @Test fun openFileOutput_openFileInSdkFilesDir() { - sdkContextCompat.openFileOutput("testOpenFileOutput", Context.MODE_PRIVATE) - .use { outputStream -> - DataOutputStream(outputStream).use { dataStream -> - dataStream.writeInt(42) - } - } - - val expectedFile = File(sdkContextCompat.filesDir, "testOpenFileOutput") - val content = expectedFile.inputStream().use { inputStream -> - DataInputStream(inputStream).use { dataStream -> - dataStream.readInt() - } + sdkContextCompat.openFileOutput("testOpenFileOutput", Context.MODE_PRIVATE).use { + outputStream -> + DataOutputStream(outputStream).use { dataStream -> dataStream.writeInt(42) } } - assertThat(content) - .isEqualTo(42) + val expectedFile = File(sdkContextCompat.filesDir, "testOpenFileOutput") + val content = + expectedFile.inputStream().use { inputStream -> + DataInputStream(inputStream).use { dataStream -> dataStream.readInt() } + } + + assertThat(content).isEqualTo(42) } @Test fun openFileOutput_whenAppendFlagSet_appendToFileInSdkFilesDir() { - sdkContextCompat.openFileOutput( - "testOpenFileOutputAppend", - Context.MODE_PRIVATE or Context.MODE_APPEND - ).use { outputStream -> - DataOutputStream(outputStream).use { dataStream -> - dataStream.writeInt(42) + sdkContextCompat + .openFileOutput("testOpenFileOutputAppend", Context.MODE_PRIVATE or Context.MODE_APPEND) + .use { outputStream -> + DataOutputStream(outputStream).use { dataStream -> dataStream.writeInt(42) } } - } - sdkContextCompat.openFileOutput( - "testOpenFileOutputAppend", - Context.MODE_PRIVATE or Context.MODE_APPEND - ).use { outputStream -> - DataOutputStream(outputStream).use { dataStream -> - dataStream.writeInt(1) + sdkContextCompat + .openFileOutput("testOpenFileOutputAppend", Context.MODE_PRIVATE or Context.MODE_APPEND) + .use { outputStream -> + DataOutputStream(outputStream).use { dataStream -> dataStream.writeInt(1) } } - } val expectedFile = File(sdkContextCompat.filesDir, "testOpenFileOutputAppend") - val content = expectedFile.inputStream().use { inputStream -> - DataInputStream(inputStream).use { dataStream -> - dataStream.readInt() + dataStream.readInt() + val content = + expectedFile.inputStream().use { inputStream -> + DataInputStream(inputStream).use { dataStream -> + dataStream.readInt() + dataStream.readInt() + } } - } - assertThat(content) - .isEqualTo(43) + assertThat(content).isEqualTo(43) } @Test @@ -207,9 +183,7 @@ @Test fun deleteFile_whenFileNameContainsFileSeparator_throwsIllegalArgumentException() { - assertThrows{ - sdkContextCompat.deleteFile("folder/file") - } + assertThrows{ sdkContextCompat.deleteFile("folder/file") } } @Test @@ -222,9 +196,7 @@ @Test fun getFileStreamPath_whenFileNameContainsFileSeparator_throwsIllegalArgumentException() { - assertThrows{ - sdkContextCompat.getFileStreamPath("folder/file") - } + assertThrows{ sdkContextCompat.getFileStreamPath("folder/file") } } @Test @@ -239,10 +211,7 @@ @Test fun getDatabasePath_whenDataBaseNamePassed_returnPathToDatabaseInSdkDatabasesDir() { - val expectedDatabasePath = File( - sdkContextCompat.dataDir, - "databases/testGetDatabasePath" - ) + val expectedDatabasePath = File(sdkContextCompat.dataDir, "databases/testGetDatabasePath") assertThat(sdkContextCompat.getDatabasePath("testGetDatabasePath")) .isEqualTo(expectedDatabasePath) @@ -250,10 +219,8 @@ @Test fun getDatabasePath_whenDataBasePathPassed_returnSamePath() { - val expectedDatabasePath = File( - sdkContextCompat.dataDir, - "databases/testGetDatabasePathAbsolute" - ) + val expectedDatabasePath = + File(sdkContextCompat.dataDir, "databases/testGetDatabasePathAbsolute") assertThat(sdkContextCompat.getDatabasePath(expectedDatabasePath.absolutePath)) .isEqualTo(expectedDatabasePath) @@ -264,26 +231,27 @@ val databaseName = "testOpenDataBase.db" sdkContextCompat.deleteDatabase(databaseName) - val database = sdkContextCompat.openOrCreateDatabase( - name = databaseName, - mode = Context.MODE_PRIVATE, - factory = null - ) + val database = + sdkContextCompat.openOrCreateDatabase( + name = databaseName, + mode = Context.MODE_PRIVATE, + factory = null + ) database.execSQL("CREATE TABLE test (data int)") database.execSQL("INSERT INTO test (data) values (42)") - val databaseFrom4ParamMethod = sdkContextCompat.openOrCreateDatabase( - name = databaseName, - mode = Context.MODE_PRIVATE, - factory = null, - errorHandler = null - ) + val databaseFrom4ParamMethod = + sdkContextCompat.openOrCreateDatabase( + name = databaseName, + mode = Context.MODE_PRIVATE, + factory = null, + errorHandler = null + ) val result = databaseFrom4ParamMethod.rawQuery("SELECT * FROM test", null) result.moveToFirst() - assertThat(result.getInt(0)) - .isEqualTo(42) + assertThat(result.getInt(0)).isEqualTo(42) val databasePath = sdkContextCompat.getDatabasePath(databaseName) assertThat(databasePath.exists()).isTrue() @@ -315,33 +283,34 @@ val result = sdkContextCompat.databaseList().asList() assertThat(result).contains(databaseName) - assertThat(result).isEqualTo( - File(sdkContextCompat.dataDir, "databases").list()!!.asList() - ) + assertThat(result).isEqualTo(File(sdkContextCompat.dataDir, "databases").list()!!.asList()) } @Test @SdkSuppress(minSdkVersion = Build.VERSION_CODES.N) fun moveDatabaseFrom_migrateDatabaseToSdkDatabasesDir() { - val sourceAppStorageContext = if (sdkContextCompat.isDeviceProtectedStorage) { - ApplicationProvider.getApplicationContext() - } else { - appStorageContext.createDeviceProtectedStorageContext() - } - val sourceContext = SandboxedSdkContextCompat( - sourceAppStorageContext, - sdkPackageName = SDK_PACKAGE_NAME, - classLoader = javaClass.classLoader!!.parent!! - ) + val sourceAppStorageContext = + if (sdkContextCompat.isDeviceProtectedStorage) { + ApplicationProvider.getApplicationContext() + } else { + appStorageContext.createDeviceProtectedStorageContext() + } + val sourceContext = + SandboxedSdkContextCompat( + sourceAppStorageContext, + sdkPackageName = SDK_PACKAGE_NAME, + classLoader = javaClass.classLoader!!.parent!! + ) val databaseName = "testMoveTo$contextType.db" sourceContext.deleteDatabase(databaseName) - val database = sourceContext.openOrCreateDatabase( - name = databaseName, - mode = Context.MODE_PRIVATE, - factory = null - ) + val database = + sourceContext.openOrCreateDatabase( + name = databaseName, + mode = Context.MODE_PRIVATE, + factory = null + ) database.execSQL("CREATE TABLE test (data int)") database.execSQL("INSERT INTO test (data) values (42)") @@ -349,16 +318,16 @@ val moveResult = sdkContextCompat.moveDatabaseFrom(sourceContext, databaseName) assertThat(moveResult).isTrue() - val migratedDatabase = sdkContextCompat.openOrCreateDatabase( - name = databaseName, - mode = Context.MODE_PRIVATE, - factory = null - ) + val migratedDatabase = + sdkContextCompat.openOrCreateDatabase( + name = databaseName, + mode = Context.MODE_PRIVATE, + factory = null + ) val result = migratedDatabase.rawQuery("SELECT * FROM test", null) result.moveToFirst() - assertThat(result.getInt(0)) - .isEqualTo(42) + assertThat(result.getInt(0)).isEqualTo(42) val oldDatabasePath = sourceContext.getDatabasePath(databaseName) assertThat(oldDatabasePath.exists()).isFalse() @@ -367,17 +336,16 @@ @Test fun getSharedPreferences_returnPrefixedSharedPreferencesFromApp() { val sdkSharedPreferencesName = "getSharedPreferencesTest" - val sdkSharedPreferences = sdkContextCompat.getSharedPreferences( - sdkSharedPreferencesName, - Context.MODE_PRIVATE - ) + val sdkSharedPreferences = + sdkContextCompat.getSharedPreferences(sdkSharedPreferencesName, Context.MODE_PRIVATE) sdkSharedPreferences.edit().putInt("test", 42).commit() - val appSharedPreferences = appStorageContext.getSharedPreferences( - "${SDK_SHARED_PREFERENCES_PREFIX}_${SDK_PACKAGE_NAME}_$sdkSharedPreferencesName", - Context.MODE_PRIVATE - ) + val appSharedPreferences = + appStorageContext.getSharedPreferences( + "${SDK_SHARED_PREFERENCES_PREFIX}_${SDK_PACKAGE_NAME}_$sdkSharedPreferencesName", + Context.MODE_PRIVATE + ) val result = appSharedPreferences.getInt("test", 0) assertThat(result).isEqualTo(42) } @@ -386,63 +354,52 @@ @SdkSuppress(minSdkVersion = Build.VERSION_CODES.N) fun deleteSharedPreferences() { val sdkSharedPreferencesName = "deleteSharedPreferencesTest" - val sdkSharedPreferences = sdkContextCompat.getSharedPreferences( - sdkSharedPreferencesName, - Context.MODE_PRIVATE - ) + val sdkSharedPreferences = + sdkContextCompat.getSharedPreferences(sdkSharedPreferencesName, Context.MODE_PRIVATE) sdkSharedPreferences.edit().putInt("test", 42).commit() sdkContextCompat.deleteSharedPreferences(sdkSharedPreferencesName) - val sdkSharedPreferencesAfterDelete = sdkContextCompat.getSharedPreferences( - sdkSharedPreferencesName, - Context.MODE_PRIVATE - ) + val sdkSharedPreferencesAfterDelete = + sdkContextCompat.getSharedPreferences(sdkSharedPreferencesName, Context.MODE_PRIVATE) assertThat(sdkSharedPreferencesAfterDelete.contains("test")).isFalse() } @Test @SdkSuppress(minSdkVersion = Build.VERSION_CODES.N) fun moveSharedPreferencesFrom_migrateSharedPreferencesFromAnotherSdkContext() { - val sourceAppStorageContext = if (sdkContextCompat.isDeviceProtectedStorage) { - ApplicationProvider.getApplicationContext() - } else { - appStorageContext.createDeviceProtectedStorageContext() - } - val sourceContext = SandboxedSdkContextCompat( - sourceAppStorageContext, - sdkPackageName = SDK_PACKAGE_NAME, - classLoader = javaClass.classLoader!!.parent!! - ) + val sourceAppStorageContext = + if (sdkContextCompat.isDeviceProtectedStorage) { + ApplicationProvider.getApplicationContext() + } else { + appStorageContext.createDeviceProtectedStorageContext() + } + val sourceContext = + SandboxedSdkContextCompat( + sourceAppStorageContext, + sdkPackageName = SDK_PACKAGE_NAME, + classLoader = javaClass.classLoader!!.parent!! + ) val sdkSharedPreferencesName = "testMoveTo$contextType" sourceContext.deleteSharedPreferences(sdkSharedPreferencesName) - val sourceSharedPreferences = sourceContext.getSharedPreferences( - sdkSharedPreferencesName, - Context.MODE_PRIVATE - ) + val sourceSharedPreferences = + sourceContext.getSharedPreferences(sdkSharedPreferencesName, Context.MODE_PRIVATE) sourceSharedPreferences.edit().putInt("test", 42).commit() - val moveResult = sdkContextCompat.moveSharedPreferencesFrom( - sourceContext, - sdkSharedPreferencesName - ) + val moveResult = + sdkContextCompat.moveSharedPreferencesFrom(sourceContext, sdkSharedPreferencesName) assertThat(moveResult).isTrue() - val migratedSharedPreferences = sdkContextCompat.getSharedPreferences( - sdkSharedPreferencesName, - Context.MODE_PRIVATE - ) + val migratedSharedPreferences = + sdkContextCompat.getSharedPreferences(sdkSharedPreferencesName, Context.MODE_PRIVATE) val result = migratedSharedPreferences.getInt("test", 0) - assertThat(result) - .isEqualTo(42) + assertThat(result).isEqualTo(42) - val oldSharedPreferences = sourceContext.getSharedPreferences( - sdkSharedPreferencesName, - Context.MODE_PRIVATE - ) + val oldSharedPreferences = + sourceContext.getSharedPreferences(sdkSharedPreferencesName, Context.MODE_PRIVATE) assertThat(oldSharedPreferences.contains("test")).isFalse() } @@ -456,18 +413,13 @@ fun params(): List> = buildList { val appContext = ApplicationProvider.getApplicationContext() - val sdkContext = SandboxedSdkContextCompat( - appContext, - sdkPackageName = SDK_PACKAGE_NAME, - classLoader = javaClass.classLoader!!.parent!! - ) - add( - arrayOf( - "SimpleContext", - sdkContext, - appContext + val sdkContext = + SandboxedSdkContextCompat( + appContext, + sdkPackageName = SDK_PACKAGE_NAME, + classLoader = javaClass.classLoader!!.parent!! ) - ) + add(arrayOf("SimpleContext", sdkContext, appContext)) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { val deviceProtectedSdkContext = sdkContext.createDeviceProtectedStorageContext()
diff --git a/privacysandbox/sdkruntime/sdkruntime-client/src/androidTest/java/androidx/privacysandbox/sdkruntime/client/loader/SdkLoaderTest.kt b/privacysandbox/sdkruntime/sdkruntime-client/src/androidTest/java/androidx/privacysandbox/sdkruntime/client/loader/SdkLoaderTest.kt index 87fccaf..ec2e47d 100644 --- a/privacysandbox/sdkruntime/sdkruntime-client/src/androidTest/java/androidx/privacysandbox/sdkruntime/client/loader/SdkLoaderTest.kt +++ b/privacysandbox/sdkruntime/sdkruntime-client/src/androidTest/java/androidx/privacysandbox/sdkruntime/client/loader/SdkLoaderTest.kt
@@ -45,10 +45,11 @@ @Before fun setUp() { val context = ApplicationProvider.getApplicationContext() - sdkLoader = SdkLoader.create( - context = context, - controllerFactory = NoOpFactory, - ) + sdkLoader = + SdkLoader.create( + context = context, + controllerFactory = NoOpFactory, + ) testSdkConfig = TestSdkConfigs.CURRENT_WITH_RESOURCES // Clean extracted SDKs between tests @@ -60,19 +61,15 @@ fun loadSdk_callVersionsHandShake() { val loadedSdk = sdkLoader.loadSdk(testSdkConfig) - assertThat(loadedSdk.extractClientVersion()) - .isEqualTo(Versions.API_VERSION) + assertThat(loadedSdk.extractClientVersion()).isEqualTo(Versions.API_VERSION) } @Test fun loadSdk_withCustomVersionHandshake_performsCustomHandShake() { - val customVersionHandshake = VersionHandshake( - overrideApiVersion = Int.MAX_VALUE - ) + val customVersionHandshake = VersionHandshake(overrideApiVersion = Int.MAX_VALUE) val loadedSdk = sdkLoader.loadSdk(testSdkConfig, customVersionHandshake) - assertThat(loadedSdk.extractClientVersion()) - .isEqualTo(Int.MAX_VALUE) + assertThat(loadedSdk.extractClientVersion()).isEqualTo(Int.MAX_VALUE) } @Test @@ -82,8 +79,7 @@ val classLoader = loadedSdk.extractSdkProviderClassloader() val sdkContext = loadedSdk.extractSdkContext() - assertThat(sdkContext.classLoader) - .isSameInstanceAs(classLoader) + assertThat(sdkContext.classLoader).isSameInstanceAs(classLoader) } @Test @@ -97,8 +93,7 @@ val expectedSdkData = File(expectedSdksRoot, testSdkConfig.packageName) val expectedSdkFilesDir = File(expectedSdkData, "files") - assertThat(sdkContext.filesDir) - .isEqualTo(expectedSdkFilesDir) + assertThat(sdkContext.filesDir).isEqualTo(expectedSdkFilesDir) } @Test @@ -106,12 +101,12 @@ val loadedSdk = sdkLoader.loadSdk(testSdkConfig) val classLoader = loadedSdk.extractSdkProviderClassloader() - val content = classLoader.getResourceAsStream("test.txt").use { inputStream -> - inputStream.bufferedReader().readLine() - } + val content = + classLoader.getResourceAsStream("test.txt").use { inputStream -> + inputStream.bufferedReader().readLine() + } - assertThat(content) - .isEqualTo("test") + assertThat(content).isEqualTo("test") } @Test @@ -134,25 +129,29 @@ @SdkSuppress(maxSdkVersion = Build.VERSION_CODES.O) fun testLowSpace_failPreApi27() { val context = ApplicationProvider.getApplicationContext() - val sdkLoaderWithLowSpaceMode = SdkLoader.create( - context = context, - controllerFactory = NoOpFactory, - lowSpaceThreshold = Long.MAX_VALUE - ) + val sdkLoaderWithLowSpaceMode = + SdkLoader.create( + context = context, + controllerFactory = NoOpFactory, + lowSpaceThreshold = Long.MAX_VALUE + ) assertThrows(LoadSdkCompatException::class.java) { - sdkLoaderWithLowSpaceMode.loadSdk(testSdkConfig) - }.hasMessageThat().startsWith("Can't use InMemoryDexClassLoader") + sdkLoaderWithLowSpaceMode.loadSdk(testSdkConfig) + } + .hasMessageThat() + .startsWith("Can't use InMemoryDexClassLoader") } @Test @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O_MR1) fun testLowSpace_notFailApi27() { - val sdkLoaderWithLowSpaceMode = SdkLoader.create( - context = ApplicationProvider.getApplicationContext(), - controllerFactory = NoOpFactory, - lowSpaceThreshold = Long.MAX_VALUE - ) + val sdkLoaderWithLowSpaceMode = + SdkLoader.create( + context = ApplicationProvider.getApplicationContext(), + controllerFactory = NoOpFactory, + lowSpaceThreshold = Long.MAX_VALUE + ) val loadedSdk = sdkLoaderWithLowSpaceMode.loadSdk(testSdkConfig) val classLoader = loadedSdk.extractSdkProviderClassloader() @@ -165,14 +164,15 @@ val controllerImplClass = SdkSandboxControllerCompat.SandboxControllerImpl::class.java - val noOpProxy = Proxy.newProxyInstance( - controllerImplClass.classLoader, - arrayOf(controllerImplClass) - ) { proxy, method, args -> - throw UnsupportedOperationException( - "Unexpected method call (NoOp) object:$proxy, method: $method, args: $args" - ) - } as SdkSandboxControllerCompat.SandboxControllerImpl + val noOpProxy = + Proxy.newProxyInstance(controllerImplClass.classLoader, arrayOf(controllerImplClass)) { + proxy, + method, + args -> + throw UnsupportedOperationException( + "Unexpected method call (NoOp) object:$proxy, method: $method, args: $args" + ) + } as SdkSandboxControllerCompat.SandboxControllerImpl override fun createControllerFor(sdkConfig: LocalSdkConfig) = noOpProxy }
diff --git a/privacysandbox/sdkruntime/sdkruntime-client/src/androidTest/java/androidx/privacysandbox/sdkruntime/client/loader/impl/MigrationUtilsTest.kt b/privacysandbox/sdkruntime/sdkruntime-client/src/androidTest/java/androidx/privacysandbox/sdkruntime/client/loader/impl/MigrationUtilsTest.kt index 50c1153..4799760 100644 --- a/privacysandbox/sdkruntime/sdkruntime-client/src/androidTest/java/androidx/privacysandbox/sdkruntime/client/loader/impl/MigrationUtilsTest.kt +++ b/privacysandbox/sdkruntime/sdkruntime-client/src/androidTest/java/androidx/privacysandbox/sdkruntime/client/loader/impl/MigrationUtilsTest.kt
@@ -61,9 +61,7 @@ val fileToMove = File(fromDir, "testFile") fileToMove.createNewFile() fileToMove.outputStream().use { outputStream -> - DataOutputStream(outputStream).use { dataStream -> - dataStream.writeInt(42) - } + DataOutputStream(outputStream).use { dataStream -> dataStream.writeInt(42) } } val result = MigrationUtils.moveFiles(fromDir, toDir, fileToMove.name) @@ -73,14 +71,12 @@ val resultFile = File(toDir, fileToMove.name) assertThat(resultFile.exists()).isTrue() - val content = resultFile.inputStream().use { inputStream -> - DataInputStream(inputStream).use { dataStream -> - dataStream.readInt() + val content = + resultFile.inputStream().use { inputStream -> + DataInputStream(inputStream).use { dataStream -> dataStream.readInt() } } - } - assertThat(content) - .isEqualTo(42) + assertThat(content).isEqualTo(42) } @Test @@ -127,23 +123,19 @@ fun moveFiles_whenSameFromAndTo_keepExistingFile() { val fileToMove = File(fromDir, "testFile") fileToMove.outputStream().use { outputStream -> - DataOutputStream(outputStream).use { dataStream -> - dataStream.writeInt(42) - } + DataOutputStream(outputStream).use { dataStream -> dataStream.writeInt(42) } } val result = MigrationUtils.moveFiles(fromDir, fromDir, fileToMove.name) assertThat(result).isTrue() assertThat(fileToMove.exists()).isTrue() - val content = fileToMove.inputStream().use { inputStream -> - DataInputStream(inputStream).use { dataStream -> - dataStream.readInt() + val content = + fileToMove.inputStream().use { inputStream -> + DataInputStream(inputStream).use { dataStream -> dataStream.readInt() } } - } - assertThat(content) - .isEqualTo(42) + assertThat(content).isEqualTo(42) } @Test
diff --git a/privacysandbox/sdkruntime/sdkruntime-client/src/androidTest/java/androidx/privacysandbox/sdkruntime/client/loader/storage/CachedLocalSdkStorageTest.kt b/privacysandbox/sdkruntime/sdkruntime-client/src/androidTest/java/androidx/privacysandbox/sdkruntime/client/loader/storage/CachedLocalSdkStorageTest.kt index 03e88ab..ff228f9 100644 --- a/privacysandbox/sdkruntime/sdkruntime-client/src/androidTest/java/androidx/privacysandbox/sdkruntime/client/loader/storage/CachedLocalSdkStorageTest.kt +++ b/privacysandbox/sdkruntime/sdkruntime-client/src/androidTest/java/androidx/privacysandbox/sdkruntime/client/loader/storage/CachedLocalSdkStorageTest.kt
@@ -49,17 +49,16 @@ fun setUp() { context = ApplicationProvider.getApplicationContext() - storageUnderTest = CachedLocalSdkStorage.create( - context, - lowSpaceThreshold = disabledLowSpaceModeThreshold() - ) + storageUnderTest = + CachedLocalSdkStorage.create( + context, + lowSpaceThreshold = disabledLowSpaceModeThreshold() + ) testSdkConfig = TestSdkConfigs.CURRENT_WITH_RESOURCES assertThat(testSdkConfig.dexPaths.size).isEqualTo(2) - sdkFolder = LocalSdkFolderProvider - .create(context) - .dexFolderFor(testSdkConfig) + sdkFolder = LocalSdkFolderProvider.create(context).dexFolderFor(testSdkConfig) // Clean up between tests sdkFolder.deleteRecursively() @@ -116,10 +115,11 @@ @Test fun dexFilesFor_whenLowSpaceAndNoExtractedFiles_returnNull() { - val storageWithLowSpaceEnabled = CachedLocalSdkStorage.create( - context, - lowSpaceThreshold = enabledLowSpaceModeThreshold() - ) + val storageWithLowSpaceEnabled = + CachedLocalSdkStorage.create( + context, + lowSpaceThreshold = enabledLowSpaceModeThreshold() + ) val result = storageWithLowSpaceEnabled.dexFilesFor(testSdkConfig) assertThat(result).isNull() } @@ -129,33 +129,33 @@ val extractedFiles = storageUnderTest.dexFilesFor(testSdkConfig) assertThat(extractedFiles).isNotNull() - val storageWithLowSpaceEnabled = CachedLocalSdkStorage.create( - context, - lowSpaceThreshold = enabledLowSpaceModeThreshold() - ) + val storageWithLowSpaceEnabled = + CachedLocalSdkStorage.create( + context, + lowSpaceThreshold = enabledLowSpaceModeThreshold() + ) val result = storageWithLowSpaceEnabled.dexFilesFor(testSdkConfig) assertThat(result).isEqualTo(extractedFiles) } @Test fun dexFilesFor_whenFailedToExtract_deleteFolderAndThrowException() { - val invalidConfig = LocalSdkConfig( - packageName = "storage.test.invalid.dexPath", - dexPaths = listOf("NOT_EXISTS"), - entryPoint = "EntryPoint" - ) + val invalidConfig = + LocalSdkConfig( + packageName = "storage.test.invalid.dexPath", + dexPaths = listOf("NOT_EXISTS"), + entryPoint = "EntryPoint" + ) - val rootFolder = LocalSdkFolderProvider - .create(context) - .dexFolderFor(invalidConfig) + val rootFolder = LocalSdkFolderProvider.create(context).dexFolderFor(invalidConfig) val fileToDelete = File(rootFolder, "toDelete") fileToDelete.createNewFile() assertThat(fileToDelete.exists()).isTrue() - assertThrows{ - storageUnderTest.dexFilesFor(invalidConfig) - }.hasMessageThat().contains("NOT_EXISTS") + assertThrows{ storageUnderTest.dexFilesFor(invalidConfig) } + .hasMessageThat() + .contains("NOT_EXISTS") assertThat(fileToDelete.exists()).isFalse() } @@ -170,11 +170,9 @@ assertThat(fileContent).isEqualTo(assetContent) } - private fun enabledLowSpaceModeThreshold(): Long = - availableBytes() + 10_000_000 + private fun enabledLowSpaceModeThreshold(): Long = availableBytes() + 10_000_000 - private fun disabledLowSpaceModeThreshold(): Long = - availableBytes() - 10_000_000 + private fun disabledLowSpaceModeThreshold(): Long = availableBytes() - 10_000_000 private fun availableBytes(): Long { val path = Environment.getDataDirectory()
diff --git a/privacysandbox/sdkruntime/sdkruntime-client/src/androidTest/java/androidx/privacysandbox/sdkruntime/client/loader/storage/LocalSdkFolderProviderTest.kt b/privacysandbox/sdkruntime/sdkruntime-client/src/androidTest/java/androidx/privacysandbox/sdkruntime/client/loader/storage/LocalSdkFolderProviderTest.kt index 715f0bc..4ceaaf9 100644 --- a/privacysandbox/sdkruntime/sdkruntime-client/src/androidTest/java/androidx/privacysandbox/sdkruntime/client/loader/storage/LocalSdkFolderProviderTest.kt +++ b/privacysandbox/sdkruntime/sdkruntime-client/src/androidTest/java/androidx/privacysandbox/sdkruntime/client/loader/storage/LocalSdkFolderProviderTest.kt
@@ -80,9 +80,7 @@ @Test fun create_whenVersionChanged_deleteSdkRootFolderContentAndCreateVersionFile() { val fileToDelete = createFileToDeleteInSdkRootFolder() - createVersionFile { - it.writeLong(42) - } + createVersionFile { it.writeLong(42) } LocalSdkFolderProvider.create(context) @@ -122,28 +120,28 @@ @Test fun dexFolderFor_returnPathToSdkDexFolder() { val sdkFolderProvider = LocalSdkFolderProvider.create(context) - val dexFolder = sdkFolderProvider.dexFolderFor( - LocalSdkConfig( - packageName = "com.test.sdk.package", - dexPaths = listOf("1.dex", "2.dex"), - entryPoint = "compat.sdk.provider", + val dexFolder = + sdkFolderProvider.dexFolderFor( + LocalSdkConfig( + packageName = "com.test.sdk.package", + dexPaths = listOf("1.dex", "2.dex"), + entryPoint = "compat.sdk.provider", + ) ) - ) assertThat(dexFolder.exists()).isTrue() - assertThat(dexFolder).isEqualTo( - File(sdkRootFolder, "com.test.sdk.package") - ) + assertThat(dexFolder).isEqualTo(File(sdkRootFolder, "com.test.sdk.package")) } @Test fun dexFolderFor_doNotRemoveExistingFiles() { val sdkFolderProvider = LocalSdkFolderProvider.create(context) - val sdkConfig = LocalSdkConfig( - packageName = "com.test.sdk.package", - dexPaths = listOf("1.dex", "2.dex"), - entryPoint = "compat.sdk.provider", - ) + val sdkConfig = + LocalSdkConfig( + packageName = "com.test.sdk.package", + dexPaths = listOf("1.dex", "2.dex"), + entryPoint = "compat.sdk.provider", + ) val dexFolder = sdkFolderProvider.dexFolderFor(sdkConfig) @@ -168,9 +166,7 @@ private fun readVersionFromFile(): Long { return versionFile.inputStream().use { inputStream -> - DataInputStream(inputStream).use { dataStream -> - dataStream.readLong() - } + DataInputStream(inputStream).use { dataStream -> dataStream.readLong() } } } @@ -180,9 +176,7 @@ } versionFile.createNewFile() versionFile.outputStream().use { outputStream -> - DataOutputStream(outputStream).use { dataStream -> - versionWriter(dataStream) - } + DataOutputStream(outputStream).use { dataStream -> versionWriter(dataStream) } } } }
diff --git a/privacysandbox/sdkruntime/sdkruntime-client/src/androidTest/java/androidx/privacysandbox/sdkruntime/client/loader/storage/TestLocalSdkStorage.kt b/privacysandbox/sdkruntime/sdkruntime-client/src/androidTest/java/androidx/privacysandbox/sdkruntime/client/loader/storage/TestLocalSdkStorage.kt index af73bcc..e2790c7 100644 --- a/privacysandbox/sdkruntime/sdkruntime-client/src/androidTest/java/androidx/privacysandbox/sdkruntime/client/loader/storage/TestLocalSdkStorage.kt +++ b/privacysandbox/sdkruntime/sdkruntime-client/src/androidTest/java/androidx/privacysandbox/sdkruntime/client/loader/storage/TestLocalSdkStorage.kt
@@ -20,13 +20,9 @@ import androidx.privacysandbox.sdkruntime.client.config.LocalSdkConfig import java.io.File -/** - * Extract SDK DEX files in [rootFolder] /. - */ -internal class TestLocalSdkStorage( - private val context: Context, - private val rootFolder: File -) : LocalSdkStorage { +/** Extract SDK DEX files in [rootFolder] /. */ +internal class TestLocalSdkStorage(private val context: Context, private val rootFolder: File) : + LocalSdkStorage { override fun dexFilesFor(sdkConfig: LocalSdkConfig): LocalSdkDexFiles { val outputFolder = File(rootFolder, sdkConfig.packageName) outputFolder.deleteRecursively() @@ -37,9 +33,7 @@ val dexFile = File(outputFolder, "$index.dex") dexFile.createNewFile() context.assets.open(sdkConfig.dexPaths[index]).use { inputStream -> - dexFile.outputStream().use { outputStream -> - inputStream.copyTo(outputStream) - } + dexFile.outputStream().use { outputStream -> inputStream.copyTo(outputStream) } } dexFile.setReadOnly() add(dexFile)
diff --git a/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/SdkSandboxManagerCompat.kt b/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/SdkSandboxManagerCompat.kt index 47590a4..187c0fe 100644 --- a/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/SdkSandboxManagerCompat.kt +++ b/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/SdkSandboxManagerCompat.kt
@@ -49,46 +49,37 @@ /** * Compat version of [SdkSandboxManager]. * - * Provides APIs to load [androidx.privacysandbox.sdkruntime.core.SandboxedSdkProviderCompat] - * into SDK sandbox process or locally, and then interact with them. + * Provides APIs to load [androidx.privacysandbox.sdkruntime.core.SandboxedSdkProviderCompat] into + * SDK sandbox process or locally, and then interact with them. * - * SdkSandbox process is a java process running in a separate uid range. Each app has its own - * SDK sandbox process. + * SdkSandbox process is a java process running in a separate uid range. Each app has its own SDK + * sandbox process. * - * First app needs to declare SDKs it depends on in it's AndroidManifest.xml - * usingtag. App can only load SDKs it depends on into the - * SDK sandbox process. + * First app needs to declare SDKs it depends on in its AndroidManifest.xml using+ * tag. App can only load SDKs it depends on into the SDK sandbox process. * * For loading SDKs locally App need to bundle and declare local SDKs in * assets/RuntimeEnabledSdkTable.xml with following format: * - * - * - * com.sdk1 - *assets/RuntimeEnabledSdk-com.sdk1/CompatSdkConfig.xml - * - *- * com.sdk2 - *assets/RuntimeEnabledSdk-com.sdk2/CompatSdkConfig.xml - * - * + *+ * com.sdk1 assets/RuntimeEnabledSdk-com.sdk1/CompatSdkConfig.xml + *+ * com.sdk2 assets/RuntimeEnabledSdk-com.sdk2/CompatSdkConfig.xml + * * * Each local SDK should have config with following format: * - *- * RuntimeEnabledSdk-sdk.package.name/dex/classes.dex - *RuntimeEnabledSdk-sdk.package.name/dex/classes2.dex - *RuntimeEnabledSdk-sdk.package.name/res - *com.sdk.EntryPointClass - *- * com.test.sdk.RPackage - *123 - * - * + *+ * RuntimeEnabledSdk-sdk.package.name/dex/classes.dex RuntimeEnabledSdk-sdk.package.name/dex/classes2.dex + *RuntimeEnabledSdk-sdk.package.name/res + *com.sdk.EntryPointClass + * com.test.sdk.RPackage + *123 * * @see [SdkSandboxManager] */ -class SdkSandboxManagerCompat private constructor( +class SdkSandboxManagerCompat +private constructor( private val platformApi: PlatformApi, private val localSdkRegistry: LocalSdkRegistry, private val appOwnedSdkRegistry: AppOwnedSdkRegistry @@ -96,12 +87,12 @@ /** * Load SDK in a SDK sandbox java process or locally. * - * App should already declare SDKs it depends on in its AndroidManifest using - *tag. App can only load SDKs it depends on into the SDK Sandbox process. + * App should already declare SDKs it depends on in its AndroidManifest using+ * tag. App can only load SDKs it depends on into the SDK Sandbox process. * - * When client application loads the first SDK, a new SdkSandbox process will be - * created, otherwise other SDKs will be loaded into the same sandbox which already created for - * the client application. + * When client application loads the first SDK, a new SdkSandbox process will be created, + * otherwise other SDKs will be loaded into the same sandbox which already created for the + * client application. * * Alternatively App could bundle and declare local SDKs dependencies in * assets/RuntimeEnabledSdkTable.xml to load SDKs locally. @@ -110,18 +101,14 @@ * background will result in a [LoadSdkCompatException] being thrown. * * @param sdkName name of the SDK to be loaded. - * @param params additional parameters to be passed to the SDK in the form of a [Bundle] - * as agreed between the client and the SDK. + * @param params additional parameters to be passed to the SDK in the form of a [Bundle] as + * agreed between the client and the SDK. * @return [SandboxedSdkCompat] from SDK on a successful run. * @throws [LoadSdkCompatException] on fail. - * * @see [SdkSandboxManager.loadSdk] */ @Throws(LoadSdkCompatException::class) - suspend fun loadSdk( - sdkName: String, - params: Bundle - ): SandboxedSdkCompat { + suspend fun loadSdk(sdkName: String, params: Bundle): SandboxedSdkCompat { val isLocalSdk = localSdkRegistry.isResponsibleFor(sdkName) if (isLocalSdk) { return localSdkRegistry.loadSdk(sdkName, params) @@ -152,7 +139,6 @@ * It is not guaranteed that the memory allocated for this SDK will be freed immediately. * * @param sdkName name of the SDK to be unloaded. - * * @see [SdkSandboxManager.unloadSdk] */ fun unloadSdk(sdkName: String) { @@ -172,8 +158,7 @@ * * @param callbackExecutor the [Executor] on which to invoke the callback * @param callback the [SdkSandboxProcessDeathCallbackCompat] which will receive SDK sandbox - * lifecycle events. - * + * lifecycle events. * @see [SdkSandboxManager.addSdkSandboxProcessDeathCallback] */ fun addSdkSandboxProcessDeathCallback( @@ -188,13 +173,10 @@ * [SdkSandboxManagerCompat.addSdkSandboxProcessDeathCallback] * * @param callback the [SdkSandboxProcessDeathCallbackCompat] which was previously added using - * [SdkSandboxManagerCompat.addSdkSandboxProcessDeathCallback] - * + * [SdkSandboxManagerCompat.addSdkSandboxProcessDeathCallback] * @see [SdkSandboxManager.removeSdkSandboxProcessDeathCallback] */ - fun removeSdkSandboxProcessDeathCallback( - callback: SdkSandboxProcessDeathCallbackCompat - ) { + fun removeSdkSandboxProcessDeathCallback(callback: SdkSandboxProcessDeathCallbackCompat) { platformApi.removeSdkSandboxProcessDeathCallback(callback) } @@ -202,7 +184,6 @@ * Fetches information about Sdks that are loaded in the sandbox or locally. * * @return List of [SandboxedSdkCompat] containing all currently loaded sdks - * * @see [SdkSandboxManager.getSandboxedSdks] */ fun getSandboxedSdks(): List { @@ -250,9 +231,9 @@ * that SDK to stat this [Activity]. * * @param fromActivity the [Activity] will be used to start the new sandbox [Activity] by - * calling [Activity#startActivity] against it. + * calling [Activity#startActivity] against it. * @param sdkActivityToken the identifier that is shared by the SDK which requests the - * [Activity]. + * [Activity]. * @see SdkSandboxManager.startSdkSandboxActivity */ fun startSdkSandboxActivity(fromActivity: Activity, sdkActivityToken: IBinder) { @@ -263,11 +244,9 @@ } private interface PlatformApi { - @DoNotInline - suspend fun loadSdk(sdkName: String, params: Bundle): SandboxedSdkCompat + @DoNotInline suspend fun loadSdk(sdkName: String, params: Bundle): SandboxedSdkCompat - @DoNotInline - fun unloadSdk(sdkName: String) + @DoNotInline fun unloadSdk(sdkName: String) @DoNotInline fun addSdkSandboxProcessDeathCallback( @@ -276,30 +255,23 @@ ) @DoNotInline - fun removeSdkSandboxProcessDeathCallback( - callback: SdkSandboxProcessDeathCallbackCompat - ) + fun removeSdkSandboxProcessDeathCallback(callback: SdkSandboxProcessDeathCallbackCompat) - @DoNotInline - fun getSandboxedSdks(): List+ @DoNotInline fun getSandboxedSdks(): List fun startSdkSandboxActivity(fromActivity: Activity, sdkActivityToken: IBinder) } @RequiresApi(34) private open class Api34Impl(context: Context) : PlatformApi { - protected val sdkSandboxManager = context.getSystemService( - SdkSandboxManager::class.java - ) + protected val sdkSandboxManager = context.getSystemService(SdkSandboxManager::class.java) private val sandboxDeathCallbackDelegates: - MutableList = mutableListOf() + MutableList= + mutableListOf() @DoNotInline - override suspend fun loadSdk( - sdkName: String, - params: Bundle - ): SandboxedSdkCompat { + override suspend fun loadSdk(sdkName: String, params: Bundle): SandboxedSdkCompat { try { val sandboxedSdk = loadSdkInternal(sdkName, params) return SandboxedSdkCompat(sandboxedSdk) @@ -313,9 +285,9 @@ } override fun getSandboxedSdks(): List{ - return sdkSandboxManager - .sandboxedSdks - .map { platformSdk -> SandboxedSdkCompat(platformSdk) } + return sdkSandboxManager.sandboxedSdks.map { platformSdk -> + SandboxedSdkCompat(platformSdk) + } } @DoNotInline @@ -349,10 +321,7 @@ sdkSandboxManager.startSdkSandboxActivity(fromActivity, sdkActivityToken) } - private suspend fun loadSdkInternal( - sdkName: String, - params: Bundle - ): SandboxedSdk { + private suspend fun loadSdkInternal(sdkName: String, params: Bundle): SandboxedSdk { return suspendCancellableCoroutine { continuation -> sdkSandboxManager.loadSdk( sdkName, @@ -375,31 +344,24 @@ private class FailImpl : PlatformApi { @DoNotInline - override suspend fun loadSdk( - sdkName: String, - params: Bundle - ): SandboxedSdkCompat { + override suspend fun loadSdk(sdkName: String, params: Bundle): SandboxedSdkCompat { throw LoadSdkCompatException(LOAD_SDK_NOT_FOUND, "$sdkName not bundled with app") } - override fun unloadSdk(sdkName: String) { - } + override fun unloadSdk(sdkName: String) {} override fun getSandboxedSdks(): List= emptyList() override fun addSdkSandboxProcessDeathCallback( callbackExecutor: Executor, callback: SdkSandboxProcessDeathCallbackCompat - ) { - } + ) {} override fun removeSdkSandboxProcessDeathCallback( callback: SdkSandboxProcessDeathCallbackCompat - ) { - } + ) {} - override fun startSdkSandboxActivity(fromActivity: Activity, sdkActivityToken: IBinder) { - } + override fun startSdkSandboxActivity(fromActivity: Activity, sdkActivityToken: IBinder) {} } companion object { @@ -407,11 +369,10 @@ private val sInstances = WeakHashMap>() /** - * Creates [SdkSandboxManagerCompat]. + * Creates [SdkSandboxManagerCompat]. * - * @param context Application context - * - * @return SdkSandboxManagerCompat object. + * @param context Application context + * @return SdkSandboxManagerCompat object. */ @JvmStatic fun from(context: Context): SdkSandboxManagerCompat { @@ -422,11 +383,8 @@ val appOwnedSdkRegistry = AppOwnedSdkRegistryFactory.create(context) val localSdkRegistry = LocalSdkRegistry.create(context, appOwnedSdkRegistry) val platformApi = PlatformApiFactory.create(context) - instance = SdkSandboxManagerCompat( - platformApi, - localSdkRegistry, - appOwnedSdkRegistry - ) + instance = + SdkSandboxManagerCompat(platformApi, localSdkRegistry, appOwnedSdkRegistry) sInstances[context] = WeakReference(instance) } return instance @@ -435,9 +393,7 @@ @TestOnly internal fun reset() { - synchronized(sInstances) { - sInstances.clear() - } + synchronized(sInstances) { sInstances.clear() } } } @@ -454,8 +410,8 @@ private object AppOwnedSdkRegistryFactory { @SuppressLint("NewApi", "ClassVerificationFailure") // For supporting DP Builds fun create(context: Context): AppOwnedSdkRegistry { - return if (BuildCompat.AD_SERVICES_EXTENSION_INT >= 8 || - AdServicesInfo.isDeveloperPreview() + return if ( + BuildCompat.AD_SERVICES_EXTENSION_INT >= 8 || AdServicesInfo.isDeveloperPreview() ) { PlatformAppOwnedSdkRegistry(context) } else {
diff --git a/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/SdkSandboxProcessDeathCallbackCompat.kt b/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/SdkSandboxProcessDeathCallbackCompat.kt index 00a7771..cb365df 100644 --- a/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/SdkSandboxProcessDeathCallbackCompat.kt +++ b/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/SdkSandboxProcessDeathCallbackCompat.kt
@@ -19,8 +19,8 @@ /** * A callback for tracking events SDK sandbox death. * - * The callback can be added using [SdkSandboxManagerCompat.addSdkSandboxProcessDeathCallback] - * and removed using [SdkSandboxManagerCompat.removeSdkSandboxProcessDeathCallback] + * The callback can be added using [SdkSandboxManagerCompat.addSdkSandboxProcessDeathCallback] and + * removed using [SdkSandboxManagerCompat.removeSdkSandboxProcessDeathCallback] * * @see [android.app.sdksandbox.SdkSandboxManager.SdkSandboxProcessDeathCallback] */ @@ -30,11 +30,12 @@ * various reasons, for example, due to memory pressure on the system, or a crash in the * sandbox. * - * The system will automatically restart the sandbox process if it died due to a crash. - * However, the state of the sandbox will be lost - so any SDKs that were loaded previously - * would have to be loaded again, using [SdkSandboxManagerCompat.loadSdk] to continue using them. + * The system will automatically restart the sandbox process if it died due to a crash. However, + * the state of the sandbox will be lost - so any SDKs that were loaded previously would have to + * be loaded again, using [SdkSandboxManagerCompat.loadSdk] to continue using them. * - * @see [android.app.sdksandbox.SdkSandboxManager.SdkSandboxProcessDeathCallback.onSdkSandboxDied] + * @see + * [android.app.sdksandbox.SdkSandboxManager.SdkSandboxProcessDeathCallback.onSdkSandboxDied] */ fun onSdkSandboxDied() }
diff --git a/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/activity/ComponentActivityHolder.kt b/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/activity/ComponentActivityHolder.kt index 0f54d4b..e69f783 100644 --- a/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/activity/ComponentActivityHolder.kt +++ b/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/activity/ComponentActivityHolder.kt
@@ -22,12 +22,8 @@ import androidx.lifecycle.Lifecycle import androidx.privacysandbox.sdkruntime.core.activity.ActivityHolder -/** - * Simple implementation of [ActivityHolder] for [ComponentActivity]. - */ -internal class ComponentActivityHolder( - private val activity: ComponentActivity -) : ActivityHolder { +/** Simple implementation of [ActivityHolder] for [ComponentActivity]. */ +internal class ComponentActivityHolder(private val activity: ComponentActivity) : ActivityHolder { override fun getActivity(): Activity = activity override fun getOnBackPressedDispatcher(): OnBackPressedDispatcher =
diff --git a/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/activity/LocalSdkActivityHandlerRegistry.kt b/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/activity/LocalSdkActivityHandlerRegistry.kt index b3006b9..c97c7d7 100644 --- a/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/activity/LocalSdkActivityHandlerRegistry.kt +++ b/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/activity/LocalSdkActivityHandlerRegistry.kt
@@ -32,17 +32,12 @@ private val mapsLock = Any() @GuardedBy("mapsLock") - private val handlerToHandlerInfo = - hashMapOf() + private val handlerToHandlerInfo = hashMapOf() @GuardedBy("mapsLock") - private val tokenToHandler = - hashMapOf() + private val tokenToHandler = hashMapOf() - fun register( - sdkPackageName: String, - handler: SdkSandboxActivityHandlerCompat - ): IBinder = + fun register(sdkPackageName: String, handler: SdkSandboxActivityHandlerCompat): IBinder = synchronized(mapsLock) { val existingInfo = handlerToHandlerInfo[handler] if (existingInfo != null) { @@ -64,16 +59,17 @@ } } - fun unregisterAllActivityHandlersForSdk(sdkPackageName: String) = synchronized(mapsLock) { - val it = handlerToHandlerInfo.values.iterator() - while (it.hasNext()) { - val next = it.next() - if (next.sdkPackageName == sdkPackageName) { - it.remove() - tokenToHandler.remove(next.token) + fun unregisterAllActivityHandlersForSdk(sdkPackageName: String) = + synchronized(mapsLock) { + val it = handlerToHandlerInfo.values.iterator() + while (it.hasNext()) { + val next = it.next() + if (next.sdkPackageName == sdkPackageName) { + it.remove() + tokenToHandler.remove(next.token) + } } } - } fun isRegistered(token: IBinder): Boolean = synchronized(mapsLock) { @@ -86,17 +82,13 @@ return tokenToHandler[token] } - fun notifyOnActivityCreation( - token: IBinder, - activityHolder: ActivityHolder - ) = synchronized(mapsLock) { - val handler = tokenToHandler[token] - ?: throw IllegalStateException("There is no registered handler to notify") - handler.onActivityCreated(activityHolder) - } + fun notifyOnActivityCreation(token: IBinder, activityHolder: ActivityHolder) = + synchronized(mapsLock) { + val handler = + tokenToHandler[token] + ?: throw IllegalStateException("There is no registered handler to notify") + handler.onActivityCreated(activityHolder) + } - private data class HandlerInfo( - val token: IBinder, - val sdkPackageName: String - ) + private data class HandlerInfo(val token: IBinder, val sdkPackageName: String) }
diff --git a/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/activity/LocalSdkActivityStarter.kt b/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/activity/LocalSdkActivityStarter.kt index 10adab0..0fb59ed 100644 --- a/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/activity/LocalSdkActivityStarter.kt +++ b/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/activity/LocalSdkActivityStarter.kt
@@ -21,10 +21,7 @@ import android.os.Bundle import android.os.IBinder -/** - * Singleton helper object to start [SdkActivity]. - * Creates [Intent] with token provided by SDK. - */ +/** Singleton helper object to start [SdkActivity]. Creates [Intent] with token provided by SDK. */ internal object LocalSdkActivityStarter { private const val EXTRA_ACTIVITY_TOKEN = "androidx.privacysandbox.sdkruntime.ACTIVITY_HANDLER" @@ -32,13 +29,12 @@ /** * Trying to start [SdkActivity]. * - * If [token] registered in [LocalSdkActivityHandlerRegistry] this method will create - * [Intent] for starting [SdkActivity] and call [Activity.startActivity] + * If [token] registered in [LocalSdkActivityHandlerRegistry] this method will create [Intent] + * for starting [SdkActivity] and call [Activity.startActivity] * - * @param fromActivity the [Activity] will be used to start the new [SdkActivity] by - * calling [Activity.startActivity] against it. + * @param fromActivity the [Activity] will be used to start the new [SdkActivity] by calling + * [Activity.startActivity] against it. * @param token the identifier that is shared by the SDK which requests the [Activity]. - * * @return true if Intent was created, false if not (token wasn't registered locally). */ fun tryStart(fromActivity: Activity, token: IBinder): Boolean {
diff --git a/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/activity/SdkActivity.kt b/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/activity/SdkActivity.kt index 6fa9dd0..7a3651d 100644 --- a/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/activity/SdkActivity.kt +++ b/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/activity/SdkActivity.kt
@@ -24,8 +24,7 @@ import androidx.privacysandbox.sdkruntime.core.controller.SdkSandboxControllerCompat /** - * Activity to start for SDKs running locally. - * Not for App / SDK Usage. + * Activity to start for SDKs running locally. Not for App / SDK Usage. * * SDK should use [SdkSandboxControllerCompat.registerSdkSandboxActivityHandler] for handler * registration. @@ -43,10 +42,7 @@ private fun notifySdkOnActivityCreation() { val token = LocalSdkActivityStarter.getTokenFromSdkActivityStartIntent(intent) if (token == null) { - Log.e( - LOG_TAG, - "Token is missing in starting SdkActivity intent params" - ) + Log.e(LOG_TAG, "Token is missing in starting SdkActivity intent params") finish() return } @@ -55,11 +51,7 @@ val activityHolder = ComponentActivityHolder(this) LocalSdkActivityHandlerRegistry.notifyOnActivityCreation(token, activityHolder) } catch (e: Exception) { - Log.e( - LOG_TAG, - "Failed to start the SdkActivity and going to finish it: ", - e - ) + Log.e(LOG_TAG, "Failed to start the SdkActivity and going to finish it: ", e) finish() } }
diff --git a/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/config/LocalSdkConfig.kt b/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/config/LocalSdkConfig.kt index 2c87c2e..af99bb5 100644 --- a/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/config/LocalSdkConfig.kt +++ b/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/config/LocalSdkConfig.kt
@@ -15,10 +15,7 @@ */ package androidx.privacysandbox.sdkruntime.client.config -/** - * Information required for loading SDK bundled with App. - * - */ +/** Information required for loading SDK bundled with App. */ internal data class LocalSdkConfig( val packageName: String, val versionMajor: Int? = null, @@ -28,7 +25,4 @@ val resourceRemapping: ResourceRemappingConfig? = null ) -internal data class ResourceRemappingConfig( - val rPackageClassName: String, - val packageId: Int -) +internal data class ResourceRemappingConfig(val rPackageClassName: String, val packageId: Int)
diff --git a/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/config/LocalSdkConfigParser.kt b/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/config/LocalSdkConfigParser.kt index 097bf78..5e18a828 100644 --- a/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/config/LocalSdkConfigParser.kt +++ b/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/config/LocalSdkConfigParser.kt
@@ -25,26 +25,17 @@ /** * Parser for SDK config. * - * The expected XML structure is: - *- * RuntimeEnabledSdk-sdk.package.name/dex/classes.dex - *RuntimeEnabledSdk-sdk.package.name/dex/classes2.dex - *RuntimeEnabledSdk-sdk.package.name/res - *com.sdk.EntryPointClass - *- * com.test.sdk.RPackage - *123 - * - * + * The expected XML structure is:+ * RuntimeEnabledSdk-sdk.package.name/dex/classes.dex + *RuntimeEnabledSdk-sdk.package.name/dex/classes2.dex + *RuntimeEnabledSdk-sdk.package.name/res + *com.sdk.EntryPointClass + * com.test.sdk.RPackage + *123 */ -internal class LocalSdkConfigParser private constructor( - private val xmlParser: XmlPullParser -) { +internal class LocalSdkConfigParser private constructor(private val xmlParser: XmlPullParser) { - private fun readConfig( - packageName: String, - versionMajor: Int? - ): LocalSdkConfig { + private fun readConfig(packageName: String, versionMajor: Int?): LocalSdkConfig { xmlParser.require(XmlPullParser.START_DOCUMENT, NAMESPACE, null) xmlParser.nextTag() @@ -63,7 +54,6 @@ val dexPath = xmlParser.nextText() dexPaths.add(dexPath) } - RESOURCE_ROOT_ELEMENT_NAME -> { if (javaResourcesRoot != null) { throw XmlPullParserException( @@ -72,16 +62,12 @@ } javaResourcesRoot = xmlParser.nextText() } - ENTRYPOINT_ELEMENT_NAME -> { if (entryPoint != null) { - throw XmlPullParserException( - "Duplicate $ENTRYPOINT_ELEMENT_NAME tag found" - ) + throw XmlPullParserException("Duplicate $ENTRYPOINT_ELEMENT_NAME tag found") } entryPoint = xmlParser.nextText() } - RESOURCE_REMAPPING_ENTRY_ELEMENT_NAME -> { if (resourceRemapping != null) { throw XmlPullParserException( @@ -90,7 +76,6 @@ } resourceRemapping = readResourceRemappingConfig() } - else -> xmlParser.skipCurrentTag() } } @@ -131,7 +116,6 @@ } rPackageClassName = xmlParser.nextText() } - RESOURCE_REMAPPING_ID_ELEMENT_NAME -> { if (packageId != null) { throw XmlPullParserException( @@ -140,21 +124,16 @@ } packageId = xmlParser.nextText().toInt() } - else -> xmlParser.skipCurrentTag() } } xmlParser.require(END_TAG, NAMESPACE, RESOURCE_REMAPPING_ENTRY_ELEMENT_NAME) if (rPackageClassName == null) { - throw XmlPullParserException( - "No $RESOURCE_REMAPPING_CLASS_ELEMENT_NAME tag found" - ) + throw XmlPullParserException("No $RESOURCE_REMAPPING_CLASS_ELEMENT_NAME tag found") } if (packageId == null) { - throw XmlPullParserException( - "No $RESOURCE_REMAPPING_ID_ELEMENT_NAME tag found" - ) + throw XmlPullParserException("No $RESOURCE_REMAPPING_ID_ELEMENT_NAME tag found") } return ResourceRemappingConfig(rPackageClassName, packageId)
diff --git a/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/config/LocalSdkConfigsHolder.kt b/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/config/LocalSdkConfigsHolder.kt index 572fcb4..17703d9 100644 --- a/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/config/LocalSdkConfigsHolder.kt +++ b/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/config/LocalSdkConfigsHolder.kt
@@ -18,13 +18,9 @@ import android.content.Context import java.io.FileNotFoundException -/** - * Holds information about all SDKs bundled with App. - * - */ -internal class LocalSdkConfigsHolder private constructor( - private val configs: Map-) { +/** Holds information about all SDKs bundled with App. */ +internal class LocalSdkConfigsHolder +private constructor(private val configs: Map ) { fun getSdkConfig(sdkName: String): LocalSdkConfig? { return configs[sdkName] @@ -42,11 +38,8 @@ val data = buildMap { for ((packageName, versionMajor, configPath) in sdkTable) { context.assets.open(configPath).use { sdkConfigAsset -> - val sdkInfo = LocalSdkConfigParser.parse( - sdkConfigAsset, - packageName, - versionMajor - ) + val sdkInfo = + LocalSdkConfigParser.parse(sdkConfigAsset, packageName, versionMajor) put(packageName, sdkInfo) } }
diff --git a/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/config/SdkTableConfigParser.kt b/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/config/SdkTableConfigParser.kt index 8d244f4..9770b65 100644 --- a/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/config/SdkTableConfigParser.kt +++ b/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/config/SdkTableConfigParser.kt
@@ -25,24 +25,15 @@ /** * Parser for config with paths to compat SDK configs for each SDK that bundled with app. * - * The expected XML structure is: - *- * - * com.sdk1 - *1 - *assets/RuntimeEnabledSdk-com.sdk1/CompatSdkConfig.xml - * - *- * com.sdk2 - *42 - *assets/RuntimeEnabledSdk-com.sdk2/CompatSdkConfig.xml - * - * - * + * The expected XML structure is:+ * com.sdk1 1 + *assets/RuntimeEnabledSdk-com.sdk1/CompatSdkConfig.xml + *+ * com.sdk2 42 + *assets/RuntimeEnabledSdk-com.sdk2/CompatSdkConfig.xml + * */ -internal class SdkTableConfigParser private constructor( - private val xmlParser: XmlPullParser -) { +internal class SdkTableConfigParser private constructor(private val xmlParser: XmlPullParser) { private fun readSdkTable(): Set{ xmlParser.require(XmlPullParser.START_DOCUMENT, NAMESPACE, null) @@ -91,7 +82,6 @@ } packageName = xmlParser.nextText() } - VERSION_MAJOR_ELEMENT_NAME -> { if (versionMajor != null) { throw XmlPullParserException( @@ -100,7 +90,6 @@ } versionMajor = xmlParser.nextText().toInt() } - COMPAT_CONFIG_PATH_ELEMENT_NAME -> { if (configPath != null) { throw XmlPullParserException( @@ -109,21 +98,16 @@ } configPath = xmlParser.nextText() } - else -> xmlParser.skipCurrentTag() } } xmlParser.require(END_TAG, NAMESPACE, SDK_ENTRY_ELEMENT_NAME) if (packageName == null) { - throw XmlPullParserException( - "No $SDK_PACKAGE_NAME_ELEMENT_NAME tag found" - ) + throw XmlPullParserException("No $SDK_PACKAGE_NAME_ELEMENT_NAME tag found") } if (configPath == null) { - throw XmlPullParserException( - "No $COMPAT_CONFIG_PATH_ELEMENT_NAME tag found" - ) + throw XmlPullParserException("No $COMPAT_CONFIG_PATH_ELEMENT_NAME tag found") } return SdkTableEntry(packageName, versionMajor, configPath)
diff --git a/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/config/XmlUtils.kt b/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/config/XmlUtils.kt index 00e7450..2c7a41d 100644 --- a/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/config/XmlUtils.kt +++ b/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/config/XmlUtils.kt
@@ -20,10 +20,7 @@ import org.xmlpull.v1.XmlPullParser.END_TAG import org.xmlpull.v1.XmlPullParser.START_TAG -/** - * Skip current tag (including inner tags) - * - */ +/** Skip current tag (including inner tags) */ internal fun XmlPullParser.skipCurrentTag() { require(START_TAG, null, null) var depth = 1
diff --git a/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/controller/AppOwnedSdkRegistry.kt b/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/controller/AppOwnedSdkRegistry.kt index 269fbb7..c7f4d82 100644 --- a/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/controller/AppOwnedSdkRegistry.kt +++ b/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/controller/AppOwnedSdkRegistry.kt
@@ -18,9 +18,7 @@ import androidx.privacysandbox.sdkruntime.core.AppOwnedSdkSandboxInterfaceCompat -/** - * Register/Unregister/Fetches [AppOwnedSdkSandboxInterfaceCompat] - */ +/** Register/Unregister/Fetches [AppOwnedSdkSandboxInterfaceCompat] */ internal interface AppOwnedSdkRegistry { fun registerAppOwnedSdkSandboxInterface(appOwnedSdk: AppOwnedSdkSandboxInterfaceCompat)
diff --git a/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/controller/LocalController.kt b/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/controller/LocalController.kt index c16f5e1..9328010 100644 --- a/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/controller/LocalController.kt +++ b/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/controller/LocalController.kt
@@ -27,9 +27,7 @@ import androidx.privacysandbox.sdkruntime.core.controller.SdkSandboxControllerCompat import java.util.concurrent.Executor -/** - * Local implementation that will be injected to locally loaded SDKs. - */ +/** Local implementation that will be injected to locally loaded SDKs. */ internal class LocalController( private val sdkPackageName: String, private val localSdkRegistry: SdkRegistry, @@ -44,13 +42,9 @@ ) { try { val result = localSdkRegistry.loadSdk(sdkName, params) - executor.execute { - callback.onResult(result) - } + executor.execute { callback.onResult(result) } } catch (ex: LoadSdkCompatException) { - executor.execute { - callback.onError(ex) - } + executor.execute { callback.onError(ex) } } }
diff --git a/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/controller/LocalControllerFactory.kt b/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/controller/LocalControllerFactory.kt index 37932c81..5822a5d 100644 --- a/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/controller/LocalControllerFactory.kt +++ b/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/controller/LocalControllerFactory.kt
@@ -20,9 +20,7 @@ import androidx.privacysandbox.sdkruntime.client.loader.SdkLoader import androidx.privacysandbox.sdkruntime.core.controller.SdkSandboxControllerCompat -/** - * Create [LocalController] instance for specific sdk. - */ +/** Create [LocalController] instance for specific sdk. */ internal class LocalControllerFactory( private val localSdkRegistry: SdkRegistry, private val appOwnedSdkRegistry: AppOwnedSdkRegistry
diff --git a/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/controller/SdkRegistry.kt b/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/controller/SdkRegistry.kt index eeed123..89a1b09 100644 --- a/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/controller/SdkRegistry.kt +++ b/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/controller/SdkRegistry.kt
@@ -20,9 +20,7 @@ import androidx.privacysandbox.sdkruntime.core.LoadSdkCompatException import androidx.privacysandbox.sdkruntime.core.SandboxedSdkCompat -/** - * Responsible for lifecycle of particular SDKs (local, sandbox, test, etc). - */ +/** Responsible for lifecycle of particular SDKs (local, sandbox, test, etc). */ internal interface SdkRegistry { /** @@ -37,8 +35,8 @@ * Loads SDK. * * @param sdkName name of the SDK to be loaded. - * @param params additional parameters to be passed to the SDK in the form of a [Bundle] - * as agreed between the client and the SDK. + * @param params additional parameters to be passed to the SDK in the form of a [Bundle] as + * agreed between the client and the SDK. * @return [SandboxedSdkCompat] from SDK on a successful run. * @throws [LoadSdkCompatException] on fail or when SdkRegistry not responsible for this SDK. */
diff --git a/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/controller/impl/LocalAppOwnedSdkRegistry.kt b/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/controller/impl/LocalAppOwnedSdkRegistry.kt index b497b70..c29f532 100644 --- a/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/controller/impl/LocalAppOwnedSdkRegistry.kt +++ b/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/controller/impl/LocalAppOwnedSdkRegistry.kt
@@ -19,28 +19,24 @@ import androidx.privacysandbox.sdkruntime.client.controller.AppOwnedSdkRegistry import androidx.privacysandbox.sdkruntime.core.AppOwnedSdkSandboxInterfaceCompat -/** - * Local implementation for platform versions without AppOwnedSdkSandboxInterface support. - */ +/** Local implementation for platform versions without AppOwnedSdkSandboxInterface support. */ internal class LocalAppOwnedSdkRegistry : AppOwnedSdkRegistry { private val appOwnedInterfaces = HashMap() override fun registerAppOwnedSdkSandboxInterface( appOwnedSdk: AppOwnedSdkSandboxInterfaceCompat - ) = synchronized(appOwnedInterfaces) { - val interfaceName = appOwnedSdk.getName() - if (appOwnedInterfaces.containsKey(interfaceName)) { - throw IllegalStateException("Already registered interface of name $interfaceName") + ) = + synchronized(appOwnedInterfaces) { + val interfaceName = appOwnedSdk.getName() + if (appOwnedInterfaces.containsKey(interfaceName)) { + throw IllegalStateException("Already registered interface of name $interfaceName") + } + appOwnedInterfaces[interfaceName] = appOwnedSdk } - appOwnedInterfaces[interfaceName] = appOwnedSdk - } - override fun unregisterAppOwnedSdkSandboxInterface( - sdkName: String - ): Unit = synchronized(appOwnedInterfaces) { - appOwnedInterfaces.remove(sdkName) - } + override fun unregisterAppOwnedSdkSandboxInterface(sdkName: String): Unit = + synchronized(appOwnedInterfaces) { appOwnedInterfaces.remove(sdkName) } override fun getAppOwnedSdkSandboxInterfaces(): List= synchronized(appOwnedInterfaces) {
diff --git a/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/controller/impl/LocalSdkRegistry.kt b/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/controller/impl/LocalSdkRegistry.kt index 79a1e72..73eca5c 100644 --- a/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/controller/impl/LocalSdkRegistry.kt +++ b/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/controller/impl/LocalSdkRegistry.kt
@@ -32,8 +32,7 @@ import org.jetbrains.annotations.TestOnly /** - * Responsible for lifecycle of SDKs bundled with app. - * Shared between: + * Responsible for lifecycle of SDKs bundled with app. Shared between: * 1) [androidx.privacysandbox.sdkruntime.client.SdkSandboxManagerCompat] * 2) [androidx.privacysandbox.sdkruntime.core.controller.SdkSandboxControllerCompat] */ @@ -56,11 +55,12 @@ params: Bundle, overrideVersionHandshake: VersionHandshake? ): SandboxedSdkCompat { - val sdkConfig = configHolder.getSdkConfig(sdkName) - ?: throw LoadSdkCompatException( - LoadSdkCompatException.LOAD_SDK_NOT_FOUND, - "$sdkName not bundled with app" - ) + val sdkConfig = + configHolder.getSdkConfig(sdkName) + ?: throw LoadSdkCompatException( + LoadSdkCompatException.LOAD_SDK_NOT_FOUND, + "$sdkName not bundled with app" + ) synchronized(sdks) { if (sdks.containsKey(sdkName)) { @@ -72,20 +72,13 @@ val sdkProvider = sdkLoader.loadSdk(sdkConfig, overrideVersionHandshake) val sandboxedSdkCompat = sdkProvider.onLoadSdk(params) - sdks.put( - sdkName, Entry( - sdkProvider = sdkProvider, - sdk = sandboxedSdkCompat - ) - ) + sdks.put(sdkName, Entry(sdkProvider = sdkProvider, sdk = sandboxedSdkCompat)) return sandboxedSdkCompat } } override fun unloadSdk(sdkName: String) { - val loadedEntry = synchronized(sdks) { - sdks.remove(sdkName) - } + val loadedEntry = synchronized(sdks) { sdks.remove(sdkName) } if (loadedEntry == null) { Log.w(LOG_TAG, "Unloading SDK that is not loaded - $sdkName") return @@ -95,19 +88,18 @@ LocalSdkActivityHandlerRegistry.unregisterAllActivityHandlersForSdk(sdkName) } - override fun getLoadedSdks(): List= synchronized(sdks) { - return sdks.values.map { it.sdk } - } + override fun getLoadedSdks(): List= + synchronized(sdks) { + return sdks.values.map { it.sdk } + } @TestOnly - fun getLoadedSdkProvider(sdkName: String): LocalSdkProvider? = synchronized(sdks) { - return sdks[sdkName]?.sdkProvider - } + fun getLoadedSdkProvider(sdkName: String): LocalSdkProvider? = + synchronized(sdks) { + return sdks[sdkName]?.sdkProvider + } - private data class Entry( - val sdkProvider: LocalSdkProvider, - val sdk: SandboxedSdkCompat - ) + private data class Entry(val sdkProvider: LocalSdkProvider, val sdk: SandboxedSdkCompat) companion object { const val LOG_TAG = "LocalSdkRegistry" @@ -119,20 +111,15 @@ * @param appOwnedSdkRegistry AppOwnedSdkRegistry for [LocalControllerFactory] * @return LocalSdkRegistry that could load SDKs bundled with app. */ - fun create( - context: Context, - appOwnedSdkRegistry: AppOwnedSdkRegistry - ): LocalSdkRegistry { + fun create(context: Context, appOwnedSdkRegistry: AppOwnedSdkRegistry): LocalSdkRegistry { val configHolder = LocalSdkConfigsHolder.load(context) val localSdkRegistry = LocalSdkRegistry(configHolder) - localSdkRegistry.sdkLoader = SdkLoader.create( - context, - LocalControllerFactory( - localSdkRegistry, - appOwnedSdkRegistry + localSdkRegistry.sdkLoader = + SdkLoader.create( + context, + LocalControllerFactory(localSdkRegistry, appOwnedSdkRegistry) ) - ) return localSdkRegistry }
diff --git a/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/controller/impl/PlatformAppOwnedSdkRegistry.kt b/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/controller/impl/PlatformAppOwnedSdkRegistry.kt index 5d96134..b7fb09f 100644 --- a/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/controller/impl/PlatformAppOwnedSdkRegistry.kt +++ b/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/controller/impl/PlatformAppOwnedSdkRegistry.kt
@@ -24,18 +24,12 @@ import androidx.privacysandbox.sdkruntime.client.controller.AppOwnedSdkRegistry import androidx.privacysandbox.sdkruntime.core.AppOwnedSdkSandboxInterfaceCompat -/** - * Implementation backed by [SdkSandboxManager]. - */ +/** Implementation backed by [SdkSandboxManager]. */ @RequiresApi(33) @RequiresExtension(extension = SdkExtensions.AD_SERVICES, version = 8) -internal class PlatformAppOwnedSdkRegistry( - context: Context -) : AppOwnedSdkRegistry { +internal class PlatformAppOwnedSdkRegistry(context: Context) : AppOwnedSdkRegistry { - private val sdkSandboxManager = context.getSystemService( - SdkSandboxManager::class.java - ) + private val sdkSandboxManager = context.getSystemService(SdkSandboxManager::class.java) override fun registerAppOwnedSdkSandboxInterface( appOwnedSdk: AppOwnedSdkSandboxInterfaceCompat
diff --git a/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/loader/FileClassLoaderFactory.kt b/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/loader/FileClassLoaderFactory.kt index 54678be..b949f3e 100644 --- a/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/loader/FileClassLoaderFactory.kt +++ b/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/loader/FileClassLoaderFactory.kt
@@ -24,24 +24,17 @@ import java.io.File /** - * Loading SDK using BaseDexClassLoader. - * Using [LocalSdkStorage] to get SDK DEX files, - * if no files available - delegating to fallback. + * Loading SDK using BaseDexClassLoader. Using [LocalSdkStorage] to get SDK DEX files, if no files + * available - delegating to fallback. */ internal class FileClassLoaderFactory( private val localSdkStorage: LocalSdkStorage, private val fallback: SdkLoader.ClassLoaderFactory, ) : SdkLoader.ClassLoaderFactory { - override fun createClassLoaderFor( - sdkConfig: LocalSdkConfig, - parent: ClassLoader - ): ClassLoader { + override fun createClassLoaderFor(sdkConfig: LocalSdkConfig, parent: ClassLoader): ClassLoader { return tryCreateBaseDexClassLoaderFor(sdkConfig, parent) - ?: fallback.createClassLoaderFor( - sdkConfig, - parent - ) + ?: fallback.createClassLoaderFor(sdkConfig, parent) } private fun tryCreateBaseDexClassLoaderFor( @@ -80,7 +73,6 @@ } companion object { - const val LOG_TAG = - "FileClassLoaderFactory" + const val LOG_TAG = "FileClassLoaderFactory" } }
diff --git a/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/loader/InMemorySdkClassLoaderFactory.kt b/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/loader/InMemorySdkClassLoaderFactory.kt index 2d7ff1b..676699c 100644 --- a/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/loader/InMemorySdkClassLoaderFactory.kt +++ b/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/loader/InMemorySdkClassLoaderFactory.kt
@@ -26,16 +26,12 @@ import java.nio.ByteBuffer import java.nio.channels.Channels -/** - * Loading SDK in memory on API 27+ - * Also support single DEX SDKs on API 26. - */ +/** Loading SDK in memory on API 27+ Also support single DEX SDKs on API 26. */ internal abstract class InMemorySdkClassLoaderFactory : SdkLoader.ClassLoaderFactory { @RequiresApi(Build.VERSION_CODES.O_MR1) - private class Api27Impl( - private val assetLoader: AssetLoader - ) : InMemorySdkClassLoaderFactory() { + private class Api27Impl(private val assetLoader: AssetLoader) : + InMemorySdkClassLoaderFactory() { @DoNotInline override fun createClassLoaderFor( @@ -59,9 +55,8 @@ } @RequiresApi(Build.VERSION_CODES.O) - private class Api26Impl( - private val assetLoader: AssetLoader - ) : InMemorySdkClassLoaderFactory() { + private class Api26Impl(private val assetLoader: AssetLoader) : + InMemorySdkClassLoaderFactory() { @DoNotInline override fun createClassLoaderFor( @@ -100,9 +95,7 @@ } } - private class AssetLoader( - private val assetManager: AssetManager - ) { + private class AssetLoader(private val assetManager: AssetManager) { fun load(assetName: String): ByteBuffer { return assetManager.open(assetName).use { inputStream -> val byteBuffer = ByteBuffer.allocate(inputStream.available())
diff --git a/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/loader/JavaResourcesLoadingClassLoaderFactory.kt b/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/loader/JavaResourcesLoadingClassLoaderFactory.kt index 55da921..44c59b0 100644 --- a/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/loader/JavaResourcesLoadingClassLoaderFactory.kt +++ b/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/loader/JavaResourcesLoadingClassLoaderFactory.kt
@@ -24,25 +24,20 @@ /** * Delegate java resources related calls to app classloader. * - * Classloaders normally delegate calls to parent classloader first, that's why this factory - * creates classloader that will work with java resources and pass it as parent to - * [codeClassLoaderFactory] thus overrides java resources for all classes loaded down the line. + * Classloaders normally delegate calls to parent classloader first, that's why this factory creates + * classloader that will work with java resources and pass it as parent to [codeClassLoaderFactory] + * thus overrides java resources for all classes loaded down the line. * - * Add [LocalSdkConfig.javaResourcesRoot] as prefix to resource names before delegating calls, - * thus allowing isolating java resources for different local sdks. + * Add [LocalSdkConfig.javaResourcesRoot] as prefix to resource names before delegating calls, thus + * allowing isolating java resources for different local sdks. */ internal class JavaResourcesLoadingClassLoaderFactory( private val appClassloader: ClassLoader, private val codeClassLoaderFactory: SdkLoader.ClassLoaderFactory ) : SdkLoader.ClassLoaderFactory { - override fun createClassLoaderFor( - sdkConfig: LocalSdkConfig, - parent: ClassLoader - ): ClassLoader { - val javaResourcesLoadingClassLoader = createJavaResourcesLoadingClassLoader( - sdkConfig, - parent - ) + override fun createClassLoaderFor(sdkConfig: LocalSdkConfig, parent: ClassLoader): ClassLoader { + val javaResourcesLoadingClassLoader = + createJavaResourcesLoadingClassLoader(sdkConfig, parent) return codeClassLoaderFactory.createClassLoaderFor( sdkConfig, parent = javaResourcesLoadingClassLoader @@ -64,7 +59,8 @@ } } - private class JavaResourcesLoadingClassLoader constructor( + private class JavaResourcesLoadingClassLoader + constructor( parent: ClassLoader, private val appClassloader: ClassLoader, private val javaResourcePrefix: File
diff --git a/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/loader/LocalSdkProvider.kt b/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/loader/LocalSdkProvider.kt index ecd3cdc..75a0c34 100644 --- a/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/loader/LocalSdkProvider.kt +++ b/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/loader/LocalSdkProvider.kt
@@ -20,13 +20,10 @@ import org.jetbrains.annotations.TestOnly /** - * Provides interface for interaction with locally loaded SDK. - * Handle different protocol versions inside. - * + * Provides interface for interaction with locally loaded SDK. Handle different protocol versions + * inside. */ -internal abstract class LocalSdkProvider protected constructor( - @get:TestOnly val sdkProvider: Any -) { +internal abstract class LocalSdkProvider protected constructor(@get:TestOnly val sdkProvider: Any) { abstract fun onLoadSdk(params: Bundle): SandboxedSdkCompat
diff --git a/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/loader/ResourceRemapping.kt b/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/loader/ResourceRemapping.kt index 6bb7afd..b07e251 100644 --- a/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/loader/ResourceRemapping.kt +++ b/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/loader/ResourceRemapping.kt
@@ -19,30 +19,26 @@ import androidx.privacysandbox.sdkruntime.client.config.ResourceRemappingConfig /** - * Update RPackage.packageId for supporting Android Resource remapping for SDK. - * Each resource has id calculated as id = RPackage.packageId + index. - * Id structure is (1 byte - packageId) (1 byte - type) (2 byte - index). - * Updating packageId effectively shifting all SDK resource ids in resource table. - * [ResourceRemappingConfig] contains a new packageId component (first byte) for SDK. - * This value need to be shifted before updating RPackage.packageId. - * IMPORTANT: ResourceRemapping should happen before ANY interactions with R.class + * Update RPackage.packageId for supporting Android Resource remapping for SDK. Each resource has id + * calculated as id = RPackage.packageId + index. Id structure is (1 byte - packageId) (1 byte - + * type) (2 byte - index). Updating packageId effectively shifting all SDK resource ids in resource + * table. [ResourceRemappingConfig] contains a new packageId component (first byte) for SDK. This + * value need to be shifted before updating RPackage.packageId. IMPORTANT: ResourceRemapping should + * happen before ANY interactions with R.class */ internal object ResourceRemapping { private const val PACKAGE_ID_FIELD_NAME = "packageId" - fun apply( - sdkClassLoader: ClassLoader, - remappingConfig: ResourceRemappingConfig? - ) { - if (remappingConfig == null) - return + fun apply(sdkClassLoader: ClassLoader, remappingConfig: ResourceRemappingConfig?) { + if (remappingConfig == null) return - val rPackageClass = Class.forName( - remappingConfig.rPackageClassName, - /* initialize = */ false, - sdkClassLoader - ) + val rPackageClass = + Class.forName( + remappingConfig.rPackageClassName, + /* initialize = */ false, + sdkClassLoader + ) val field = rPackageClass.getDeclaredField(PACKAGE_ID_FIELD_NAME)
diff --git a/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/loader/SdkLoader.kt b/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/loader/SdkLoader.kt index e37f665..a446314 100644 --- a/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/loader/SdkLoader.kt +++ b/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/loader/SdkLoader.kt
@@ -24,10 +24,9 @@ import androidx.privacysandbox.sdkruntime.core.controller.SdkSandboxControllerCompat import androidx.privacysandbox.sdkruntime.core.internal.ClientFeature -/** - * Load SDK bundled with App. - */ -internal class SdkLoader internal constructor( +/** Load SDK bundled with App. */ +internal class SdkLoader +internal constructor( private val classLoaderFactory: ClassLoaderFactory, private val appContext: Context, private val controllerFactory: ControllerFactory @@ -45,10 +44,10 @@ /** * Loading SDK in separate classloader: - * 1. Create classloader for sdk; - * 2. Performing handshake to determine api version; - * 3. (optional) Update RPackage.packageId to support Android Resource remapping for SDK - * 4. Select [LocalSdkProvider] implementation that could work with that api version. + * 1. Create classloader for sdk; + * 2. Performing handshake to determine api version; + * 3. (optional) Update RPackage.packageId to support Android Resource remapping for SDK + * 4. Select [LocalSdkProvider] implementation that could work with that api version. * * @param sdkConfig sdk to load * @param overrideVersionHandshake (optional) override internal api level handshake @@ -58,10 +57,7 @@ sdkConfig: LocalSdkConfig, overrideVersionHandshake: VersionHandshake? = null ): LocalSdkProvider { - val classLoader = classLoaderFactory.createClassLoaderFor( - sdkConfig, - getParentClassLoader() - ) + val classLoader = classLoaderFactory.createClassLoaderFor(sdkConfig, getParentClassLoader()) val versionHandshake = overrideVersionHandshake ?: VersionHandshake.DEFAULT return createLocalSdk(classLoader, sdkConfig, versionHandshake) } @@ -92,22 +88,19 @@ companion object { /** - * Build chain of [ClassLoaderFactory] that could load SDKs with their resources. - * Order is important because classloaders normally delegate calls to parent classloader - * first: - * 1. [JavaResourcesLoadingClassLoaderFactory] - to provide java resources to classes - * loaded by child classloaders; - * 2a. [FileClassLoaderFactory] - first trying to use factory that extracting SDK Dex - * to storage and load it using [dalvik.system.BaseDexClassLoader]. - * Supports all platform versions (Api14+, minSdkVersion for library). - * 2b. [InMemorySdkClassLoaderFactory] - fallback for low available space. Trying to load - * SDK in-memory using [dalvik.system.InMemoryDexClassLoader]. - * Supports Api27+ only, fails SDK loading on non-supported platform versions. + * Build chain of [ClassLoaderFactory] that could load SDKs with their resources. Order is + * important because classloaders normally delegate calls to parent classloader first: + * 1. [JavaResourcesLoadingClassLoaderFactory] - to provide java resources to classes loaded + * by child classloaders; 2a. [FileClassLoaderFactory] - first trying to use factory that + * extracting SDK Dex to storage and load it using [dalvik.system.BaseDexClassLoader]. + * Supports all platform versions (Api14+, minSdkVersion for library). 2b. + * [InMemorySdkClassLoaderFactory] - fallback for low available space. Trying to load SDK + * in-memory using [dalvik.system.InMemoryDexClassLoader]. Supports Api27+ only, fails + * SDK loading on non-supported platform versions. * * @param context App context * @param lowSpaceThreshold Minimal available space in bytes required to proceed with - * extracting SDK Dex files. - * + * extracting SDK Dex files. * @return SdkLoader that could load SDKs with their resources. */ fun create( @@ -115,17 +108,16 @@ controllerFactory: ControllerFactory, lowSpaceThreshold: Long = 100 * 1024 * 1024 ): SdkLoader { - val cachedLocalSdkStorage = CachedLocalSdkStorage.create( - context, - lowSpaceThreshold - ) - val classLoaderFactory = JavaResourcesLoadingClassLoaderFactory( - context.classLoader, - codeClassLoaderFactory = FileClassLoaderFactory( - cachedLocalSdkStorage, - fallback = InMemorySdkClassLoaderFactory.create(context) + val cachedLocalSdkStorage = CachedLocalSdkStorage.create(context, lowSpaceThreshold) + val classLoaderFactory = + JavaResourcesLoadingClassLoaderFactory( + context.classLoader, + codeClassLoaderFactory = + FileClassLoaderFactory( + cachedLocalSdkStorage, + fallback = InMemorySdkClassLoaderFactory.create(context) + ) ) - ) return SdkLoader(classLoaderFactory, context, controllerFactory) } }
diff --git a/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/loader/VersionHandshake.kt b/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/loader/VersionHandshake.kt index 8563b15..87c3406 100644 --- a/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/loader/VersionHandshake.kt +++ b/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/loader/VersionHandshake.kt
@@ -18,10 +18,7 @@ import android.annotation.SuppressLint import androidx.privacysandbox.sdkruntime.core.Versions -/** - * Performing version handshake. - * - */ +/** Performing version handshake. */ internal class VersionHandshake( /** * Override version by using [overrideApiVersion] as client and sdk version during handshake. @@ -31,11 +28,7 @@ @SuppressLint("BanUncheckedReflection") // calling method on Versions class fun perform(classLoader: ClassLoader?): Int { - val versionsClass = Class.forName( - Versions::class.java.name, - false, - classLoader - ) + val versionsClass = Class.forName(Versions::class.java.name, false, classLoader) val handShakeMethod = versionsClass.getMethod("handShake", Int::class.javaPrimitiveType) val clientVersion = overrideApiVersion ?: Versions.API_VERSION
diff --git a/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/loader/impl/MigrationUtils.kt b/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/loader/impl/MigrationUtils.kt index 05cbea5..11297ae 100644 --- a/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/loader/impl/MigrationUtils.kt +++ b/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/loader/impl/MigrationUtils.kt
@@ -36,8 +36,8 @@ private const val LOG_TAG = "LocalSdkMigrationUtils" /** - * Try to migrate all files from source to target that match requested prefix. - * Skip failed files. + * Try to migrate all files from source to target that match requested prefix. Skip failed + * files. * * @return true if all files moved, or false if some fails happened. */ @@ -46,8 +46,7 @@ return true } - val sourceFiles = srcDir.listFiles { _, name -> name.startsWith(prefix) } - ?: emptyArray() + val sourceFiles = srcDir.listFiles { _, name -> name.startsWith(prefix) } ?: emptyArray() var hadFails = false for (sourceFile in sourceFiles) { @@ -98,8 +97,6 @@ @RequiresApi(Build.VERSION_CODES.Q) private object Api29 { - @DoNotInline - fun copy(from: InputStream, to: OutputStream): Long = - FileUtils.copy(from, to) + @DoNotInline fun copy(from: InputStream, to: OutputStream): Long = FileUtils.copy(from, to) } }
diff --git a/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/loader/impl/SandboxControllerInjector.kt b/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/loader/impl/SandboxControllerInjector.kt index 56f29f7..c53925d 100644 --- a/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/loader/impl/SandboxControllerInjector.kt +++ b/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/loader/impl/SandboxControllerInjector.kt
@@ -31,9 +31,9 @@ import java.util.concurrent.Executor /** - * Injects local implementation of [SdkSandboxControllerCompat.SandboxControllerImpl] - * to [SdkSandboxControllerCompat] loaded by SDK Classloader. - * Using [Proxy] to allow interaction between classes loaded by different classloaders. + * Injects local implementation of [SdkSandboxControllerCompat.SandboxControllerImpl] to + * [SdkSandboxControllerCompat] loaded by SDK Classloader. Using [Proxy] to allow interaction + * between classes loaded by different classloaders. */ internal object SandboxControllerInjector { @@ -49,17 +49,15 @@ sdkVersion: Int, controller: SdkSandboxControllerCompat.SandboxControllerImpl ) { - val controllerClass = Class.forName( - SdkSandboxControllerCompat::class.java.name, - false, - sdkClassLoader - ) + val controllerClass = + Class.forName(SdkSandboxControllerCompat::class.java.name, false, sdkClassLoader) - val controllerImplClass = Class.forName( - SdkSandboxControllerCompat.SandboxControllerImpl::class.java.name, - false, - sdkClassLoader - ) + val controllerImplClass = + Class.forName( + SdkSandboxControllerCompat.SandboxControllerImpl::class.java.name, + false, + sdkClassLoader + ) val injectMethod = controllerClass.getMethod("injectLocalImpl", controllerImplClass) @@ -69,32 +67,30 @@ val sdkActivityHandlerWrapper = if (ClientFeature.SDK_ACTIVITY_HANDLER.isAvailable(sdkVersion)) SdkActivityHandlerWrapper.createFor(sdkClassLoader) - else - null + else null val appOwnedSdkInterfaceProxyFactory = if (ClientFeature.APP_OWNED_INTERFACES.isAvailable(sdkVersion)) AppOwnedSdkInterfaceProxyFactory.createFor(sdkClassLoader) - else - null + else null val loadSdkCallbackWrapper = if (ClientFeature.LOAD_SDK.isAvailable(sdkVersion)) LoadSdkCallbackWrapper.createFor(sdkClassLoader) - else - null + else null - val proxy = Proxy.newProxyInstance( - sdkClassLoader, - arrayOf(controllerImplClass), - Handler( - controller, - sandboxedSdkCompatProxyFactory, - appOwnedSdkInterfaceProxyFactory, - sdkActivityHandlerWrapper, - loadSdkCallbackWrapper + val proxy = + Proxy.newProxyInstance( + sdkClassLoader, + arrayOf(controllerImplClass), + Handler( + controller, + sandboxedSdkCompatProxyFactory, + appOwnedSdkInterfaceProxyFactory, + sdkActivityHandlerWrapper, + loadSdkCallbackWrapper + ) ) - ) injectMethod.invoke(null, proxy) } @@ -107,29 +103,20 @@ private val loadSdkCallbackWrapper: LoadSdkCallbackWrapper? ) : InvocationHandler { - private val sdkToAppHandlerMap = - hashMapOf() + private val sdkToAppHandlerMap = hashMapOf() override fun invoke(proxy: Any, method: Method, args: Array?): Any { return when (method.name) { "loadSdk" -> loadSdk(args!![0]!!, args[1]!!, args[2]!!, args[3]!!) - "getSandboxedSdks" -> getSandboxedSdks() - "getAppOwnedSdkSandboxInterfaces" -> getAppOwnedSdkSandboxInterfaces() - "registerSdkSandboxActivityHandler" -> registerSdkSandboxActivityHandler(args!![0]!!) - "unregisterSdkSandboxActivityHandler" -> unregisterSdkSandboxActivityHandler(args!![0]!!) - "equals" -> proxy === args?.get(0) - "hashCode" -> hashCode() - "toString" -> toString() - else -> { throw UnsupportedOperationException( "Unexpected method call object:$proxy, method: $method, args: $args" @@ -138,27 +125,19 @@ } } - private fun loadSdk( - sdkName: Any, - params: Any, - executor: Any, - originalCallback: Any - ) { + private fun loadSdk(sdkName: Any, params: Any, executor: Any, originalCallback: Any) { if (loadSdkCallbackWrapper == null) { - throw IllegalStateException( - "Unexpected call from SDK without LoadSdk support" - ) + throw IllegalStateException("Unexpected call from SDK without LoadSdk support") } val callback = loadSdkCallbackWrapper.wrapLoadSdkCallback(originalCallback) - controller - .loadSdk(sdkName as String, params as Bundle, executor as Executor, callback) + controller.loadSdk(sdkName as String, params as Bundle, executor as Executor, callback) } private fun getSandboxedSdks(): List{ - return controller - .getSandboxedSdks() - .map { sandboxedSdkCompatProxyFactory.createFrom(it) } + return controller.getSandboxedSdks().map { + sandboxedSdkCompatProxyFactory.createFrom(it) + } } private fun getAppOwnedSdkSandboxInterfaces(): List{ @@ -168,33 +147,28 @@ ) } - return controller - .getAppOwnedSdkSandboxInterfaces() - .map { appOwnedSdkInterfaceProxyFactory.createFrom(it) } + return controller.getAppOwnedSdkSandboxInterfaces().map { + appOwnedSdkInterfaceProxyFactory.createFrom(it) + } } private fun registerSdkSandboxActivityHandler(sdkSideHandler: Any): Any { val handlerToRegister = wrapSdkActivityHandler(sdkSideHandler) - return controller - .registerSdkSandboxActivityHandler(handlerToRegister) + return controller.registerSdkSandboxActivityHandler(handlerToRegister) } private fun unregisterSdkSandboxActivityHandler(sdkSideHandler: Any) { - val appSideHandler = synchronized(sdkToAppHandlerMap) { - sdkToAppHandlerMap.remove(sdkSideHandler) - } + val appSideHandler = + synchronized(sdkToAppHandlerMap) { sdkToAppHandlerMap.remove(sdkSideHandler) } if (appSideHandler != null) { - controller - .unregisterSdkSandboxActivityHandler(appSideHandler) + controller.unregisterSdkSandboxActivityHandler(appSideHandler) } } private fun wrapSdkActivityHandler(sdkSideHandler: Any): SdkSandboxActivityHandlerCompat = synchronized(sdkToAppHandlerMap) { if (sdkActivityHandlerWrapper == null) { - throw IllegalStateException( - "Unexpected call from SDK without Activity support" - ) + throw IllegalStateException("Unexpected call from SDK without Activity support") } val existingAppSideHandler = sdkToAppHandlerMap[sdkSideHandler]
diff --git a/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/loader/impl/SandboxedSdkContextCompat.kt b/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/loader/impl/SandboxedSdkContextCompat.kt index 2d2d2a7..49f79f0 100644 --- a/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/loader/impl/SandboxedSdkContextCompat.kt +++ b/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/loader/impl/SandboxedSdkContextCompat.kt
@@ -30,13 +30,11 @@ /** * Refers to the context of the SDK loaded locally. * - * Supports Per-SDK storage by pointing storage related APIs to folders unique for each SDK. - * Where possible maintains same folders hierarchy as for applications by creating folders - * inside [getDataDir]. - * Folders with special permissions or additional logic (caches, etc) created as subfolders of same - * application folders. - * SDK Shared Preferences supported by adding prefix to name and delegating to Application - * Shared Preferences. + * Supports Per-SDK storage by pointing storage related APIs to folders unique for each SDK. Where + * possible maintains same folders hierarchy as for applications by creating folders inside + * [getDataDir]. Folders with special permissions or additional logic (caches, etc) created as + * subfolders of same application folders. SDK Shared Preferences supported by adding prefix to name + * and delegating to Application Shared Preferences. * * SDK Folders hierarchy (from application [getDataDir]): * 1) /cache/RuntimeEnabledSdksData/- cache @@ -62,62 +60,43 @@ ) } - /** - * Points to/app_RuntimeEnabledSdksData/ - */ + /** Points to/app_RuntimeEnabledSdksData/ override fun getDataDir(): File { - val sdksDataRoot = baseContext.getDir( - SDK_ROOT_FOLDER, - Context.MODE_PRIVATE - ) + val sdksDataRoot = baseContext.getDir(SDK_ROOT_FOLDER, Context.MODE_PRIVATE) return ensureDirExists(sdksDataRoot, sdkPackageName) } - /** - * Points to*/ /cache/RuntimeEnabledSdksData/ - */ + /** Points to/cache/RuntimeEnabledSdksData/ override fun getCacheDir(): File { val sdksCacheRoot = ensureDirExists(baseContext.cacheDir, SDK_ROOT_FOLDER) return ensureDirExists(sdksCacheRoot, sdkPackageName) } - /** - * Points to*/ /code_cache/RuntimeEnabledSdksData/ - */ + /** Points to/code_cache/RuntimeEnabledSdksData/ @RequiresApi(Build.VERSION_CODES.LOLLIPOP) override fun getCodeCacheDir(): File { - val sdksCodeCacheRoot = ensureDirExists( - Api21.codeCacheDir(baseContext), - SDK_ROOT_FOLDER - ) + val sdksCodeCacheRoot = ensureDirExists(Api21.codeCacheDir(baseContext), SDK_ROOT_FOLDER) return ensureDirExists(sdksCodeCacheRoot, sdkPackageName) } - /** - * Points to*/ /no_backup/RuntimeEnabledSdksData/ - */ + /** Points to/no_backup/RuntimeEnabledSdksData/ @RequiresApi(Build.VERSION_CODES.LOLLIPOP) override fun getNoBackupFilesDir(): File { - val sdksNoBackupRoot = ensureDirExists( - Api21.noBackupFilesDir(baseContext), - SDK_ROOT_FOLDER - ) + val sdksNoBackupRoot = ensureDirExists(Api21.noBackupFilesDir(baseContext), SDK_ROOT_FOLDER) return ensureDirExists(sdksNoBackupRoot, sdkPackageName) } /** - * Points to*/ /app_RuntimeEnabledSdksData/ - * Prefix required to maintain same hierarchy as for applications - when dir could be - * accessed by both [getDir] and [getDir]/app_/app_ . + * Points to/app_RuntimeEnabledSdksData/ + * Prefix required to maintain same hierarchy as for applications - when dir could be accessed + * by both [getDir] and [getDir]/app_/app_ . */ override fun getDir(name: String, mode: Int): File { val dirName = "app_$name" return ensureDirExists(dataDir, dirName) } - /** - * Points to/app_RuntimeEnabledSdksData/ - */ + /** Points to/files /app_RuntimeEnabledSdksData/ override fun getFilesDir(): File { return ensureDirExists(dataDir, "files") } @@ -181,18 +160,12 @@ synchronized(SandboxedSdkContextCompat::class.java) { val source = sourceContext.getDatabasePath(name) val target = getDatabasePath(name) - return MigrationUtils.moveFiles( - source.parentFile!!, - target.parentFile!!, - source.name - ) + return MigrationUtils.moveFiles(source.parentFile!!, target.parentFile!!, source.name) } } override fun deleteDatabase(name: String): Boolean { - return baseContext.deleteDatabase( - getDatabasePath(name).absolutePath - ) + return baseContext.deleteDatabase(getDatabasePath(name).absolutePath) } override fun databaseList(): Array/files */ { @@ -200,16 +173,12 @@ } override fun getSharedPreferences(name: String, mode: Int): SharedPreferences { - return baseContext.getSharedPreferences( - getSdkSharedPreferenceName(name), - mode - ) + return baseContext.getSharedPreferences(getSdkSharedPreferenceName(name), mode) } /** - * Only moving between instances of [SandboxedSdkContextCompat] supported. - * Supporting of other contexts not possible as prefixed name will not be found by - * internal context implementation. + * Only moving between instances of [SandboxedSdkContextCompat] supported. Supporting of other + * contexts not possible as prefixed name will not be found by internal context implementation. * SDK should work ONLY with SDK context. */ @RequiresApi(Build.VERSION_CODES.N) @@ -234,11 +203,12 @@ synchronized(SandboxedSdkContextCompat::class.java) { val sdkSharedPreferencesName = getSdkSharedPreferenceName(name) - val moveResult = MigrationUtils.moveFiles( - sourceSharedPreferencesDir, - targetSharedPreferencesDir, - "$sdkSharedPreferencesName.xml" - ) + val moveResult = + MigrationUtils.moveFiles( + sourceSharedPreferencesDir, + targetSharedPreferencesDir, + "$sdkSharedPreferencesName.xml" + ) if (moveResult) { // clean cache in source context @@ -251,18 +221,14 @@ @RequiresApi(Build.VERSION_CODES.N) override fun deleteSharedPreferences(name: String): Boolean { - return Api24.deleteSharedPreferences( - baseContext, - getSdkSharedPreferenceName(name) - ) + return Api24.deleteSharedPreferences(baseContext, getSdkSharedPreferenceName(name)) } override fun getClassLoader(): ClassLoader? { return classLoader } - private fun getDatabasesDir(): File = - ensureDirExists(dataDir, "databases") + private fun getDatabasesDir(): File = ensureDirExists(dataDir, "databases") private fun getSdkSharedPreferenceName(originalName: String) = "${SDK_SHARED_PREFERENCES_PREFIX}_${sdkPackageName}_$originalName" @@ -273,9 +239,7 @@ private fun makeFilename(parent: File, name: String): File { if (name.indexOf(File.separatorChar) >= 0) { - throw IllegalArgumentException( - "File $name contains a path separator" - ) + throw IllegalArgumentException("File $name contains a path separator") } return File(parent, name) } @@ -290,11 +254,9 @@ @RequiresApi(Build.VERSION_CODES.LOLLIPOP) private object Api21 { - @DoNotInline - fun codeCacheDir(context: Context): File = context.codeCacheDir + @DoNotInline fun codeCacheDir(context: Context): File = context.codeCacheDir - @DoNotInline - fun noBackupFilesDir(context: Context): File = context.noBackupFilesDir + @DoNotInline fun noBackupFilesDir(context: Context): File = context.noBackupFilesDir } @RequiresApi(Build.VERSION_CODES.N) @@ -303,8 +265,7 @@ fun createDeviceProtectedStorageContext(context: Context): Context = context.createDeviceProtectedStorageContext() - @DoNotInline - fun dataDir(context: Context): File = context.dataDir + @DoNotInline fun dataDir(context: Context): File = context.dataDir @DoNotInline fun deleteSharedPreferences(context: Context, name: String): Boolean =
diff --git a/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/loader/impl/SdkProviderV1.kt b/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/loader/impl/SdkProviderV1.kt index ba7f75a..c31db6d 100644 --- a/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/loader/impl/SdkProviderV1.kt +++ b/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/loader/impl/SdkProviderV1.kt
@@ -27,16 +27,12 @@ import java.lang.reflect.InvocationTargetException import java.lang.reflect.Method -/** - * Provides interface for interaction with locally loaded SDK with ApiVersion 1. - * - */ -internal class SdkProviderV1 private constructor( +/** Provides interface for interaction with locally loaded SDK with ApiVersion 1. */ +internal class SdkProviderV1 +private constructor( sdkProvider: Any, - private val onLoadSdkMethod: Method, private val beforeUnloadSdkMethod: Method, - private val sandboxedSdkCompatBuilder: SandboxedSdkCompatBuilderV1, private val loadSdkCompatExceptionBuilder: LoadSdkCompatExceptionBuilderV1 ) : LocalSdkProvider(sdkProvider) { @@ -62,7 +58,8 @@ beforeUnloadSdkMethod.invoke(sdkProvider) } - internal class SandboxedSdkCompatBuilderV1 private constructor( + internal class SandboxedSdkCompatBuilderV1 + private constructor( private val sdkInfo: SandboxedSdkInfo?, private val getInterfaceMethod: Method ) { @@ -79,11 +76,12 @@ classLoader: ClassLoader, sdkConfig: LocalSdkConfig ): SandboxedSdkCompatBuilderV1 { - val sandboxedSdkCompatClass = Class.forName( - SandboxedSdkCompat::class.java.name, - /* initialize = */ false, - classLoader - ) + val sandboxedSdkCompatClass = + Class.forName( + SandboxedSdkCompat::class.java.name, + /* initialize = */ false, + classLoader + ) val getInterfaceMethod = sandboxedSdkCompatClass.getMethod("getInterface") val sdkInfo = sdkInfo(sdkConfig) return SandboxedSdkCompatBuilderV1(sdkInfo, getInterfaceMethod) @@ -99,7 +97,8 @@ } } - internal class LoadSdkCompatExceptionBuilderV1 private constructor( + internal class LoadSdkCompatExceptionBuilderV1 + private constructor( private val getLoadSdkErrorCodeMethod: Method, private val getExtraInformationMethod: Method ) { @@ -130,17 +129,16 @@ companion object { fun create(classLoader: ClassLoader): LoadSdkCompatExceptionBuilderV1 { - val loadSdkCompatExceptionClass = Class.forName( - LoadSdkCompatException::class.java.name, - /* initialize = */ false, - classLoader - ) - val getLoadSdkErrorCodeMethod = loadSdkCompatExceptionClass.getMethod( - "getLoadSdkErrorCode" - ) - val getExtraInformationMethod = loadSdkCompatExceptionClass.getMethod( - "getExtraInformation" - ) + val loadSdkCompatExceptionClass = + Class.forName( + LoadSdkCompatException::class.java.name, + /* initialize = */ false, + classLoader + ) + val getLoadSdkErrorCodeMethod = + loadSdkCompatExceptionClass.getMethod("getLoadSdkErrorCode") + val getExtraInformationMethod = + loadSdkCompatExceptionClass.getMethod("getExtraInformation") return LoadSdkCompatExceptionBuilderV1( getLoadSdkErrorCodeMethod, getExtraInformationMethod @@ -157,26 +155,19 @@ sdkConfig: LocalSdkConfig, appContext: Context ): SdkProviderV1 { - val sdkProviderClass = Class.forName( - sdkConfig.entryPoint, - /* initialize = */ false, - classLoader - ) + val sdkProviderClass = + Class.forName(sdkConfig.entryPoint, /* initialize= */ false, classLoader) val attachContextMethod = sdkProviderClass.getMethod("attachContext", Context::class.java) val onLoadSdkMethod = sdkProviderClass.getMethod("onLoadSdk", Bundle::class.java) val beforeUnloadSdkMethod = sdkProviderClass.getMethod("beforeUnloadSdk") val sandboxedSdkCompatBuilder = SandboxedSdkCompatBuilderV1.create(classLoader, sdkConfig) - val loadSdkCompatExceptionBuilder = - LoadSdkCompatExceptionBuilderV1.create(classLoader) + val loadSdkCompatExceptionBuilder = LoadSdkCompatExceptionBuilderV1.create(classLoader) val sdkProvider = sdkProviderClass.getConstructor().newInstance() - val sandboxedSdkContextCompat = SandboxedSdkContextCompat( - appContext, - sdkConfig.packageName, - classLoader - ) + val sandboxedSdkContextCompat = + SandboxedSdkContextCompat(appContext, sdkConfig.packageName, classLoader) attachContextMethod.invoke(sdkProvider, sandboxedSdkContextCompat) return SdkProviderV1(
diff --git a/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/loader/impl/injector/ActivityHolderProxyFactory.kt b/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/loader/impl/injector/ActivityHolderProxyFactory.kt index 9c027b7..faad5d0 100644 --- a/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/loader/impl/injector/ActivityHolderProxyFactory.kt +++ b/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/loader/impl/injector/ActivityHolderProxyFactory.kt
@@ -22,39 +22,31 @@ import java.lang.reflect.Method import java.lang.reflect.Proxy -/** - * Create proxy of [ActivityHolder] that implements same interface loaded by SDK Classloader. - */ -internal class ActivityHolderProxyFactory private constructor( +/** Create proxy of [ActivityHolder] that implements same interface loaded by SDK Classloader. */ +internal class ActivityHolderProxyFactory +private constructor( private val sdkClassLoader: ClassLoader, - private val activityHolderClass: Class<*>, - private val backPressedDispatcherProxyFactory: BackPressedDispatcherProxyFactory, - private val lifecycleRegistryProxyFactory: LifecycleRegistryProxyFactory, ) { fun createProxyFor(activityHolder: ActivityHolder): Any { - val dispatcherProxy = backPressedDispatcherProxyFactory.setupOnBackPressedDispatcherProxy( - activityHolder.getOnBackPressedDispatcher() - ) + val dispatcherProxy = + backPressedDispatcherProxyFactory.setupOnBackPressedDispatcherProxy( + activityHolder.getOnBackPressedDispatcher() + ) - val handler = ActivityHolderHandler( - activityHolder.getActivity(), - dispatcherProxy - ) + val handler = ActivityHolderHandler(activityHolder.getActivity(), dispatcherProxy) - val activityHolderProxy = Proxy.newProxyInstance( - sdkClassLoader, - arrayOf(activityHolderClass), - handler - ) + val activityHolderProxy = + Proxy.newProxyInstance(sdkClassLoader, arrayOf(activityHolderClass), handler) - val lifecycleProxy = lifecycleRegistryProxyFactory.setupLifecycleProxy( - activityHolderProxy, - activityHolder.lifecycle - ) + val lifecycleProxy = + lifecycleRegistryProxyFactory.setupLifecycleProxy( + activityHolderProxy, + activityHolder.lifecycle + ) handler.lifecycleProxy = lifecycleProxy return activityHolderProxy @@ -86,11 +78,8 @@ companion object { fun createFor(classLoader: ClassLoader): ActivityHolderProxyFactory { - val activityHolderClass = Class.forName( - ActivityHolder::class.java.name, - /* initialize = */ false, - classLoader - ) + val activityHolderClass = + Class.forName(ActivityHolder::class.java.name, /* initialize= */ false, classLoader) val lifecycleRegistryProxyFactory = LifecycleRegistryProxyFactory.createFor(classLoader) val backPressedDispatcherProxyFactory =
diff --git a/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/loader/impl/injector/AppOwnedSdkInterfaceProxyFactory.kt b/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/loader/impl/injector/AppOwnedSdkInterfaceProxyFactory.kt index 56028dc..880f7b1 100644 --- a/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/loader/impl/injector/AppOwnedSdkInterfaceProxyFactory.kt +++ b/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/loader/impl/injector/AppOwnedSdkInterfaceProxyFactory.kt
@@ -20,9 +20,7 @@ import androidx.privacysandbox.sdkruntime.core.AppOwnedSdkSandboxInterfaceCompat import java.lang.reflect.Constructor -/** - * Create instance of [AppOwnedSdkSandboxInterfaceCompat] class loaded by SDK Classloader. - */ +/** Create instance of [AppOwnedSdkSandboxInterfaceCompat] class loaded by SDK Classloader. */ internal class AppOwnedSdkInterfaceProxyFactory( private val appOwnedSdkSandboxInterfaceCompatConstructor: Constructor) { @@ -43,11 +41,12 @@ companion object { fun createFor(classLoader: ClassLoader): AppOwnedSdkInterfaceProxyFactory { - val appOwnedSdkSandboxInterfaceCompatClass = Class.forName( - AppOwnedSdkSandboxInterfaceCompat::class.java.name, - /* initialize = */ false, - classLoader - ) + val appOwnedSdkSandboxInterfaceCompatClass = + Class.forName( + AppOwnedSdkSandboxInterfaceCompat::class.java.name, + /* initialize = */ false, + classLoader + ) val appOwnedSdkSandboxInterfaceCompatConstructor = appOwnedSdkSandboxInterfaceCompatClass.getConstructor( /* name */ String::class.java,
diff --git a/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/loader/impl/injector/BackPressedDispatcherProxyFactory.kt b/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/loader/impl/injector/BackPressedDispatcherProxyFactory.kt index 794d5c7..f998cf3 100644 --- a/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/loader/impl/injector/BackPressedDispatcherProxyFactory.kt +++ b/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/loader/impl/injector/BackPressedDispatcherProxyFactory.kt
@@ -25,10 +25,10 @@ import java.lang.reflect.Proxy /** - * Create instance of [OnBackPressedDispatcher] class loaded by SDK Classloader. - * Set callback for [OnBackPressedDispatcher.onHasEnabledCallbacksChanged] and enable/disable - * callback in original [OnBackPressedDispatcher]. - * Proxy [OnBackPressedDispatcher.onBackPressed] from original dispatcher to proxy. + * Create instance of [OnBackPressedDispatcher] class loaded by SDK Classloader. Set callback for + * [OnBackPressedDispatcher.onHasEnabledCallbacksChanged] and enable/disable callback in original + * [OnBackPressedDispatcher]. Proxy [OnBackPressedDispatcher.onBackPressed] from original dispatcher + * to proxy. */ internal class BackPressedDispatcherProxyFactory( private val onBackPressedDispatcherConstructor: Constructor, @@ -36,20 +36,16 @@ private val dispatcherOnBackPressedMethod: Method, private val sdkClassLoader: ClassLoader ) { - fun setupOnBackPressedDispatcherProxy( - sourceDispatcher: OnBackPressedDispatcher - ): Any { + fun setupOnBackPressedDispatcherProxy(sourceDispatcher: OnBackPressedDispatcher): Any { val enabledChangedHandler = OnHasEnabledCallbacksChangedHandler() - val onHasEnabledCallbacksChangedCallback = Proxy.newProxyInstance( - sdkClassLoader, - arrayOf(consumerClass), - enabledChangedHandler - ) - val dispatcherProxy = onBackPressedDispatcherConstructor.newInstance( - /* parameter1 */ null, - /* parameter2 */ onHasEnabledCallbacksChangedCallback - ) + val onHasEnabledCallbacksChangedCallback = + Proxy.newProxyInstance(sdkClassLoader, arrayOf(consumerClass), enabledChangedHandler) + val dispatcherProxy = + onBackPressedDispatcherConstructor.newInstance( + /* parameter1 */ null, + /* parameter2 */ onHasEnabledCallbacksChangedCallback + ) val sourceDispatcherCallback = SourceDispatcherCallback(dispatcherProxy, dispatcherOnBackPressedMethod) @@ -93,25 +89,24 @@ companion object { fun createFor(classLoader: ClassLoader): BackPressedDispatcherProxyFactory { - val onBackPressedDispatcherClass = Class.forName( - "androidx.activity.OnBackPressedDispatcher", - /* initialize = */ false, - classLoader - ) + val onBackPressedDispatcherClass = + Class.forName( + "androidx.activity.OnBackPressedDispatcher", + /* initialize = */ false, + classLoader + ) - val consumerClass = Class.forName( - "androidx.core.util.Consumer", - /* initialize = */ false, - classLoader - ) + val consumerClass = + Class.forName("androidx.core.util.Consumer", /* initialize= */ false, classLoader) - val onBackPressedDispatcherConstructor = onBackPressedDispatcherClass.getConstructor( - /* parameter1 */ Runnable::class.java, - /* parameter2 */ consumerClass - ) + val onBackPressedDispatcherConstructor = + onBackPressedDispatcherClass.getConstructor( + /* parameter1 */ Runnable::class.java, + /* parameter2 */ consumerClass + ) - val dispatcherOnBackPressedMethod = onBackPressedDispatcherClass - .getMethod("onBackPressed") + val dispatcherOnBackPressedMethod = + onBackPressedDispatcherClass.getMethod("onBackPressed") return BackPressedDispatcherProxyFactory( onBackPressedDispatcherConstructor,
diff --git a/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/loader/impl/injector/LifecycleRegistryProxyFactory.kt b/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/loader/impl/injector/LifecycleRegistryProxyFactory.kt index 509cf50..0593c80 100644 --- a/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/loader/impl/injector/LifecycleRegistryProxyFactory.kt +++ b/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/loader/impl/injector/LifecycleRegistryProxyFactory.kt
@@ -24,47 +24,47 @@ import java.lang.reflect.Method /** - * Create proxy of [Lifecycle] that implements same interface loaded by SDK Classloader. - * Proxy [Lifecycle.Event] from original object to proxy. + * Create proxy of [Lifecycle] that implements same interface loaded by SDK Classloader. Proxy + * [Lifecycle.Event] from original object to proxy. */ -internal class LifecycleRegistryProxyFactory private constructor( +internal class LifecycleRegistryProxyFactory +private constructor( private val lifecycleRegistryConstructor: Constructor, private val lifecycleEventInstances: Map, private val handleLifecycleEventMethod: Method ) { - fun setupLifecycleProxy( - activityHolderProxy: Any, - sourceLifecycle: Lifecycle - ): Any { + fun setupLifecycleProxy(activityHolderProxy: Any, sourceLifecycle: Lifecycle): Any { val registry = lifecycleRegistryConstructor.newInstance(activityHolderProxy) - sourceLifecycle.addObserver(object : LifecycleEventObserver { - @SuppressLint("BanUncheckedReflection") // using reflection on library classes - override fun onStateChanged(source: LifecycleOwner, event: Lifecycle.Event) { - val enumInstance = lifecycleEventInstances[event.name] - if (enumInstance != null) { - handleLifecycleEventMethod.invoke(registry, enumInstance) + sourceLifecycle.addObserver( + object : LifecycleEventObserver { + @SuppressLint("BanUncheckedReflection") // using reflection on library classes + override fun onStateChanged(source: LifecycleOwner, event: Lifecycle.Event) { + val enumInstance = lifecycleEventInstances[event.name] + if (enumInstance != null) { + handleLifecycleEventMethod.invoke(registry, enumInstance) + } } } - }) + ) return registry } companion object { fun createFor(classLoader: ClassLoader): LifecycleRegistryProxyFactory { - val lifecycleOwnerClass = Class.forName( - "androidx.lifecycle.LifecycleOwner", - /* initialize = */ false, - classLoader - ) - val lifecycleRegistryClass = Class.forName( - "androidx.lifecycle.LifecycleRegistry", - /* initialize = */ false, - classLoader - ) - val lifecycleRegistryConstructor = - lifecycleRegistryClass.getConstructor( - /* parameter1 */ lifecycleOwnerClass + val lifecycleOwnerClass = + Class.forName( + "androidx.lifecycle.LifecycleOwner", + /* initialize = */ false, + classLoader ) + val lifecycleRegistryClass = + Class.forName( + "androidx.lifecycle.LifecycleRegistry", + /* initialize = */ false, + classLoader + ) + val lifecycleRegistryConstructor = + lifecycleRegistryClass.getConstructor(/* parameter1 */ lifecycleOwnerClass) val lifecycleEventEnum = Class.forName( @@ -72,15 +72,16 @@ /* initialize = */ false, classLoader ) - val lifecycleEventInstances = lifecycleEventEnum - .enumConstants - .filterIsInstance(Enum::class.java) - .associateBy({ it.name }, { it }) + val lifecycleEventInstances = + lifecycleEventEnum.enumConstants + .filterIsInstance(Enum::class.java) + .associateBy({ it.name }, { it }) - val handleLifecycleEventMethod = lifecycleRegistryClass.getMethod( - "handleLifecycleEvent", - /* parameter1 */ lifecycleEventEnum - ) + val handleLifecycleEventMethod = + lifecycleRegistryClass.getMethod( + "handleLifecycleEvent", + /* parameter1 */ lifecycleEventEnum + ) return LifecycleRegistryProxyFactory( lifecycleRegistryConstructor,
diff --git a/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/loader/impl/injector/LoadSdkCallbackWrapper.kt b/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/loader/impl/injector/LoadSdkCallbackWrapper.kt index 77ae31b..c48c7ae 100644 --- a/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/loader/impl/injector/LoadSdkCallbackWrapper.kt +++ b/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/loader/impl/injector/LoadSdkCallbackWrapper.kt
@@ -26,7 +26,8 @@ * Creates reflection wrapper for implementation of [LoadSdkCallback] interface loaded by SDK * classloader. */ -internal class LoadSdkCallbackWrapper private constructor( +internal class LoadSdkCallbackWrapper +private constructor( private val callbackOnResultMethod: Method, private val callbackOnErrorMethod: Method, private val sandboxedSdkFactory: SandboxedSdkCompatProxyFactory, @@ -65,33 +66,30 @@ companion object { fun createFor(classLoader: ClassLoader): LoadSdkCallbackWrapper { - val loadSdkCallbackClass = Class.forName( - LoadSdkCallback::class.java.name, - /* initialize = */ false, - classLoader - ) - val sandboxedSdkCompatClass = Class.forName( - SandboxedSdkCompat::class.java.name, - /* initialize = */ false, - classLoader - ) - val loadSdkCompatExceptionClass = Class.forName( - LoadSdkCompatException::class.java.name, - /* initialize = */ false, - classLoader - ) + val loadSdkCallbackClass = + Class.forName( + LoadSdkCallback::class.java.name, + /* initialize = */ false, + classLoader + ) + val sandboxedSdkCompatClass = + Class.forName( + SandboxedSdkCompat::class.java.name, + /* initialize = */ false, + classLoader + ) + val loadSdkCompatExceptionClass = + Class.forName( + LoadSdkCompatException::class.java.name, + /* initialize = */ false, + classLoader + ) val callbackOnResultMethod = - loadSdkCallbackClass.getMethod( - "onResult", - sandboxedSdkCompatClass - ) + loadSdkCallbackClass.getMethod("onResult", sandboxedSdkCompatClass) val callbackOnErrorMethod = - loadSdkCallbackClass.getMethod( - "onError", - loadSdkCompatExceptionClass - ) + loadSdkCallbackClass.getMethod("onError", loadSdkCompatExceptionClass) val sandboxedSdkFactory = SandboxedSdkCompatProxyFactory.createFor(classLoader) val loadSdkExceptionFactory = LoadSdkCompatExceptionProxyFactory.createFor(classLoader)
diff --git a/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/loader/impl/injector/LoadSdkCompatExceptionProxyFactory.kt b/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/loader/impl/injector/LoadSdkCompatExceptionProxyFactory.kt index f8e22cc..555f23d 100644 --- a/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/loader/impl/injector/LoadSdkCompatExceptionProxyFactory.kt +++ b/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/loader/impl/injector/LoadSdkCompatExceptionProxyFactory.kt
@@ -20,12 +20,9 @@ import androidx.privacysandbox.sdkruntime.core.LoadSdkCompatException import java.lang.reflect.Constructor -/** - * Creates instance of [LoadSdkCompatException] class loaded by SDK Classloader. - */ -internal class LoadSdkCompatExceptionProxyFactory private constructor( - private val loadSdkCompatExceptionConstructor: Constructor-) { +/** Creates instance of [LoadSdkCompatException] class loaded by SDK Classloader. */ +internal class LoadSdkCompatExceptionProxyFactory +private constructor(private val loadSdkCompatExceptionConstructor: Constructor ) { /** * Creates instance of [LoadSdkCompatException] class loaded by SDK Classloader. * @@ -43,11 +40,12 @@ companion object { fun createFor(classLoader: ClassLoader): LoadSdkCompatExceptionProxyFactory { - val loadSdkCompatExceptionClass = Class.forName( - LoadSdkCompatException::class.java.name, - /* initialize = */ false, - classLoader - ) + val loadSdkCompatExceptionClass = + Class.forName( + LoadSdkCompatException::class.java.name, + /* initialize = */ false, + classLoader + ) val loadSdkCompatExceptionConstructor = loadSdkCompatExceptionClass.getConstructor( /* parameter1 */ Int::class.java,
diff --git a/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/loader/impl/injector/SandboxedSdkCompatProxyFactory.kt b/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/loader/impl/injector/SandboxedSdkCompatProxyFactory.kt index efcb08e..f896f3d 100644 --- a/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/loader/impl/injector/SandboxedSdkCompatProxyFactory.kt +++ b/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/loader/impl/injector/SandboxedSdkCompatProxyFactory.kt
@@ -21,10 +21,9 @@ import androidx.privacysandbox.sdkruntime.core.SandboxedSdkInfo import java.lang.reflect.Constructor -/** - * Creates instance of [SandboxedSdkCompat] class loaded by SDK Classloader. - */ -internal class SandboxedSdkCompatProxyFactory private constructor( +/** Creates instance of [SandboxedSdkCompat] class loaded by SDK Classloader. */ +internal class SandboxedSdkCompatProxyFactory +private constructor( private val sandboxedSdkInfoConstructor: Constructor, private val sandboxedSdkCompatConstructor: Constructor, ) { @@ -48,16 +47,18 @@ companion object { fun createFor(classLoader: ClassLoader): SandboxedSdkCompatProxyFactory { - val sandboxedSdkCompatClass = Class.forName( - SandboxedSdkCompat::class.java.name, - /* initialize = */ false, - classLoader - ) - val sandboxedSdkInfoClass = Class.forName( - SandboxedSdkInfo::class.java.name, - /* initialize = */ false, - classLoader - ) + val sandboxedSdkCompatClass = + Class.forName( + SandboxedSdkCompat::class.java.name, + /* initialize = */ false, + classLoader + ) + val sandboxedSdkInfoClass = + Class.forName( + SandboxedSdkInfo::class.java.name, + /* initialize = */ false, + classLoader + ) val sandboxedSdkCompatConstructor = sandboxedSdkCompatClass.getConstructor( /* parameter1 */ IBinder::class.java,
diff --git a/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/loader/impl/injector/SdkActivityHandlerWrapper.kt b/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/loader/impl/injector/SdkActivityHandlerWrapper.kt index cdc7fb3..9142b71 100644 --- a/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/loader/impl/injector/SdkActivityHandlerWrapper.kt +++ b/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/loader/impl/injector/SdkActivityHandlerWrapper.kt
@@ -25,7 +25,8 @@ * Creates reflection wrapper for implementation of [SdkSandboxActivityHandlerCompat] interface * loaded by SDK classloader. */ -internal class SdkActivityHandlerWrapper private constructor( +internal class SdkActivityHandlerWrapper +private constructor( private val activityHolderProxyFactory: ActivityHolderProxyFactory, private val handlerOnActivityCreatedMethod: Method, ) { @@ -48,16 +49,14 @@ companion object { fun createFor(classLoader: ClassLoader): SdkActivityHandlerWrapper { - val sdkSandboxActivityHandlerCompatClass = Class.forName( - SdkSandboxActivityHandlerCompat::class.java.name, - /* initialize = */ false, - classLoader - ) - val activityHolderClass = Class.forName( - ActivityHolder::class.java.name, - /* initialize = */ false, - classLoader - ) + val sdkSandboxActivityHandlerCompatClass = + Class.forName( + SdkSandboxActivityHandlerCompat::class.java.name, + /* initialize = */ false, + classLoader + ) + val activityHolderClass = + Class.forName(ActivityHolder::class.java.name, /* initialize= */ false, classLoader) val handlerOnActivityCreatedMethod = sdkSandboxActivityHandlerCompatClass.getMethod( "onActivityCreated",
diff --git a/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/loader/storage/CachedLocalSdkStorage.kt b/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/loader/storage/CachedLocalSdkStorage.kt index 41c6c21..dcf8a3c 100644 --- a/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/loader/storage/CachedLocalSdkStorage.kt +++ b/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/loader/storage/CachedLocalSdkStorage.kt
@@ -26,24 +26,24 @@ /** * Caching implementation of [LocalSdkStorage]. * - * Extract SDK DEX files into folder provided by [LocalSdkFolderProvider]. - * Not extracting new files if available space lower than lowSpaceThreshold. - * Return result only if all files successfully extracted. + * Extract SDK DEX files into folder provided by [LocalSdkFolderProvider]. Not extracting new files + * if available space lower than lowSpaceThreshold. Return result only if all files successfully + * extracted. */ -internal class CachedLocalSdkStorage private constructor( +internal class CachedLocalSdkStorage +private constructor( private val context: Context, private val rootFolderProvider: LocalSdkFolderProvider, private val lowSpaceThreshold: Long ) : LocalSdkStorage { /** - * Return SDK DEX files from folder provided by [LocalSdkFolderProvider]. - * Extract missing files from assets if available space bigger than lowSpaceThreshold. + * Return SDK DEX files from folder provided by [LocalSdkFolderProvider]. Extract missing files + * from assets if available space bigger than lowSpaceThreshold. * * @param sdkConfig sdk config - * @return [LocalSdkDexFiles] if all SDK DEX files available in SDK folder - * or null if something missing and couldn't be extracted because of - * available space lower than lowSpaceThreshold + * @return [LocalSdkDexFiles] if all SDK DEX files available in SDK folder or null if something + * missing and couldn't be extracted because of available space lower than lowSpaceThreshold */ override fun dexFilesFor(sdkConfig: LocalSdkConfig): LocalSdkDexFiles? { val disableExtracting = availableBytes() < lowSpaceThreshold @@ -76,11 +76,7 @@ ) if (!targetFolder.deleteRecursively()) { - Log.e( - LOG_TAG, - "Failed to delete $targetFolder during cleanup.", - ex - ) + Log.e(LOG_TAG, "Failed to delete $targetFolder during cleanup.", ex) } throw ex @@ -93,9 +89,7 @@ ) { outputFile.createNewFile() context.assets.open(assetName).use { fromStream -> - outputFile.outputStream().use { toStream -> - fromStream.copyTo(toStream) - } + outputFile.outputStream().use { toStream -> fromStream.copyTo(toStream) } } outputFile.setReadOnly() } @@ -115,12 +109,9 @@ * * @param context Application context * @param lowSpaceThreshold Minimal available space in bytes required to proceed with - * extracting new SDK Dex files. + * extracting new SDK Dex files. */ - fun create( - context: Context, - lowSpaceThreshold: Long - ): CachedLocalSdkStorage { + fun create(context: Context, lowSpaceThreshold: Long): CachedLocalSdkStorage { val localSdkFolderProvider = LocalSdkFolderProvider.create(context) return CachedLocalSdkStorage(context, localSdkFolderProvider, lowSpaceThreshold) }
diff --git a/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/loader/storage/LocalSdkDexFiles.kt b/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/loader/storage/LocalSdkDexFiles.kt index 6cf8035..fb4cdc6 100644 --- a/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/loader/storage/LocalSdkDexFiles.kt +++ b/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/loader/storage/LocalSdkDexFiles.kt
@@ -21,15 +21,9 @@ import androidx.annotation.RestrictTo import java.io.File -/** - * Represent SDK Dex files extracted to device storage. - */ -internal data class LocalSdkDexFiles( - val files: List-) +/** Represent SDK Dex files extracted to device storage. */ +internal data class LocalSdkDexFiles(val files: List ) -/** - * Convert [LocalSdkDexFiles] to ClassPath string. - */ +/** Convert [LocalSdkDexFiles] to ClassPath string. */ internal fun LocalSdkDexFiles.toClassPathString() = files.joinToString(separator = File.pathSeparator, transform = File::getPath)
diff --git a/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/loader/storage/LocalSdkFolderProvider.kt b/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/loader/storage/LocalSdkFolderProvider.kt index 7057870..eeab1f5 100644 --- a/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/loader/storage/LocalSdkFolderProvider.kt +++ b/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/loader/storage/LocalSdkFolderProvider.kt
@@ -31,16 +31,12 @@ /** * Create folders for Local SDKs in ([Context.getCodeCacheDir] / RuntimeEnabledSdk /) * Store Application update time ([android.content.pm.PackageInfo.lastUpdateTime]) in - * ([Context.getCodeCacheDir] / RuntimeEnabledSdk / Folder.version) file. - * Remove SDK Folders if Application was updated after folders were created. + * ([Context.getCodeCacheDir] / RuntimeEnabledSdk / Folder.version) file. Remove SDK Folders if + * Application was updated after folders were created. */ -internal class LocalSdkFolderProvider private constructor( - private val sdkRootFolder: File -) { +internal class LocalSdkFolderProvider private constructor(private val sdkRootFolder: File) { - /** - * Return folder on storage that should be used for storing SDK DEX files. - */ + /** Return folder on storage that should be used for storing SDK DEX files. */ fun dexFolderFor(sdkConfig: LocalSdkConfig): File { val sdkDexFolder = File(sdkRootFolder, sdkConfig.packageName) if (!sdkDexFolder.exists()) { @@ -58,8 +54,8 @@ /** * Create LocalSdkFolderProvider. * - * Check if current root folder created in same app installation - * and remove folder content if not. + * Check if current root folder created in same app installation and remove folder content + * if not. */ fun create(context: Context): LocalSdkFolderProvider { val sdkRootFolder = createSdkRootFolder(context) @@ -132,18 +128,15 @@ @RequiresApi(LOLLIPOP) private object Api21Impl { - @DoNotInline - fun codeCacheDir(context: Context): File = - context.codeCacheDir + @DoNotInline fun codeCacheDir(context: Context): File = context.codeCacheDir } @RequiresApi(TIRAMISU) private object Api33Impl { @DoNotInline fun getLastUpdateTime(context: Context): Long = - context.packageManager.getPackageInfo( - context.packageName, - PackageManager.PackageInfoFlags.of(0) - ).lastUpdateTime + context.packageManager + .getPackageInfo(context.packageName, PackageManager.PackageInfoFlags.of(0)) + .lastUpdateTime } }
diff --git a/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/loader/storage/LocalSdkStorage.kt b/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/loader/storage/LocalSdkStorage.kt index 371c6bb..588a283 100644 --- a/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/loader/storage/LocalSdkStorage.kt +++ b/privacysandbox/sdkruntime/sdkruntime-client/src/main/java/androidx/privacysandbox/sdkruntime/client/loader/storage/LocalSdkStorage.kt
@@ -18,9 +18,7 @@ import androidx.privacysandbox.sdkruntime.client.config.LocalSdkConfig -/** - * Provides interface for getting SDK related files. - */ +/** Provides interface for getting SDK related files. */ internal interface LocalSdkStorage { /** * Get [LocalSdkDexFiles] for bundled SDK.
diff --git a/privacysandbox/sdkruntime/sdkruntime-client/src/test/java/androidx/privacysandbox/sdkruntime/client/loader/ResourceRemappingTest.kt b/privacysandbox/sdkruntime/sdkruntime-client/src/test/java/androidx/privacysandbox/sdkruntime/client/loader/ResourceRemappingTest.kt index ac4c7ee..4667df3d 100644 --- a/privacysandbox/sdkruntime/sdkruntime-client/src/test/java/androidx/privacysandbox/sdkruntime/client/loader/ResourceRemappingTest.kt +++ b/privacysandbox/sdkruntime/sdkruntime-client/src/test/java/androidx/privacysandbox/sdkruntime/client/loader/ResourceRemappingTest.kt
@@ -33,28 +33,25 @@ @RunWith(JUnit4::class) class ResourceRemappingTest { - @field:Rule - @JvmField - val temporaryFolder = TemporaryFolder() + @field:Rule @JvmField val temporaryFolder = TemporaryFolder() @Test fun apply_whenNonNullConfig_updatePackageId() { - val classLoader = compileAndLoad( - Source.java( - "RPackage", """ + val classLoader = + compileAndLoad( + Source.java( + "RPackage", + """ public class RPackage { public static int packageId = 0; } """ + ) ) - ) ResourceRemapping.apply( classLoader, - ResourceRemappingConfig( - rPackageClassName = "RPackage", - packageId = 0x2A - ) + ResourceRemappingConfig(rPackageClassName = "RPackage", packageId = 0x2A) ) val rPackageClass = classLoader.loadClass("RPackage") @@ -66,51 +63,48 @@ @Test fun apply_whenNullConfig_doesntThrow() { - val classLoader = compileAndLoad( - Source.java( - "AnotherClass", """ + val classLoader = + compileAndLoad( + Source.java( + "AnotherClass", + """ public class AnotherClass { } """ + ) ) - ) - ResourceRemapping.apply( - classLoader, - remappingConfig = null - ) + ResourceRemapping.apply(classLoader, remappingConfig = null) } @Test fun apply_whenNoRPackageClass_throwsClassNotFoundException() { - val source = Source.java( - "AnotherClass", """ + val source = + Source.java( + "AnotherClass", + """ public class AnotherClass { } """ - ) + ) - val config = ResourceRemappingConfig( - rPackageClassName = "RPackage", - packageId = 42 - ) + val config = ResourceRemappingConfig(rPackageClassName = "RPackage", packageId = 42) assertThrows(ClassNotFoundException::class, source, config) } @Test fun apply_whenNoPackageIdField_throwsNoSuchFieldException() { - val source = Source.java( - "RPackage", """ + val source = + Source.java( + "RPackage", + """ public class RPackage { } """ - ) + ) - val config = ResourceRemappingConfig( - rPackageClassName = "RPackage", - packageId = 42 - ) + val config = ResourceRemappingConfig(rPackageClassName = "RPackage", packageId = 42) assertThrows(NoSuchFieldException::class, source, config) } @@ -121,28 +115,22 @@ config: ResourceRemappingConfig ) { val classLoader = compileAndLoad(source) - assertThrows(expectedThrowable.java) { - ResourceRemapping.apply( - classLoader, - config - ) - } + assertThrows(expectedThrowable.java) { ResourceRemapping.apply(classLoader, config) } } private fun compileAndLoad(source: Source): ClassLoader { - val compilationResult = compile( - temporaryFolder.root, - TestCompilationArguments( - sources = listOf(source), + val compilationResult = + compile( + temporaryFolder.root, + TestCompilationArguments( + sources = listOf(source), + ) ) - ) assertThat(compilationResult.success).isTrue() return URLClassLoader.newInstance( - compilationResult.outputClasspath.map { - it.toURI().toURL() - }.toTypedArray(), + compilationResult.outputClasspath.map { it.toURI().toURL() }.toTypedArray(), /* parent = */ null ) }
diff --git a/privacysandbox/sdkruntime/sdkruntime-core/src/androidTest/java/androidx/privacysandbox/sdkruntime/core/AppOwnedSdkSandboxInterfaceCompatTest.kt b/privacysandbox/sdkruntime/sdkruntime-core/src/androidTest/java/androidx/privacysandbox/sdkruntime/core/AppOwnedSdkSandboxInterfaceCompatTest.kt index 1d712a8..265d88f8 100644 --- a/privacysandbox/sdkruntime/sdkruntime-core/src/androidTest/java/androidx/privacysandbox/sdkruntime/core/AppOwnedSdkSandboxInterfaceCompatTest.kt +++ b/privacysandbox/sdkruntime/sdkruntime-core/src/androidTest/java/androidx/privacysandbox/sdkruntime/core/AppOwnedSdkSandboxInterfaceCompatTest.kt
@@ -48,11 +48,8 @@ @Test fun toAppOwnedSdkSandboxInterfaceTest() { - val compatObj = AppOwnedSdkSandboxInterfaceCompat( - name = "SDK", - version = 1, - binder = Binder() - ) + val compatObj = + AppOwnedSdkSandboxInterfaceCompat(name = "SDK", version = 1, binder = Binder()) val platformObj = compatObj.toAppOwnedSdkSandboxInterface() @@ -63,9 +60,7 @@ @Test fun fromAppOwnedSdkSandboxInterfaceTest() { - val platformObj = AppOwnedSdkSandboxInterface( - "SDK", 1, Binder() - ) + val platformObj = AppOwnedSdkSandboxInterface("SDK", 1, Binder()) val compatObj = AppOwnedSdkSandboxInterfaceCompat(platformObj) assertThat(compatObj.getName()).isEqualTo(platformObj.getName())
diff --git a/privacysandbox/sdkruntime/sdkruntime-core/src/androidTest/java/androidx/privacysandbox/sdkruntime/core/LoadSdkCompatExceptionTest.kt b/privacysandbox/sdkruntime/sdkruntime-core/src/androidTest/java/androidx/privacysandbox/sdkruntime/core/LoadSdkCompatExceptionTest.kt index ea78cd7..6d7c544 100644 --- a/privacysandbox/sdkruntime/sdkruntime-core/src/androidTest/java/androidx/privacysandbox/sdkruntime/core/LoadSdkCompatExceptionTest.kt +++ b/privacysandbox/sdkruntime/sdkruntime-core/src/androidTest/java/androidx/privacysandbox/sdkruntime/core/LoadSdkCompatExceptionTest.kt
@@ -35,8 +35,7 @@ val loadSdkException = loadSdkCompatException.toLoadSdkException() - assertThat(loadSdkException.cause) - .isSameInstanceAs(loadSdkCompatException.cause) + assertThat(loadSdkException.cause).isSameInstanceAs(loadSdkCompatException.cause) assertThat(loadSdkException.extraInformation) .isSameInstanceAs(loadSdkCompatException.extraInformation) assertThat(loadSdkException.loadSdkErrorCode) @@ -45,15 +44,11 @@ @Test fun toLoadCompatSdkException_returnLoadCompatSdkException() { - val loadSdkException = LoadSdkException( - RuntimeException(), - Bundle() - ) + val loadSdkException = LoadSdkException(RuntimeException(), Bundle()) val loadCompatSdkException = toLoadCompatSdkException(loadSdkException) - assertThat(loadCompatSdkException.cause) - .isSameInstanceAs(loadSdkException.cause) + assertThat(loadCompatSdkException.cause).isSameInstanceAs(loadSdkException.cause) assertThat(loadCompatSdkException.extraInformation) .isSameInstanceAs(loadSdkException.extraInformation) assertThat(loadCompatSdkException.loadSdkErrorCode)
diff --git a/privacysandbox/sdkruntime/sdkruntime-core/src/androidTest/java/androidx/privacysandbox/sdkruntime/core/SandboxedSdkCompatTest.kt b/privacysandbox/sdkruntime/sdkruntime-core/src/androidTest/java/androidx/privacysandbox/sdkruntime/core/SandboxedSdkCompatTest.kt index f862dec..757f172 100644 --- a/privacysandbox/sdkruntime/sdkruntime-core/src/androidTest/java/androidx/privacysandbox/sdkruntime/core/SandboxedSdkCompatTest.kt +++ b/privacysandbox/sdkruntime/sdkruntime-core/src/androidTest/java/androidx/privacysandbox/sdkruntime/core/SandboxedSdkCompatTest.kt
@@ -40,8 +40,7 @@ val sandboxedSdkCompat = SandboxedSdkCompat(binder) - assertThat(sandboxedSdkCompat.getInterface()) - .isSameInstanceAs(binder) + assertThat(sandboxedSdkCompat.getInterface()).isSameInstanceAs(binder) } @Test @@ -51,8 +50,7 @@ val toSandboxedSdkResult = SandboxedSdkCompat(binder).toSandboxedSdk() - assertThat(toSandboxedSdkResult.getInterface()) - .isSameInstanceAs(binder) + assertThat(toSandboxedSdkResult.getInterface()).isSameInstanceAs(binder) } @Test @@ -63,8 +61,7 @@ val toSandboxedSdkResult = SandboxedSdkCompat(sandboxedSdk).toSandboxedSdk() - assertThat(toSandboxedSdkResult) - .isSameInstanceAs(sandboxedSdk) + assertThat(toSandboxedSdkResult).isSameInstanceAs(sandboxedSdk) } @Test @@ -95,20 +92,12 @@ val sandboxedSdkCompat = SandboxedSdkCompat(sandboxedSdk) val sdkInfo = sandboxedSdkCompat.getSdkInfo() - assertThat(sdkInfo).isEqualTo( - SandboxedSdkInfo( - sdkName, - sdkVersion - ) - ) + assertThat(sdkInfo).isEqualTo(SandboxedSdkInfo(sdkName, sdkVersion)) } private object Api34Impl { @RequiresApi(28) - fun mockSharedLibraryInfo( - sdkName: String, - sdkVersion: Long - ): SharedLibraryInfo { + fun mockSharedLibraryInfo(sdkName: String, sdkVersion: Long): SharedLibraryInfo { // No public constructor for SharedLibraryInfo available. val sharedLibraryInfo = Mockito.mock(SharedLibraryInfo::class.java) `when`(sharedLibraryInfo.name).thenReturn(sdkName)
diff --git a/privacysandbox/sdkruntime/sdkruntime-core/src/androidTest/java/androidx/privacysandbox/sdkruntime/core/controller/SdkSandboxControllerAppOwnedInterfacesTest.kt b/privacysandbox/sdkruntime/sdkruntime-core/src/androidTest/java/androidx/privacysandbox/sdkruntime/core/controller/SdkSandboxControllerAppOwnedInterfacesTest.kt index 3c94c46..344abd6 100644 --- a/privacysandbox/sdkruntime/sdkruntime-core/src/androidTest/java/androidx/privacysandbox/sdkruntime/core/controller/SdkSandboxControllerAppOwnedInterfacesTest.kt +++ b/privacysandbox/sdkruntime/sdkruntime-core/src/androidTest/java/androidx/privacysandbox/sdkruntime/core/controller/SdkSandboxControllerAppOwnedInterfacesTest.kt
@@ -34,9 +34,7 @@ @SdkSuppress(minSdkVersion = 34) class SdkSandboxControllerAppOwnedInterfacesTest { - @Rule - @JvmField - val sdkSandboxControllerMockRule = SdkSandboxControllerMockRule() + @Rule @JvmField val sdkSandboxControllerMockRule = SdkSandboxControllerMockRule() @Test fun getAppOwnedSdkSandboxInterfaces_whenApiNotAvailable_returnsEmptyList() { @@ -55,20 +53,13 @@ @RequiresExtension(extension = SdkExtensions.AD_SERVICES, version = 8) @SdkSuppress(minSdkVersion = 34) fun getAppOwnedSdkSandboxInterfaces_whenApiAvailable_delegateToPlatform() { - assumeTrue( - "Requires AppOwnedInterfaces API available", - isAppOwnedInterfacesApiAvailable() - ) + assumeTrue("Requires AppOwnedInterfaces API available", isAppOwnedInterfacesApiAvailable()) - val expectedObj = AppOwnedSdkSandboxInterfaceCompat( - name = "test", - version = 1, - binder = Binder() - ) + val expectedObj = + AppOwnedSdkSandboxInterfaceCompat(name = "test", version = 1, binder = Binder()) val platformObj = expectedObj.toAppOwnedSdkSandboxInterface() val controllerMock = sdkSandboxControllerMockRule.sdkSandboxControllerMock - `when`(controllerMock.getAppOwnedSdkSandboxInterfaces()) - .thenReturn(listOf(platformObj)) + `when`(controllerMock.getAppOwnedSdkSandboxInterfaces()).thenReturn(listOf(platformObj)) val controllerCompat = sdkSandboxControllerMockRule.controllerCompat val appOwnedInterfaces = controllerCompat.getAppOwnedSdkSandboxInterfaces()
diff --git a/privacysandbox/sdkruntime/sdkruntime-core/src/androidTest/java/androidx/privacysandbox/sdkruntime/core/controller/SdkSandboxControllerClientPackageNameTest.kt b/privacysandbox/sdkruntime/sdkruntime-core/src/androidTest/java/androidx/privacysandbox/sdkruntime/core/controller/SdkSandboxControllerClientPackageNameTest.kt index 28f12c0..8e5b92e 100644 --- a/privacysandbox/sdkruntime/sdkruntime-core/src/androidTest/java/androidx/privacysandbox/sdkruntime/core/controller/SdkSandboxControllerClientPackageNameTest.kt +++ b/privacysandbox/sdkruntime/sdkruntime-core/src/androidTest/java/androidx/privacysandbox/sdkruntime/core/controller/SdkSandboxControllerClientPackageNameTest.kt
@@ -33,9 +33,7 @@ @SdkSuppress(minSdkVersion = 34) class SdkSandboxControllerClientPackageNameTest { - @Rule - @JvmField - val sdkSandboxControllerMockRule = SdkSandboxControllerMockRule() + @Rule @JvmField val sdkSandboxControllerMockRule = SdkSandboxControllerMockRule() @Test fun getClientPackageName_withoutApiAvailable_parseSdkDataDirPath() { @@ -65,17 +63,14 @@ val expectedResult = "test.client.package.name" val sdkSandboxController = sdkSandboxControllerMockRule.sdkSandboxControllerMock - `when`(sdkSandboxController.getClientPackageName()) - .thenReturn(expectedResult) + `when`(sdkSandboxController.getClientPackageName()).thenReturn(expectedResult) val controllerCompat = sdkSandboxControllerMockRule.controllerCompat val result = controllerCompat.getClientPackageName() assertThat(result).isEqualTo(expectedResult) - Mockito.verify(sdkSandboxController) - .getClientPackageName() + Mockito.verify(sdkSandboxController).getClientPackageName() } - private fun isClientPackageNameAvailable() = - BuildCompat.AD_SERVICES_EXTENSION_INT >= 8 + private fun isClientPackageNameAvailable() = BuildCompat.AD_SERVICES_EXTENSION_INT >= 8 }
diff --git a/privacysandbox/sdkruntime/sdkruntime-core/src/androidTest/java/androidx/privacysandbox/sdkruntime/core/controller/SdkSandboxControllerCompatLocalTest.kt b/privacysandbox/sdkruntime/sdkruntime-core/src/androidTest/java/androidx/privacysandbox/sdkruntime/core/controller/SdkSandboxControllerCompatLocalTest.kt index 46b74e6..d9f7d58 100644 --- a/privacysandbox/sdkruntime/sdkruntime-core/src/androidTest/java/androidx/privacysandbox/sdkruntime/core/controller/SdkSandboxControllerCompatLocalTest.kt +++ b/privacysandbox/sdkruntime/sdkruntime-core/src/androidTest/java/androidx/privacysandbox/sdkruntime/core/controller/SdkSandboxControllerCompatLocalTest.kt
@@ -73,11 +73,10 @@ SdkSandboxControllerCompat.injectLocalImpl(TestStubImpl()) val controllerCompat = SdkSandboxControllerCompat.from(context) - val exception = Assert.assertThrows(LoadSdkCompatException::class.java) { - runBlocking { - controllerCompat.loadSdk("SDK", Bundle()) + val exception = + Assert.assertThrows(LoadSdkCompatException::class.java) { + runBlocking { controllerCompat.loadSdk("SDK", Bundle()) } } - } assertThat(exception.loadSdkErrorCode).isEqualTo(LoadSdkCompatException.LOAD_SDK_NOT_FOUND) } @@ -87,17 +86,13 @@ clientHandShakeForVersionIncluding(ClientFeature.LOAD_SDK) val expectedResult = SandboxedSdkCompat(Binder()) - val stubLocalImpl = TestStubImpl( - loadSdkResult = expectedResult - ) + val stubLocalImpl = TestStubImpl(loadSdkResult = expectedResult) SdkSandboxControllerCompat.injectLocalImpl(stubLocalImpl) val controllerCompat = SdkSandboxControllerCompat.from(context) val sdkName = "SDK" val sdkParams = Bundle() - val result = runBlocking { - controllerCompat.loadSdk(sdkName, sdkParams) - } + val result = runBlocking { controllerCompat.loadSdk(sdkName, sdkParams) } assertThat(result).isSameInstanceAs(expectedResult) assertThat(stubLocalImpl.lastLoadSdkName).isEqualTo(sdkName) @@ -109,18 +104,13 @@ clientHandShakeForVersionIncluding(ClientFeature.LOAD_SDK) val expectedError = LoadSdkCompatException(RuntimeException(), Bundle()) - SdkSandboxControllerCompat.injectLocalImpl( - TestStubImpl( - loadSdkError = expectedError - ) - ) + SdkSandboxControllerCompat.injectLocalImpl(TestStubImpl(loadSdkError = expectedError)) val controllerCompat = SdkSandboxControllerCompat.from(context) - val exception = Assert.assertThrows(LoadSdkCompatException::class.java) { - runBlocking { - controllerCompat.loadSdk("SDK", Bundle()) + val exception = + Assert.assertThrows(LoadSdkCompatException::class.java) { + runBlocking { controllerCompat.loadSdk("SDK", Bundle()) } } - } assertThat(exception).isSameInstanceAs(expectedError) } @@ -128,11 +118,7 @@ @Test fun getSandboxedSdks_returnsListFromLocalImpl() { val expectedResult = listOf(SandboxedSdkCompat(Binder())) - SdkSandboxControllerCompat.injectLocalImpl( - TestStubImpl( - sandboxedSdks = expectedResult - ) - ) + SdkSandboxControllerCompat.injectLocalImpl(TestStubImpl(sandboxedSdks = expectedResult)) val controllerCompat = SdkSandboxControllerCompat.from(context) val sandboxedSdks = controllerCompat.getSandboxedSdks() @@ -143,13 +129,14 @@ fun getAppOwnedSdkSandboxInterfaces_whenNotAvailable_returnsEmptyList() { SdkSandboxControllerCompat.injectLocalImpl( TestStubImpl( - appOwnedSdks = listOf( - AppOwnedSdkSandboxInterfaceCompat( - name = "TestSdk", - version = 42, - binder = Binder(), + appOwnedSdks = + listOf( + AppOwnedSdkSandboxInterfaceCompat( + name = "TestSdk", + version = 42, + binder = Binder(), + ) ) - ) ) ) @@ -162,18 +149,15 @@ fun getAppOwnedSdkSandboxInterfaces_returnsListFromLocalImpl() { clientHandShakeForVersionIncluding(ClientFeature.APP_OWNED_INTERFACES) - val expectedResult = listOf( - AppOwnedSdkSandboxInterfaceCompat( - name = "TestSdk", - version = 42, - binder = Binder(), + val expectedResult = + listOf( + AppOwnedSdkSandboxInterfaceCompat( + name = "TestSdk", + version = 42, + binder = Binder(), + ) ) - ) - SdkSandboxControllerCompat.injectLocalImpl( - TestStubImpl( - appOwnedSdks = expectedResult - ) - ) + SdkSandboxControllerCompat.injectLocalImpl(TestStubImpl(appOwnedSdks = expectedResult)) val controllerCompat = SdkSandboxControllerCompat.from(context) val appOwnedInterfaces = controllerCompat.getAppOwnedSdkSandboxInterfaces() @@ -188,9 +172,10 @@ SdkSandboxControllerCompat.injectLocalImpl(localImpl) val controllerCompat = SdkSandboxControllerCompat.from(context) - val handlerCompat = object : SdkSandboxActivityHandlerCompat { - override fun onActivityCreated(activityHolder: ActivityHolder) {} - } + val handlerCompat = + object : SdkSandboxActivityHandlerCompat { + override fun onActivityCreated(activityHolder: ActivityHolder) {} + } val token = controllerCompat.registerSdkSandboxActivityHandler(handlerCompat) assertThat(token).isEqualTo(localImpl.token) } @@ -203,9 +188,10 @@ SdkSandboxControllerCompat.injectLocalImpl(localImpl) val controllerCompat = SdkSandboxControllerCompat.from(context) - val handlerCompat = object : SdkSandboxActivityHandlerCompat { - override fun onActivityCreated(activityHolder: ActivityHolder) {} - } + val handlerCompat = + object : SdkSandboxActivityHandlerCompat { + override fun onActivityCreated(activityHolder: ActivityHolder) {} + } val token = controllerCompat.registerSdkSandboxActivityHandler(handlerCompat) assertThat(token).isEqualTo(localImpl.token) @@ -256,9 +242,7 @@ clientHandShakeForVersionIncluding(ClientFeature.GET_CLIENT_PACKAGE_NAME) val expectedResult = "test.client.package.name" - val stubLocalImpl = TestStubImpl( - clientPackageName = expectedResult - ) + val stubLocalImpl = TestStubImpl(clientPackageName = expectedResult) SdkSandboxControllerCompat.injectLocalImpl(stubLocalImpl) val controllerCompat = SdkSandboxControllerCompat.from(context) @@ -268,16 +252,16 @@ } /** - * Call [Versions.handShake] to emulate loading via client lib. - * Using version where [clientFeature] available. + * Call [Versions.handShake] to emulate loading via client lib. Using version where + * [clientFeature] available. */ private fun clientHandShakeForVersionIncluding(clientFeature: ClientFeature) { Versions.handShake(clientFeature.availableFrom.apiLevel) } /** - * Call [Versions.handShake] to emulate loading via client lib. - * Using [ClientApiVersion.MIN_SUPPORTED] - to check features available in all client versions. + * Call [Versions.handShake] to emulate loading via client lib. Using + * [ClientApiVersion.MIN_SUPPORTED] - to check features available in all client versions. */ private fun clientHandShakeForMinSupportedVersion() { Versions.handShake(ClientApiVersion.MIN_SUPPORTED.apiLevel) @@ -305,9 +289,7 @@ lastLoadSdkParams = params if (loadSdkResult != null) { - executor.execute { - callback.onResult(loadSdkResult) - } + executor.execute { callback.onResult(loadSdkResult) } } else { executor.execute { callback.onError( @@ -322,6 +304,7 @@ } override fun getSandboxedSdks() = sandboxedSdks + override fun getAppOwnedSdkSandboxInterfaces(): List= appOwnedSdks @@ -338,7 +321,6 @@ token = null } - override fun getClientPackageName(): String = - clientPackageName + override fun getClientPackageName(): String = clientPackageName } }
diff --git a/privacysandbox/sdkruntime/sdkruntime-core/src/androidTest/java/androidx/privacysandbox/sdkruntime/core/controller/SdkSandboxControllerCompatSandboxedTest.kt b/privacysandbox/sdkruntime/sdkruntime-core/src/androidTest/java/androidx/privacysandbox/sdkruntime/core/controller/SdkSandboxControllerCompatSandboxedTest.kt index a2c1a51..3bc9e38 100644 --- a/privacysandbox/sdkruntime/sdkruntime-core/src/androidTest/java/androidx/privacysandbox/sdkruntime/core/controller/SdkSandboxControllerCompatSandboxedTest.kt +++ b/privacysandbox/sdkruntime/sdkruntime-core/src/androidTest/java/androidx/privacysandbox/sdkruntime/core/controller/SdkSandboxControllerCompatSandboxedTest.kt
@@ -59,11 +59,11 @@ val context = spy(ApplicationProvider.getApplicationContext()) val sdkSandboxController = mock(SdkSandboxController::class.java) doReturn(sdkSandboxController) - .`when`(context).getSystemService(SdkSandboxController::class.java) + .`when`(context) + .getSystemService(SdkSandboxController::class.java) val sandboxedSdk = SandboxedSdk(Binder()) - `when`(sdkSandboxController.sandboxedSdks) - .thenReturn(listOf(sandboxedSdk)) + `when`(sdkSandboxController.sandboxedSdks).thenReturn(listOf(sandboxedSdk)) val controllerCompat = SdkSandboxControllerCompat.from(context) val sandboxedSdks = controllerCompat.getSandboxedSdks() @@ -79,21 +79,21 @@ val context = spy(ApplicationProvider.getApplicationContext()) val sdkSandboxController = mock(SdkSandboxController::class.java) doReturn(sdkSandboxController) - .`when`(context).getSystemService(SdkSandboxController::class.java) + .`when`(context) + .getSystemService(SdkSandboxController::class.java) - val platformRegisteredHandlerCaptor = ArgumentCaptor.forClass( - SdkSandboxActivityHandler::class.java) + val platformRegisteredHandlerCaptor = + ArgumentCaptor.forClass(SdkSandboxActivityHandler::class.java) doReturn(Binder()) - .`when`(sdkSandboxController).registerSdkSandboxActivityHandler( - platformRegisteredHandlerCaptor.capture()) + .`when`(sdkSandboxController) + .registerSdkSandboxActivityHandler(platformRegisteredHandlerCaptor.capture()) val handlerCompat = mock(SdkSandboxActivityHandlerCompat::class.java) val controllerCompat = SdkSandboxControllerCompat.from(context) controllerCompat.registerSdkSandboxActivityHandler(handlerCompat) - verify(sdkSandboxController).registerSdkSandboxActivityHandler( - platformRegisteredHandlerCaptor.value - ) + verify(sdkSandboxController) + .registerSdkSandboxActivityHandler(platformRegisteredHandlerCaptor.value) val activityMock = mock(Activity::class.java) val onBackInvokedDispatcher = mock(OnBackInvokedDispatcher::class.java) @@ -111,37 +111,36 @@ var activityLifecycleCallbackCaptor: ArgumentCaptor= ArgumentCaptor.forClass(Application.ActivityLifecycleCallbacks::class.java) - verify(activityMock).registerActivityLifecycleCallbacks( - activityLifecycleCallbackCaptor.capture() - ) + verify(activityMock) + .registerActivityLifecycleCallbacks(activityLifecycleCallbackCaptor.capture()) var bundleMock = mock(Bundle::class.java) UiThreadStatement.runOnUiThread { - assertThat(activityHolderCaptor.value.lifecycle.currentState).isEqualTo( - Lifecycle.State.INITIALIZED) + assertThat(activityHolderCaptor.value.lifecycle.currentState) + .isEqualTo(Lifecycle.State.INITIALIZED) activityLifecycleCallbackCaptor.value.onActivityPostCreated(activityMock, bundleMock) - assertThat(activityHolderCaptor.value.lifecycle.currentState).isEqualTo( - Lifecycle.State.CREATED) + assertThat(activityHolderCaptor.value.lifecycle.currentState) + .isEqualTo(Lifecycle.State.CREATED) activityLifecycleCallbackCaptor.value.onActivityPostStarted(activityMock) - assertThat(activityHolderCaptor.value.lifecycle.currentState).isEqualTo( - Lifecycle.State.STARTED) + assertThat(activityHolderCaptor.value.lifecycle.currentState) + .isEqualTo(Lifecycle.State.STARTED) activityLifecycleCallbackCaptor.value.onActivityPostResumed(activityMock) - assertThat(activityHolderCaptor.value.lifecycle.currentState).isEqualTo( - Lifecycle.State.RESUMED) + assertThat(activityHolderCaptor.value.lifecycle.currentState) + .isEqualTo(Lifecycle.State.RESUMED) activityLifecycleCallbackCaptor.value.onActivityPrePaused(activityMock) - assertThat(activityHolderCaptor.value.lifecycle.currentState).isEqualTo( - Lifecycle.State.STARTED) + assertThat(activityHolderCaptor.value.lifecycle.currentState) + .isEqualTo(Lifecycle.State.STARTED) activityLifecycleCallbackCaptor.value.onActivityPreStopped(activityMock) - assertThat(activityHolderCaptor.value.lifecycle.currentState).isEqualTo( - Lifecycle.State.CREATED) + assertThat(activityHolderCaptor.value.lifecycle.currentState) + .isEqualTo(Lifecycle.State.CREATED) activityLifecycleCallbackCaptor.value.onActivityPreDestroyed(activityMock) - assertThat(activityHolderCaptor.value.lifecycle.currentState).isEqualTo( - Lifecycle.State.DESTROYED) + assertThat(activityHolderCaptor.value.lifecycle.currentState) + .isEqualTo(Lifecycle.State.DESTROYED) } } @@ -151,26 +150,26 @@ val context = spy(ApplicationProvider.getApplicationContext()) val sdkSandboxController = mock(SdkSandboxController::class.java) doReturn(sdkSandboxController) - .`when`(context).getSystemService(SdkSandboxController::class.java) + .`when`(context) + .getSystemService(SdkSandboxController::class.java) val registeredHandlerCaptor = ArgumentCaptor.forClass(SdkSandboxActivityHandler::class.java) doReturn(Binder()) - .`when`(sdkSandboxController).registerSdkSandboxActivityHandler( - registeredHandlerCaptor.capture()) + .`when`(sdkSandboxController) + .registerSdkSandboxActivityHandler(registeredHandlerCaptor.capture()) val controllerCompat = SdkSandboxControllerCompat.from(context) val handlerCompat = mock(SdkSandboxActivityHandlerCompat::class.java) controllerCompat.registerSdkSandboxActivityHandler(handlerCompat) - verify(sdkSandboxController).registerSdkSandboxActivityHandler( - registeredHandlerCaptor.value) + verify(sdkSandboxController) + .registerSdkSandboxActivityHandler(registeredHandlerCaptor.value) - val unregisteredHandlerCaptor = ArgumentCaptor.forClass( - SdkSandboxActivityHandler::class.java - ) + val unregisteredHandlerCaptor = + ArgumentCaptor.forClass(SdkSandboxActivityHandler::class.java) controllerCompat.unregisterSdkSandboxActivityHandler(handlerCompat) - verify(sdkSandboxController).unregisterSdkSandboxActivityHandler( - unregisteredHandlerCaptor.capture()) + verify(sdkSandboxController) + .unregisterSdkSandboxActivityHandler(unregisteredHandlerCaptor.capture()) assertThat(unregisteredHandlerCaptor.value).isEqualTo(registeredHandlerCaptor.value) }
diff --git a/privacysandbox/sdkruntime/sdkruntime-core/src/androidTest/java/androidx/privacysandbox/sdkruntime/core/controller/SdkSandboxControllerLoadSdkTest.kt b/privacysandbox/sdkruntime/sdkruntime-core/src/androidTest/java/androidx/privacysandbox/sdkruntime/core/controller/SdkSandboxControllerLoadSdkTest.kt index cdf0fbf..230fd88 100644 --- a/privacysandbox/sdkruntime/sdkruntime-core/src/androidTest/java/androidx/privacysandbox/sdkruntime/core/controller/SdkSandboxControllerLoadSdkTest.kt +++ b/privacysandbox/sdkruntime/sdkruntime-core/src/androidTest/java/androidx/privacysandbox/sdkruntime/core/controller/SdkSandboxControllerLoadSdkTest.kt
@@ -44,22 +44,15 @@ @SdkSuppress(minSdkVersion = 34) class SdkSandboxControllerLoadSdkTest { - @Rule - @JvmField - val sdkSandboxControllerMockRule = SdkSandboxControllerMockRule() + @Rule @JvmField val sdkSandboxControllerMockRule = SdkSandboxControllerMockRule() @Test fun loadSdk_withoutLoadSdkApiAvailable_throwsLoadSdkCompatException() { - assumeFalse( - "Requires LoadSdk API not available", - isLoadSdkApiAvailable() - ) + assumeFalse("Requires LoadSdk API not available", isLoadSdkApiAvailable()) val controllerCompat = sdkSandboxControllerMockRule.controllerCompat Assert.assertThrows(LoadSdkCompatException::class.java) { - runBlocking { - controllerCompat.loadSdk("SDK", Bundle()) - } + runBlocking { controllerCompat.loadSdk("SDK", Bundle()) } } } @@ -67,10 +60,7 @@ @RequiresApi(34) @RequiresExtension(extension = SdkExtensions.AD_SERVICES, version = 10) fun loadSdk_withLoadSdkApiAvailable_returnResultFromPlatformLoadSdk() { - assumeTrue( - "Requires LoadSdk API available", - isLoadSdkApiAvailable() - ) + assumeTrue("Requires LoadSdk API available", isLoadSdkApiAvailable()) val sdkName = "SDK" val params = Bundle() @@ -78,41 +68,27 @@ val sandboxedSdk = SandboxedSdk(Binder()) setupLoadSdkAnswer(sandboxedSdk) val controllerCompat = sdkSandboxControllerMockRule.controllerCompat - val result = runBlocking { - controllerCompat.loadSdk(sdkName, params) - } + val result = runBlocking { controllerCompat.loadSdk(sdkName, params) } assertThat(result.getInterface()).isEqualTo(sandboxedSdk.getInterface()) val sdkSandboxController = sdkSandboxControllerMockRule.sdkSandboxControllerMock - verify(sdkSandboxController).loadSdk( - eq(sdkName), - eq(params), - any(), - any() - ) + verify(sdkSandboxController).loadSdk(eq(sdkName), eq(params), any(), any()) } @Test @RequiresApi(34) @RequiresExtension(extension = SdkExtensions.AD_SERVICES, version = 10) fun loadSdk_withLoadSdkApiAvailable_rethrowsExceptionFromPlatformLoadSdk() { - assumeTrue( - "Requires LoadSdk API available", - isLoadSdkApiAvailable() - ) + assumeTrue("Requires LoadSdk API available", isLoadSdkApiAvailable()) - val loadSdkException = LoadSdkException( - RuntimeException(), - Bundle() - ) + val loadSdkException = LoadSdkException(RuntimeException(), Bundle()) setupLoadSdkAnswer(loadSdkException) val controllerCompat = sdkSandboxControllerMockRule.controllerCompat - val result = Assert.assertThrows(LoadSdkCompatException::class.java) { - runBlocking { - controllerCompat.loadSdk("test", Bundle()) + val result = + Assert.assertThrows(LoadSdkCompatException::class.java) { + runBlocking { controllerCompat.loadSdk("test", Bundle()) } } - } assertThat(result.cause).isEqualTo(loadSdkException.cause) assertThat(result.extraInformation).isEqualTo(loadSdkException.extraInformation) @@ -128,13 +104,7 @@ null } val sdkSandboxController = sdkSandboxControllerMockRule.sdkSandboxControllerMock - doAnswer(answer) - .`when`(sdkSandboxController).loadSdk( - any(), - any(), - any(), - any() - ) + doAnswer(answer).`when`(sdkSandboxController).loadSdk(any(), any(), any(), any()) } @RequiresApi(34) @@ -146,15 +116,8 @@ null } val sdkSandboxController = sdkSandboxControllerMockRule.sdkSandboxControllerMock - doAnswer(answer) - .`when`(sdkSandboxController).loadSdk( - any(), - any(), - any(), - any() - ) + doAnswer(answer).`when`(sdkSandboxController).loadSdk(any(), any(), any(), any()) } - private fun isLoadSdkApiAvailable() = - BuildCompat.AD_SERVICES_EXTENSION_INT >= 10 + private fun isLoadSdkApiAvailable() = BuildCompat.AD_SERVICES_EXTENSION_INT >= 10 }
diff --git a/privacysandbox/sdkruntime/sdkruntime-core/src/androidTest/java/androidx/privacysandbox/sdkruntime/core/controller/SdkSandboxControllerMockRule.kt b/privacysandbox/sdkruntime/sdkruntime-core/src/androidTest/java/androidx/privacysandbox/sdkruntime/core/controller/SdkSandboxControllerMockRule.kt index 31ee775..6a76fed 100644 --- a/privacysandbox/sdkruntime/sdkruntime-core/src/androidTest/java/androidx/privacysandbox/sdkruntime/core/controller/SdkSandboxControllerMockRule.kt +++ b/privacysandbox/sdkruntime/sdkruntime-core/src/androidTest/java/androidx/privacysandbox/sdkruntime/core/controller/SdkSandboxControllerMockRule.kt
@@ -23,9 +23,7 @@ import org.junit.rules.ExternalResource import org.mockito.Mockito -/** - * Creates [SdkSandboxControllerCompat] using mocked [SdkSandboxController]. - */ +/** Creates [SdkSandboxControllerCompat] using mocked [SdkSandboxController]. */ @RequiresApi(34) class SdkSandboxControllerMockRule : ExternalResource() { @@ -38,7 +36,8 @@ contextSpy = Mockito.spy(ApplicationProvider.getApplicationContext()) Mockito.doReturn(sdkSandboxControllerMock) - .`when`(contextSpy).getSystemService(SdkSandboxController::class.java) + .`when`(contextSpy) + .getSystemService(SdkSandboxController::class.java) controllerCompat = SdkSandboxControllerCompat.from(contextSpy) }
diff --git a/privacysandbox/sdkruntime/sdkruntime-core/src/main/java/androidx/privacysandbox/sdkruntime/core/AdServicesInfo.kt b/privacysandbox/sdkruntime/sdkruntime-core/src/main/java/androidx/privacysandbox/sdkruntime/core/AdServicesInfo.kt index b8104bd..eeee4b2 100644 --- a/privacysandbox/sdkruntime/sdkruntime-core/src/main/java/androidx/privacysandbox/sdkruntime/core/AdServicesInfo.kt +++ b/privacysandbox/sdkruntime/sdkruntime-core/src/main/java/androidx/privacysandbox/sdkruntime/core/AdServicesInfo.kt
@@ -22,8 +22,8 @@ /** * Temporary replacement for BuildCompat.AD_SERVICES_EXTENSION_INT. - * TODO(b/249981547) Replace with AD_SERVICES_EXTENSION_INT after new core library release * + * TODO(b/249981547) Replace with AD_SERVICES_EXTENSION_INT after new core library release */ @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP) object AdServicesInfo {
diff --git a/privacysandbox/sdkruntime/sdkruntime-core/src/main/java/androidx/privacysandbox/sdkruntime/core/AppOwnedSdkSandboxInterfaceCompat.kt b/privacysandbox/sdkruntime/sdkruntime-core/src/main/java/androidx/privacysandbox/sdkruntime/core/AppOwnedSdkSandboxInterfaceCompat.kt index c61ad0e..4ea7a76 100644 --- a/privacysandbox/sdkruntime/sdkruntime-core/src/main/java/androidx/privacysandbox/sdkruntime/core/AppOwnedSdkSandboxInterfaceCompat.kt +++ b/privacysandbox/sdkruntime/sdkruntime-core/src/main/java/androidx/privacysandbox/sdkruntime/core/AppOwnedSdkSandboxInterfaceCompat.kt
@@ -26,15 +26,15 @@ /** * Represents a channel for an SDK in the sandbox process to interact with the app. * - * The SDK and the app can agree on a binder interface to be implemented by the app and shared - * via an object of [AppOwnedSdkSandboxInterfaceCompat]. + * The SDK and the app can agree on a binder interface to be implemented by the app and shared via + * an object of [AppOwnedSdkSandboxInterfaceCompat]. * - * The app registers the AppOwnedSdkSandboxInterfaces using SdkSandboxManagerCompat. - * The SDK can then query the list of registered interfaces using SdkSandboxControllerCompat. + * The app registers the AppOwnedSdkSandboxInterfaces using SdkSandboxManagerCompat. The SDK can + * then query the list of registered interfaces using SdkSandboxControllerCompat. * * Once SDK has the [AppOwnedSdkSandboxInterfaceCompat] it wants to communicate with, it will have - * to cast the binder object from [getInterface] to the prearranged interface before initiating - * the communication. + * to cast the binder object from [getInterface] to the prearranged interface before initiating the + * communication. */ class AppOwnedSdkSandboxInterfaceCompat( private val name: String, @@ -49,7 +49,9 @@ */ @RequiresExtension(extension = AD_SERVICES, version = 8) @RestrictTo(LIBRARY_GROUP) - constructor(appOwnedSdkInterface: AppOwnedSdkSandboxInterface) : this( + constructor( + appOwnedSdkInterface: AppOwnedSdkSandboxInterface + ) : this( name = appOwnedSdkInterface.getName(), version = appOwnedSdkInterface.getVersion(), binder = appOwnedSdkInterface.getInterface(), @@ -65,19 +67,19 @@ /** * Returns the version used to register the [AppOwnedSdkSandboxInterfaceCompat]. * - * A version may be chosen by an app, and used to communicate any updates the app makes to - * this implementation. + * A version may be chosen by an app, and used to communicate any updates the app makes to this + * implementation. */ fun getVersion(): Long = version /** * Returns binder object associated with [AppOwnedSdkSandboxInterfaceCompat]. * - * The SDK and the app can agree on a binder interface to be implemented by the app and - * shared via this object. + * The SDK and the app can agree on a binder interface to be implemented by the app and shared + * via this object. * - * The SDK in the sandbox will have to cast the binder object received from this method to - * the agreed upon interface before using it. + * The SDK in the sandbox will have to cast the binder object received from this method to the + * agreed upon interface before using it. */ fun getInterface(): IBinder = binder
diff --git a/privacysandbox/sdkruntime/sdkruntime-core/src/main/java/androidx/privacysandbox/sdkruntime/core/LoadSdkCompatException.kt b/privacysandbox/sdkruntime/sdkruntime-core/src/main/java/androidx/privacysandbox/sdkruntime/core/LoadSdkCompatException.kt index 05e901d..84c44e0 100644 --- a/privacysandbox/sdkruntime/sdkruntime-core/src/main/java/androidx/privacysandbox/sdkruntime/core/LoadSdkCompatException.kt +++ b/privacysandbox/sdkruntime/sdkruntime-core/src/main/java/androidx/privacysandbox/sdkruntime/core/LoadSdkCompatException.kt
@@ -24,8 +24,7 @@ import androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP /** - * Compat alternative for [LoadSdkException]. - * Thrown from [SandboxedSdkProviderCompat.onLoadSdk]. + * Compat alternative for [LoadSdkException]. Thrown from [SandboxedSdkProviderCompat.onLoadSdk]. * * @see [LoadSdkException] */ @@ -36,9 +35,7 @@ * * @see [LoadSdkException.getLoadSdkErrorCode] */ - @field:LoadSdkErrorCode - @get:LoadSdkErrorCode - val loadSdkErrorCode: Int + @field:LoadSdkErrorCode @get:LoadSdkErrorCode val loadSdkErrorCode: Int /** * Extra error information this exception was constructed with. @@ -54,8 +51,9 @@ * @param loadSdkErrorCode The result code. * @param message The detailed message. * @param cause The cause of the exception. A null value is permitted, and indicates that the - * cause is nonexistent or unknown. - * @param extraInformation Extra error information. This is empty if there is no such information. + * cause is nonexistent or unknown. + * @param extraInformation Extra error information. This is empty if there is no such + * information. */ @RestrictTo(LIBRARY_GROUP) @JvmOverloads @@ -105,9 +103,9 @@ annotation class LoadSdkErrorCode /** - * Create platform [LoadSdkException] from compat exception. + * Create platform [LoadSdkException] from compat exception. * - * @return Platform exception. + * @return Platform exception. */ @RequiresApi(34) @RestrictTo(LIBRARY_GROUP) @@ -120,10 +118,7 @@ @DoNotInline fun toLoadSdkException(ex: LoadSdkCompatException): LoadSdkException { - return LoadSdkException( - ex.cause!!, - ex.extraInformation - ) + return LoadSdkException(ex.cause!!, ex.extraInformation) } @DoNotInline @@ -137,9 +132,7 @@ } @LoadSdkErrorCode - private fun toLoadSdkErrorCodeCompat( - value: Int - ): Int { + private fun toLoadSdkErrorCodeCompat(value: Int): Int { return value // TODO(b/249982002): Validate and convert } } @@ -198,18 +191,18 @@ /** * Internal error while loading SDK. * - * This indicates a generic internal error happened while applying the call from - * client application. + * This indicates a generic internal error happened while applying the call from client + * application. * * @see [android.app.sdksandbox.SdkSandboxManager.LOAD_SDK_INTERNAL_ERROR] */ const val LOAD_SDK_INTERNAL_ERROR = 500 /** - * Create compat exception from platform [LoadSdkException]. + * Create compat exception from platform [LoadSdkException]. * - * @param ex Platform exception - * @return Compat exception. + * @param ex Platform exception + * @return Compat exception. */ @RequiresApi(34) @RestrictTo(LIBRARY_GROUP)
diff --git a/privacysandbox/sdkruntime/sdkruntime-core/src/main/java/androidx/privacysandbox/sdkruntime/core/SandboxedSdkCompat.kt b/privacysandbox/sdkruntime/sdkruntime-core/src/main/java/androidx/privacysandbox/sdkruntime/core/SandboxedSdkCompat.kt index fa98a22..1b8b333 100644 --- a/privacysandbox/sdkruntime/sdkruntime-core/src/main/java/androidx/privacysandbox/sdkruntime/core/SandboxedSdkCompat.kt +++ b/privacysandbox/sdkruntime/sdkruntime-core/src/main/java/androidx/privacysandbox/sdkruntime/core/SandboxedSdkCompat.kt
@@ -24,9 +24,8 @@ import androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP /** - * Compat wrapper for [SandboxedSdk]. - * Represents an SDK loaded in the sandbox process or locally. - * An application should use this object to obtain an interface to the SDK through [getInterface]. + * Compat wrapper for [SandboxedSdk]. Represents an SDK loaded in the sandbox process or locally. An + * application should use this object to obtain an interface to the SDK through [getInterface]. * * The SDK should create it when [SandboxedSdkProviderCompat.onLoadSdk] is called, and drop all * references to it when [SandboxedSdkProviderCompat.beforeUnloadSdk] is called. Additionally, the @@ -34,18 +33,15 @@ * [SandboxedSdkProviderCompat.beforeUnloadSdk] has been called. * * @see [SandboxedSdk] - * */ -class SandboxedSdkCompat private constructor( - private val sdkImpl: SandboxedSdkImpl -) { +class SandboxedSdkCompat private constructor(private val sdkImpl: SandboxedSdkImpl) { /** * Creates SandboxedSdkCompat from SDK Binder object. * * @param sdkInterface The SDK's interface. This will be the entrypoint into the sandboxed SDK - * for the application. The SDK should keep this valid until it's loaded in the sandbox, and - * start failing calls to this interface once it has been unloaded + * for the application. The SDK should keep this valid until it's loaded in the sandbox, and + * start failing calls to this interface once it has been unloaded * * This interface can later be retrieved using [getInterface]. * @@ -73,17 +69,13 @@ */ @RequiresApi(34) @RestrictTo(LIBRARY_GROUP) - constructor(sandboxedSdk: SandboxedSdk) : this( - Api34Impl(sandboxedSdk) - ) + constructor(sandboxedSdk: SandboxedSdk) : this(Api34Impl(sandboxedSdk)) /** - * Returns the interface to the loaded SDK. - * A null interface is returned if the Binder has since + * Returns the interface to the loaded SDK. A null interface is returned if the Binder has since * become unavailable, in response to the SDK being unloaded. * * @return [IBinder] object for loaded SDK. - * * @see [SandboxedSdk.getInterface] */ fun getInterface() = sdkImpl.getInterface() @@ -92,7 +84,6 @@ * Returns information about loaded SDK. * * @return [SandboxedSdkInfo] object for loaded SDK or null if no information available. - * * @see [SandboxedSdk.getSharedLibraryInfo] */ fun getSdkInfo(): SandboxedSdkInfo? = sdkImpl.getSdkInfo() @@ -102,24 +93,18 @@ * * @return Platform SandboxedSdk */ - @RequiresApi(34) - @RestrictTo(LIBRARY_GROUP) - fun toSandboxedSdk() = sdkImpl.toSandboxedSdk() + @RequiresApi(34) @RestrictTo(LIBRARY_GROUP) fun toSandboxedSdk() = sdkImpl.toSandboxedSdk() internal interface SandboxedSdkImpl { fun getInterface(): IBinder? fun getSdkInfo(): SandboxedSdkInfo? - @RequiresApi(34) - @DoNotInline - fun toSandboxedSdk(): SandboxedSdk + @RequiresApi(34) @DoNotInline fun toSandboxedSdk(): SandboxedSdk } @RequiresApi(34) - private open class Api34Impl( - protected val sandboxedSdk: SandboxedSdk - ) : SandboxedSdkImpl { + private open class Api34Impl(protected val sandboxedSdk: SandboxedSdk) : SandboxedSdkImpl { @DoNotInline override fun getInterface(): IBinder? {
diff --git a/privacysandbox/sdkruntime/sdkruntime-core/src/main/java/androidx/privacysandbox/sdkruntime/core/SandboxedSdkInfo.kt b/privacysandbox/sdkruntime/sdkruntime-core/src/main/java/androidx/privacysandbox/sdkruntime/core/SandboxedSdkInfo.kt index 656ced2..5d65bea0 100644 --- a/privacysandbox/sdkruntime/sdkruntime-core/src/main/java/androidx/privacysandbox/sdkruntime/core/SandboxedSdkInfo.kt +++ b/privacysandbox/sdkruntime/sdkruntime-core/src/main/java/androidx/privacysandbox/sdkruntime/core/SandboxedSdkInfo.kt
@@ -17,18 +17,15 @@ package androidx.privacysandbox.sdkruntime.core /** - * Information about runtime enabled SDK. - * Could represent SDK loaded in sandbox or locally loaded SDK. + * Information about runtime enabled SDK. Could represent SDK loaded in sandbox or locally loaded + * SDK. */ class SandboxedSdkInfo( - /** - * Sdk Name. - * This is a value of `android:name` attributetag of SDK Manifest. - */ + /** Sdk Name. This is a value of `android:name` attributetag of SDK Manifest. */ val name: String, /** - * Sdk Version. - * This is a value of `android:versionMajor` attributetag of SDK Manifest. + * Sdk Version. This is a value of `android:versionMajor` attributetag of SDK + * Manifest. */ val version: Long ) {
diff --git a/privacysandbox/sdkruntime/sdkruntime-core/src/main/java/androidx/privacysandbox/sdkruntime/core/SandboxedSdkProviderAdapter.kt b/privacysandbox/sdkruntime/sdkruntime-core/src/main/java/androidx/privacysandbox/sdkruntime/core/SandboxedSdkProviderAdapter.kt index acfb2a5..6bb10bb 100644 --- a/privacysandbox/sdkruntime/sdkruntime-core/src/main/java/androidx/privacysandbox/sdkruntime/core/SandboxedSdkProviderAdapter.kt +++ b/privacysandbox/sdkruntime/sdkruntime-core/src/main/java/androidx/privacysandbox/sdkruntime/core/SandboxedSdkProviderAdapter.kt
@@ -27,31 +27,30 @@ /** * Implementation of platform [SandboxedSdkProvider] that delegate to [SandboxedSdkProviderCompat] * Gets compat class name from asset "SandboxedSdkProviderCompatClassName.txt" - * */ @RequiresApi(34) // TODO(b/301437557) Remove after documentation migration to sdkruntime-provider @Deprecated( message = "Use SandboxedSdkProviderAdapter from sdkruntime-provider library", - replaceWith = ReplaceWith( - expression = "SandboxedSdkProviderAdapter", - imports = arrayOf("androidx.privacysandbox.sdkruntime.provider.SandboxedSdkProviderAdapter") - ), + replaceWith = + ReplaceWith( + expression = "SandboxedSdkProviderAdapter", + imports = + arrayOf("androidx.privacysandbox.sdkruntime.provider.SandboxedSdkProviderAdapter") + ), level = DeprecationLevel.HIDDEN ) @RestrictTo(RestrictTo.Scope.LIBRARY) // removing from public API surface -class SandboxedSdkProviderAdapter internal constructor( - private val classNameProvider: CompatClassNameProvider -) : SandboxedSdkProvider() { +class SandboxedSdkProviderAdapter +internal constructor(private val classNameProvider: CompatClassNameProvider) : + SandboxedSdkProvider() { - /** - * Provides classname of [SandboxedSdkProviderCompat] implementation. - */ + /** Provides classname of [SandboxedSdkProviderCompat] implementation. */ internal interface CompatClassNameProvider { fun getCompatProviderClassName(context: Context): String } - constructor () : this(DefaultClassNameProvider()) + constructor() : this(DefaultClassNameProvider()) internal val delegate: SandboxedSdkProviderCompat by lazy { val currentContext = context!! @@ -76,22 +75,16 @@ delegate.beforeUnloadSdk() } - override fun getView( - windowContext: Context, - params: Bundle, - width: Int, - height: Int - ): View { + override fun getView(windowContext: Context, params: Bundle, width: Int, height: Int): View { return delegate.getView(windowContext, params, width, height) } private class DefaultClassNameProvider : CompatClassNameProvider { override fun getCompatProviderClassName(context: Context): String { // TODO(b/257966930) Read classname from SDK manifest property - return context.assets.open(COMPAT_SDK_PROVIDER_CLASS_ASSET_NAME) - .use { inputStream -> - inputStream.bufferedReader().readLine() - } + return context.assets.open(COMPAT_SDK_PROVIDER_CLASS_ASSET_NAME).use { inputStream -> + inputStream.bufferedReader().readLine() + } } }
diff --git a/privacysandbox/sdkruntime/sdkruntime-core/src/main/java/androidx/privacysandbox/sdkruntime/core/SandboxedSdkProviderCompat.kt b/privacysandbox/sdkruntime/sdkruntime-core/src/main/java/androidx/privacysandbox/sdkruntime/core/SandboxedSdkProviderCompat.kt index 4c27e96..c1a9017 100644 --- a/privacysandbox/sdkruntime/sdkruntime-core/src/main/java/androidx/privacysandbox/sdkruntime/core/SandboxedSdkProviderCompat.kt +++ b/privacysandbox/sdkruntime/sdkruntime-core/src/main/java/androidx/privacysandbox/sdkruntime/core/SandboxedSdkProviderCompat.kt
@@ -24,15 +24,15 @@ * * Encapsulates API which SDK sandbox can use to interact with SDKs loaded into it. * - * SDK has to implement this abstract class to generate an entry point for SDK sandbox to be able - * to call it through. + * SDK has to implement this abstract class to generate an entry point for SDK sandbox to be able to + * call it through. * * @see [android.app.sdksandbox.SandboxedSdkProvider] */ abstract class SandboxedSdkProviderCompat { /** - * Context previously set through [SandboxedSdkProviderCompat.attachContext]. - * This will return null if no context has been previously set. + * Context previously set through [SandboxedSdkProviderCompat.attachContext]. This will return + * null if no context has been previously set. */ var context: Context? = null private set @@ -40,14 +40,12 @@ /** * Sets the SDK [Context] which can then be received using [SandboxedSdkProviderCompat.context] * - * This is called before [SandboxedSdkProviderCompat.onLoadSdk] is invoked. - * No operations requiring a [Context] should be performed before then, as + * This is called before [SandboxedSdkProviderCompat.onLoadSdk] is invoked. No operations + * requiring a [Context] should be performed before then, as * [SandboxedSdkProviderCompat.context] will return null until this method has been called. * - * @throws IllegalStateException if a base context has already been set. - * * @param context The new base context. - * + * @throws IllegalStateException if a base context has already been set. * @see [android.app.sdksandbox.SandboxedSdkProvider.attachContext] */ fun attachContext(context: Context) { @@ -65,15 +63,13 @@ * receiving requests from the client. Additionally, it should not do initialization that * depends on other SDKs being loaded into the SDK sandbox. * - * The SDK should not do any operations requiring a [Context] object before this method - * has been called. + * The SDK should not do any operations requiring a [Context] object before this method has been + * called. * * @param params list of params passed from the client when it loads the SDK. This can be empty. * @return Returns a [SandboxedSdkCompat], passed back to the client. The IBinder used to create - * the [SandboxedSdkCompat] object will be used by the client to call into the SDK. - * + * the [SandboxedSdkCompat] object will be used by the client to call into the SDK. * @throws LoadSdkCompatException if initialization failed. - * * @see [android.app.sdksandbox.SandboxedSdkProvider.onLoadSdk] */ @Throws(LoadSdkCompatException::class) @@ -82,8 +78,8 @@ /** * Does the work needed for the SDK to free its resources before being unloaded. * - * This function is called by the SDK sandbox manager before it unloads the SDK. The SDK - * should fail any invocations on the Binder previously returned to the client through + * This function is called by the SDK sandbox manager before it unloads the SDK. The SDK should + * fail any invocations on the Binder previously returned to the client through * [SandboxedSdkCompat.getInterface] * * The SDK should not do any long-running tasks here, like I/O and network calls. @@ -97,10 +93,5 @@ * * @see [android.app.sdksandbox.SandboxedSdkProvider.getView] */ - abstract fun getView( - windowContext: Context, - params: Bundle, - width: Int, - height: Int - ): View + abstract fun getView(windowContext: Context, params: Bundle, width: Int, height: Int): View }
diff --git a/privacysandbox/sdkruntime/sdkruntime-core/src/main/java/androidx/privacysandbox/sdkruntime/core/Versions.kt b/privacysandbox/sdkruntime/sdkruntime-core/src/main/java/androidx/privacysandbox/sdkruntime/core/Versions.kt index 6d50d2c..5e7dd06 100644 --- a/privacysandbox/sdkruntime/sdkruntime-core/src/main/java/androidx/privacysandbox/sdkruntime/core/Versions.kt +++ b/privacysandbox/sdkruntime/sdkruntime-core/src/main/java/androidx/privacysandbox/sdkruntime/core/Versions.kt
@@ -24,19 +24,17 @@ /** * Store internal API version (for Client-Core communication). * - * DO NOT CHANGE THIS CLASS. - * Methods invoked via reflection from previously released versions of sdkruntime-client. + * DO NOT CHANGE THIS CLASS. Methods invoked via reflection from previously released versions of + * sdkruntime-client. */ @Suppress("unused") @Keep @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP) object Versions { - @JvmField - val API_VERSION = ClientApiVersion.CURRENT_VERSION.apiLevel + @JvmField val API_VERSION = ClientApiVersion.CURRENT_VERSION.apiLevel - @JvmField - var CLIENT_VERSION: Int? = null + @JvmField var CLIENT_VERSION: Int? = null @JvmStatic fun handShake(clientVersion: Int): Int {
diff --git a/privacysandbox/sdkruntime/sdkruntime-core/src/main/java/androidx/privacysandbox/sdkruntime/core/activity/ActivityHolder.kt b/privacysandbox/sdkruntime/sdkruntime-core/src/main/java/androidx/privacysandbox/sdkruntime/core/activity/ActivityHolder.kt index e438f75..e2b7ad6 100644 --- a/privacysandbox/sdkruntime/sdkruntime-core/src/main/java/androidx/privacysandbox/sdkruntime/core/activity/ActivityHolder.kt +++ b/privacysandbox/sdkruntime/sdkruntime-core/src/main/java/androidx/privacysandbox/sdkruntime/core/activity/ActivityHolder.kt
@@ -30,13 +30,9 @@ * SDK can add [LifecycleObserver]s into it to observe the [Activity] lifecycle state. */ interface ActivityHolder : LifecycleOwner { - /** - * The [Activity] created for SDK. - */ + /** The [Activity] created for SDK. */ fun getActivity(): Activity - /** - * The [OnBackPressedDispatcher] for the created [Activity]. - */ + /** The [OnBackPressedDispatcher] for the created [Activity]. */ fun getOnBackPressedDispatcher(): OnBackPressedDispatcher }
diff --git a/privacysandbox/sdkruntime/sdkruntime-core/src/main/java/androidx/privacysandbox/sdkruntime/core/controller/LoadSdkCallback.kt b/privacysandbox/sdkruntime/sdkruntime-core/src/main/java/androidx/privacysandbox/sdkruntime/core/controller/LoadSdkCallback.kt index fd6ae6e..2204c591 100644 --- a/privacysandbox/sdkruntime/sdkruntime-core/src/main/java/androidx/privacysandbox/sdkruntime/core/controller/LoadSdkCallback.kt +++ b/privacysandbox/sdkruntime/sdkruntime-core/src/main/java/androidx/privacysandbox/sdkruntime/core/controller/LoadSdkCallback.kt
@@ -20,11 +20,10 @@ import androidx.privacysandbox.sdkruntime.core.LoadSdkCompatException import androidx.privacysandbox.sdkruntime.core.SandboxedSdkCompat -/** - * Callback for [SdkSandboxControllerCompat.loadSdk] - */ +/** Callback for [SdkSandboxControllerCompat.loadSdk] */ @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP) interface LoadSdkCallback { fun onResult(result: SandboxedSdkCompat) + fun onError(error: LoadSdkCompatException) }
diff --git a/privacysandbox/sdkruntime/sdkruntime-core/src/main/java/androidx/privacysandbox/sdkruntime/core/controller/SdkSandboxControllerCompat.kt b/privacysandbox/sdkruntime/sdkruntime-core/src/main/java/androidx/privacysandbox/sdkruntime/core/controller/SdkSandboxControllerCompat.kt index 429390e..5d3e2c2 100644 --- a/privacysandbox/sdkruntime/sdkruntime-core/src/main/java/androidx/privacysandbox/sdkruntime/core/controller/SdkSandboxControllerCompat.kt +++ b/privacysandbox/sdkruntime/sdkruntime-core/src/main/java/androidx/privacysandbox/sdkruntime/core/controller/SdkSandboxControllerCompat.kt
@@ -44,20 +44,19 @@ /** * Compat version of [android.app.sdksandbox.sdkprovider.SdkSandboxController]. * - * Controller that is used by SDK loaded in the sandbox or locally to access information provided - * by the sandbox environment. + * Controller that is used by SDK loaded in the sandbox or locally to access information provided by + * the sandbox environment. * * It enables the SDK to communicate with other SDKS and know about the state of the sdks that are * currently loaded. * - * An instance can be obtained using [SdkSandboxControllerCompat.from]. - * The [Context] can be obtained using [SandboxedSdkProviderCompat.context]. + * An instance can be obtained using [SdkSandboxControllerCompat.from]. The [Context] can be + * obtained using [SandboxedSdkProviderCompat.context]. * * @see [android.app.sdksandbox.sdkprovider.SdkSandboxController] */ -class SdkSandboxControllerCompat internal constructor( - private val controllerImpl: SandboxControllerImpl -) { +class SdkSandboxControllerCompat +internal constructor(private val controllerImpl: SandboxControllerImpl) { /** * Load SDK in a SDK sandbox java process or locally. @@ -65,8 +64,8 @@ * The caller may only load SDKs the client app depends on into the SDK sandbox. * * @param sdkName name of the SDK to be loaded. - * @param params additional parameters to be passed to the SDK in the form of a [Bundle] - * as agreed between the client and the SDK. + * @param params additional parameters to be passed to the SDK in the form of a [Bundle] as + * agreed between the client and the SDK. * @return [SandboxedSdkCompat] from SDK on a successful run. * @throws [LoadSdkCompatException] on fail. */ @@ -84,11 +83,9 @@ * Fetches information about Sdks that are loaded in the sandbox or locally. * * @return List of [SandboxedSdkCompat] containing all currently loaded sdks - * * @see [android.app.sdksandbox.sdkprovider.SdkSandboxController.getSandboxedSdks] */ - fun getSandboxedSdks(): List= - controllerImpl.getSandboxedSdks() + fun getSandboxedSdks(): List= controllerImpl.getSandboxedSdks() /** * Fetches all [AppOwnedSdkSandboxInterfaceCompat] that are registered by the app. @@ -101,16 +98,16 @@ /** * Returns an identifier for a [SdkSandboxActivityHandlerCompat] after registering it. * - * This function registers an implementation of [SdkSandboxActivityHandlerCompat] created by - * an SDK and returns an [IBinder] which uniquely identifies the passed + * This function registers an implementation of [SdkSandboxActivityHandlerCompat] created by an + * SDK and returns an [IBinder] which uniquely identifies the passed * [SdkSandboxActivityHandlerCompat] object. * * @param handlerCompat is the [SdkSandboxActivityHandlerCompat] to register * @return [IBinder] uniquely identify the passed [SdkSandboxActivityHandlerCompat] * @see SdkSandboxController.registerSdkSandboxActivityHandler */ - fun registerSdkSandboxActivityHandler(handlerCompat: SdkSandboxActivityHandlerCompat): - IBinder = controllerImpl.registerSdkSandboxActivityHandler(handlerCompat) + fun registerSdkSandboxActivityHandler(handlerCompat: SdkSandboxActivityHandlerCompat): IBinder = + controllerImpl.registerSdkSandboxActivityHandler(handlerCompat) /** * Unregister an already registered [SdkSandboxActivityHandlerCompat]. @@ -132,8 +129,7 @@ * * @return Package name of the client app. */ - fun getClientPackageName(): String = - controllerImpl.getClientPackageName() + fun getClientPackageName(): String = controllerImpl.getClientPackageName() @RestrictTo(LIBRARY_GROUP) interface SandboxControllerImpl { @@ -144,12 +140,11 @@ fun getAppOwnedSdkSandboxInterfaces(): List- fun registerSdkSandboxActivityHandler(handlerCompat: SdkSandboxActivityHandlerCompat): - IBinder - - fun unregisterSdkSandboxActivityHandler( + fun registerSdkSandboxActivityHandler( handlerCompat: SdkSandboxActivityHandlerCompat - ) + ): IBinder + + fun unregisterSdkSandboxActivityHandler(handlerCompat: SdkSandboxActivityHandlerCompat) fun getClientPackageName(): String } @@ -159,19 +154,20 @@ private var localImpl: SandboxControllerImpl? = null /** - * Creates [SdkSandboxControllerCompat]. + * Creates [SdkSandboxControllerCompat]. * - * @param context SDK context - * - * @return SdkSandboxControllerCompat object. + * @param context SDK context + * @return SdkSandboxControllerCompat object. */ @JvmStatic fun from(context: Context): SdkSandboxControllerCompat { val clientVersion = Versions.CLIENT_VERSION if (clientVersion != null) { - val implFromClient = localImpl ?: throw UnsupportedOperationException( - "Shouldn't happen: No controller implementation available" - ) + val implFromClient = + localImpl + ?: throw UnsupportedOperationException( + "Shouldn't happen: No controller implementation available" + ) return SdkSandboxControllerCompat(LocalImpl(implFromClient, context, clientVersion)) } val platformImpl = PlatformImplFactory.create(context) @@ -179,10 +175,8 @@ } /** - * Inject implementation from client library. - * Implementation will be used only if loaded locally. - * This method will be called from client side via reflection during loading SDK. - * + * Inject implementation from client library. Implementation will be used only if loaded + * locally. This method will be called from client side via reflection during loading SDK. */ @JvmStatic @Keep
diff --git a/privacysandbox/sdkruntime/sdkruntime-core/src/main/java/androidx/privacysandbox/sdkruntime/core/controller/impl/AppOwnedSdkProvider.kt b/privacysandbox/sdkruntime/sdkruntime-core/src/main/java/androidx/privacysandbox/sdkruntime/core/controller/impl/AppOwnedSdkProvider.kt index 1d195316..dcd34f8 100644 --- a/privacysandbox/sdkruntime/sdkruntime-core/src/main/java/androidx/privacysandbox/sdkruntime/core/controller/impl/AppOwnedSdkProvider.kt +++ b/privacysandbox/sdkruntime/sdkruntime-core/src/main/java/androidx/privacysandbox/sdkruntime/core/controller/impl/AppOwnedSdkProvider.kt
@@ -25,12 +25,8 @@ import androidx.privacysandbox.sdkruntime.core.AdServicesInfo import androidx.privacysandbox.sdkruntime.core.AppOwnedSdkSandboxInterfaceCompat -/** - * Fetches all registered [AppOwnedSdkSandboxInterfaceCompat] from [SdkSandboxController]. - */ -internal class AppOwnedSdkProvider private constructor( - private val providerImpl: ProviderImpl -) { +/** Fetches all registered [AppOwnedSdkSandboxInterfaceCompat] from [SdkSandboxController]. */ +internal class AppOwnedSdkProvider private constructor(private val providerImpl: ProviderImpl) { fun getAppOwnedSdkSandboxInterfaces(): List= providerImpl.getAppOwnedSdkSandboxInterfaces() @@ -39,22 +35,16 @@ fun getAppOwnedSdkSandboxInterfaces(): List} - /** - * Implementation for cases when API not supported by [SdkSandboxController] - */ + /** Implementation for cases when API not supported by [SdkSandboxController] */ private class NoOpImpl : ProviderImpl { override fun getAppOwnedSdkSandboxInterfaces(): List { return emptyList() } } - /** - * Implementation for AdServices V8. - */ + /** Implementation for AdServices V8. */ @RequiresExtension(extension = SdkExtensions.AD_SERVICES, version = 8) - private class ApiAdServicesV8Impl( - private val controller: SdkSandboxController - ) : ProviderImpl { + private class ApiAdServicesV8Impl(private val controller: SdkSandboxController) : ProviderImpl { @DoNotInline @SuppressLint("ClassVerificationFailure") // flaky lint override fun getAppOwnedSdkSandboxInterfaces(): List{ @@ -66,8 +56,8 @@ companion object { @SuppressLint("NewApi", "ClassVerificationFailure") // For supporting DP Builds fun create(controller: SdkSandboxController): AppOwnedSdkProvider { - return if (BuildCompat.AD_SERVICES_EXTENSION_INT >= 8 || - AdServicesInfo.isDeveloperPreview() + return if ( + BuildCompat.AD_SERVICES_EXTENSION_INT >= 8 || AdServicesInfo.isDeveloperPreview() ) { AppOwnedSdkProvider(ApiAdServicesV8Impl(controller)) } else {
diff --git a/privacysandbox/sdkruntime/sdkruntime-core/src/main/java/androidx/privacysandbox/sdkruntime/core/controller/impl/ClientPackageNameProvider.kt b/privacysandbox/sdkruntime/sdkruntime-core/src/main/java/androidx/privacysandbox/sdkruntime/core/controller/impl/ClientPackageNameProvider.kt index e5c25d0..d4ac246 100644 --- a/privacysandbox/sdkruntime/sdkruntime-core/src/main/java/androidx/privacysandbox/sdkruntime/core/controller/impl/ClientPackageNameProvider.kt +++ b/privacysandbox/sdkruntime/sdkruntime-core/src/main/java/androidx/privacysandbox/sdkruntime/core/controller/impl/ClientPackageNameProvider.kt
@@ -24,17 +24,15 @@ import androidx.annotation.RequiresExtension import androidx.core.os.BuildCompat -/** - * Retrieves client app package name from [SdkSandboxController]. - */ +/** Retrieves client app package name from [SdkSandboxController]. */ @RequiresApi(34) internal class ClientPackageNameProvider( private val controller: SdkSandboxController, private val sdkContext: Context ) { /** - * When supported (Api 34 Extension 8) returns result from SdkSandboxController. - * Otherwise parses data dir path to find client package name. + * When supported (Api 34 Extension 8) returns result from SdkSandboxController. Otherwise + * parses data dir path to find client package name. */ fun getClientPackageName(): String { return if (BuildCompat.AD_SERVICES_EXTENSION_INT >= 8) {
diff --git a/privacysandbox/sdkruntime/sdkruntime-core/src/main/java/androidx/privacysandbox/sdkruntime/core/controller/impl/LocalImpl.kt b/privacysandbox/sdkruntime/sdkruntime-core/src/main/java/androidx/privacysandbox/sdkruntime/core/controller/impl/LocalImpl.kt index 3ccb128..0aa60ab 100644 --- a/privacysandbox/sdkruntime/sdkruntime-core/src/main/java/androidx/privacysandbox/sdkruntime/core/controller/impl/LocalImpl.kt +++ b/privacysandbox/sdkruntime/sdkruntime-core/src/main/java/androidx/privacysandbox/sdkruntime/core/controller/impl/LocalImpl.kt
@@ -30,8 +30,8 @@ import java.util.concurrent.Executor /** - * Wrapper for client provided implementation of [SdkSandboxControllerCompat]. - * Checks client version to determine if method supported. + * Wrapper for client provided implementation of [SdkSandboxControllerCompat]. Checks client version + * to determine if method supported. */ internal class LocalImpl( private val implFromClient: SdkSandboxControllerCompat.SandboxControllerImpl, @@ -100,8 +100,8 @@ return implFromClient.getClientPackageName() } else { /** - * When loaded locally sdkContext is wrapped Application context. - * All previously released client library versions returns client app package name. + * When loaded locally sdkContext is wrapped Application context. All previously + * released client library versions returns client app package name. * * After supporting [ClientFeature.GET_CLIENT_PACKAGE_NAME] it will work correctly for * future versions, even if getPackageName() behaviour will be changed for sdk context
diff --git a/privacysandbox/sdkruntime/sdkruntime-core/src/main/java/androidx/privacysandbox/sdkruntime/core/controller/impl/PlatformSdkLoader.kt b/privacysandbox/sdkruntime/sdkruntime-core/src/main/java/androidx/privacysandbox/sdkruntime/core/controller/impl/PlatformSdkLoader.kt index 2d0fd0a..71205c9 100644 --- a/privacysandbox/sdkruntime/sdkruntime-core/src/main/java/androidx/privacysandbox/sdkruntime/core/controller/impl/PlatformSdkLoader.kt +++ b/privacysandbox/sdkruntime/sdkruntime-core/src/main/java/androidx/privacysandbox/sdkruntime/core/controller/impl/PlatformSdkLoader.kt
@@ -33,35 +33,21 @@ import java.util.concurrent.Executor /** - * Trying to load SDK using [SdkSandboxController]. - * Throws [LoadSdkCompatException] if loading SDK not supported in [SdkSandboxController]. + * Trying to load SDK using [SdkSandboxController]. Throws [LoadSdkCompatException] if loading SDK + * not supported in [SdkSandboxController]. */ @RequiresApi(34) -internal class PlatformSdkLoader private constructor( - private val loaderImpl: LoaderImpl -) { +internal class PlatformSdkLoader private constructor(private val loaderImpl: LoaderImpl) { - fun loadSdk( - sdkName: String, - params: Bundle, - executor: Executor, - receiver: LoadSdkCallback - ) { + fun loadSdk(sdkName: String, params: Bundle, executor: Executor, receiver: LoadSdkCallback) { loaderImpl.loadSdk(sdkName, params, executor, receiver) } private interface LoaderImpl { - fun loadSdk( - sdkName: String, - params: Bundle, - executor: Executor, - callback: LoadSdkCallback - ) + fun loadSdk(sdkName: String, params: Bundle, executor: Executor, callback: LoadSdkCallback) } - /** - * Implementation for cases when API not supported by [SdkSandboxController] - */ + /** Implementation for cases when API not supported by [SdkSandboxController] */ private object FailImpl : LoaderImpl { override fun loadSdk( sdkName: String, @@ -80,14 +66,10 @@ } } - /** - * Implementation for AdServices V10. - */ + /** Implementation for AdServices V10. */ @RequiresApi(34) @RequiresExtension(extension = SdkExtensions.AD_SERVICES, version = 10) - private class ApiAdServicesV10Impl( - private val controller: SdkSandboxController - ) : LoaderImpl { + private class ApiAdServicesV10Impl(private val controller: SdkSandboxController) : LoaderImpl { @DoNotInline override fun loadSdk( sdkName: String,
diff --git a/privacysandbox/sdkruntime/sdkruntime-core/src/main/java/androidx/privacysandbox/sdkruntime/core/controller/impl/PlatformUDCImpl.kt b/privacysandbox/sdkruntime/sdkruntime-core/src/main/java/androidx/privacysandbox/sdkruntime/core/controller/impl/PlatformUDCImpl.kt index 34fd8cc..428df24 100644 --- a/privacysandbox/sdkruntime/sdkruntime-core/src/main/java/androidx/privacysandbox/sdkruntime/core/controller/impl/PlatformUDCImpl.kt +++ b/privacysandbox/sdkruntime/sdkruntime-core/src/main/java/androidx/privacysandbox/sdkruntime/core/controller/impl/PlatformUDCImpl.kt
@@ -35,14 +35,10 @@ import androidx.privacysandbox.sdkruntime.core.controller.SdkSandboxControllerCompat import java.util.concurrent.Executor -/** - * Implementation that delegates to platform [SdkSandboxController] for Android U. - */ +/** Implementation that delegates to platform [SdkSandboxController] for Android U. */ @RequiresApi(34) -internal class PlatformUDCImpl( - private val controller: SdkSandboxController, - sdkContext: Context -) : SdkSandboxControllerCompat.SandboxControllerImpl { +internal class PlatformUDCImpl(private val controller: SdkSandboxController, sdkContext: Context) : + SdkSandboxControllerCompat.SandboxControllerImpl { private val appOwnedSdkProvider = AppOwnedSdkProvider.create(controller) private val sdkLoader = PlatformSdkLoader.create(controller) @@ -61,9 +57,7 @@ } override fun getSandboxedSdks(): List{ - return controller - .sandboxedSdks - .map { platformSdk -> SandboxedSdkCompat(platformSdk) } + return controller.sandboxedSdks.map { platformSdk -> SandboxedSdkCompat(platformSdk) } } override fun getAppOwnedSdkSandboxInterfaces(): List= @@ -75,9 +69,9 @@ synchronized(compatToPlatformMap) { val platformHandler: SdkSandboxActivityHandler = compatToPlatformMap[handlerCompat] - ?: SdkSandboxActivityHandler { platformActivity: Activity -> - handlerCompat.onActivityCreated(ActivityHolderImpl(platformActivity)) - } + ?: SdkSandboxActivityHandler { platformActivity: Activity -> + handlerCompat.onActivityCreated(ActivityHolderImpl(platformActivity)) + } val token = controller.registerSdkSandboxActivityHandler(platformHandler) compatToPlatformMap[handlerCompat] = platformHandler return token @@ -95,12 +89,9 @@ } } - override fun getClientPackageName(): String = - clientPackageNameProvider.getClientPackageName() + override fun getClientPackageName(): String = clientPackageNameProvider.getClientPackageName() - internal class ActivityHolderImpl( - private val platformActivity: Activity - ) : ActivityHolder { + internal class ActivityHolderImpl(private val platformActivity: Activity) : ActivityHolder { private val dispatcher = OnBackPressedDispatcher {} private var lifecycleRegistry: LifecycleRegistry = LifecycleRegistry(this) @@ -123,48 +114,49 @@ get() = lifecycleRegistry private fun proxyLifeCycleEvents() { - val callback = object : Application.ActivityLifecycleCallbacks { - override fun onActivityCreated(activity: Activity, bundle: Bundle?) {} + val callback = + object : Application.ActivityLifecycleCallbacks { + override fun onActivityCreated(activity: Activity, bundle: Bundle?) {} - override fun onActivityPostCreated( - activity: Activity, - savedInstanceState: Bundle? - ) { - lifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_CREATE) + override fun onActivityPostCreated( + activity: Activity, + savedInstanceState: Bundle? + ) { + lifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_CREATE) + } + + override fun onActivityStarted(activity: Activity) {} + + override fun onActivityPostStarted(activity: Activity) { + lifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_START) + } + + override fun onActivityResumed(activity: Activity) {} + + override fun onActivityPostResumed(activity: Activity) { + lifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_RESUME) + } + + override fun onActivityPrePaused(activity: Activity) { + lifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_PAUSE) + } + + override fun onActivityPaused(activity: Activity) {} + + override fun onActivityPreStopped(activity: Activity) { + lifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_STOP) + } + + override fun onActivityStopped(activity: Activity) {} + + override fun onActivitySaveInstanceState(activity: Activity, bundle: Bundle) {} + + override fun onActivityPreDestroyed(activity: Activity) { + lifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_DESTROY) + } + + override fun onActivityDestroyed(activity: Activity) {} } - - override fun onActivityStarted(activity: Activity) {} - - override fun onActivityPostStarted(activity: Activity) { - lifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_START) - } - - override fun onActivityResumed(activity: Activity) {} - - override fun onActivityPostResumed(activity: Activity) { - lifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_RESUME) - } - - override fun onActivityPrePaused(activity: Activity) { - lifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_PAUSE) - } - - override fun onActivityPaused(activity: Activity) {} - - override fun onActivityPreStopped(activity: Activity) { - lifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_STOP) - } - - override fun onActivityStopped(activity: Activity) {} - - override fun onActivitySaveInstanceState(activity: Activity, bundle: Bundle) {} - - override fun onActivityPreDestroyed(activity: Activity) { - lifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_DESTROY) - } - - override fun onActivityDestroyed(activity: Activity) {} - } platformActivity.registerActivityLifecycleCallbacks(callback) } }
diff --git a/privacysandbox/sdkruntime/sdkruntime-core/src/main/java/androidx/privacysandbox/sdkruntime/core/internal/ClientApiVersion.kt b/privacysandbox/sdkruntime/sdkruntime-core/src/main/java/androidx/privacysandbox/sdkruntime/core/internal/ClientApiVersion.kt index dbbdeda..4120fcb 100644 --- a/privacysandbox/sdkruntime/sdkruntime-core/src/main/java/androidx/privacysandbox/sdkruntime/core/internal/ClientApiVersion.kt +++ b/privacysandbox/sdkruntime/sdkruntime-core/src/main/java/androidx/privacysandbox/sdkruntime/core/internal/ClientApiVersion.kt
@@ -21,13 +21,12 @@ /** * List of all supported internal API versions (Client-Core communication). * - * NEVER REMOVE / MODIFY RELEASED VERSIONS: - * That could break loading of SDKs built with previous/future library version. + * NEVER REMOVE / MODIFY RELEASED VERSIONS: That could break loading of SDKs built with + * previous/future library version. * * Adding new version here bumps internal API version for next library release: - * [androidx.privacysandbox.sdkruntime.core.Versions.API_VERSION] - * When adding a new version, ALL new features from this version should be specified - * (NO FUTURE CHANGES SUPPORTED). + * [androidx.privacysandbox.sdkruntime.core.Versions.API_VERSION] When adding a new version, ALL new + * features from this version should be specified (NO FUTURE CHANGES SUPPORTED). */ @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP) enum class ClientApiVersion( @@ -35,33 +34,22 @@ private val newFeatures: Set= emptySet() ) { V1__1_0_ALPHA01(apiLevel = 1), - - V2__1_0_ALPHA02( - apiLevel = 2, - newFeatures = setOf( - ClientFeature.SDK_SANDBOX_CONTROLLER - ) - ), + V2__1_0_ALPHA02(apiLevel = 2, newFeatures = setOf(ClientFeature.SDK_SANDBOX_CONTROLLER)), // V3 was released as V4 (original release postponed) V4__1_0_ALPHA05( apiLevel = 4, - newFeatures = setOf( - ClientFeature.SDK_ACTIVITY_HANDLER, - ClientFeature.APP_OWNED_INTERFACES, - ) + newFeatures = + setOf( + ClientFeature.SDK_ACTIVITY_HANDLER, + ClientFeature.APP_OWNED_INTERFACES, + ) ), - - V5__1_0_ALPHA13( - apiLevel = 5, - newFeatures = setOf( - ClientFeature.LOAD_SDK - ) - ), + V5__1_0_ALPHA13(apiLevel = 5, newFeatures = setOf(ClientFeature.LOAD_SDK)), /** - * Unreleased API version. - * Features not added to other versions will be automatically added here (to allow testing). + * Unreleased API version. Features not added to other versions will be automatically added here + * (to allow testing). */ FUTURE_VERSION(apiLevel = Int.MAX_VALUE); @@ -75,9 +63,7 @@ return FEATURE_TO_VERSION_MAP[clientFeature] ?: FUTURE_VERSION } - /** - * Build mapping between [ClientFeature] and version where it first became available. - */ + /** Build mapping between [ClientFeature] and version where it first became available. */ private fun buildFeatureMap(): Map{ if (FUTURE_VERSION.newFeatures.isNotEmpty()) { throw IllegalStateException("FUTURE_VERSION MUST NOT define any features")
diff --git a/privacysandbox/sdkruntime/sdkruntime-core/src/main/java/androidx/privacysandbox/sdkruntime/core/internal/ClientFeature.kt b/privacysandbox/sdkruntime/sdkruntime-core/src/main/java/androidx/privacysandbox/sdkruntime/core/internal/ClientFeature.kt index 9d2f0f6..4940fce 100644 --- a/privacysandbox/sdkruntime/sdkruntime-core/src/main/java/androidx/privacysandbox/sdkruntime/core/internal/ClientFeature.kt +++ b/privacysandbox/sdkruntime/sdkruntime-core/src/main/java/androidx/privacysandbox/sdkruntime/core/internal/ClientFeature.kt
@@ -20,14 +20,12 @@ import androidx.privacysandbox.sdkruntime.core.controller.SdkSandboxControllerCompat /** - * List of features using Client-Core internal API. - * Each feature available since particular ([ClientApiVersion]). + * List of features using Client-Core internal API. Each feature available since particular + * ([ClientApiVersion]). */ @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP) enum class ClientFeature { - /** - * Support for retrieving [SdkSandboxControllerCompat] on SDK side. - */ + /** Support for retrieving [SdkSandboxControllerCompat] on SDK side. */ SDK_SANDBOX_CONTROLLER, /** @@ -43,10 +41,7 @@ */ APP_OWNED_INTERFACES, - /** - * Support for loading SDKs by other SDKs: - * [SdkSandboxControllerCompat.loadSdk] - */ + /** Support for loading SDKs by other SDKs: [SdkSandboxControllerCompat.loadSdk] */ LOAD_SDK, /**
diff --git a/privacysandbox/sdkruntime/sdkruntime-provider/src/androidTest/java/androidx/privacysandbox/sdkruntime/provider/SandboxedSdkProviderAdapterTest.kt b/privacysandbox/sdkruntime/sdkruntime-provider/src/androidTest/java/androidx/privacysandbox/sdkruntime/provider/SandboxedSdkProviderAdapterTest.kt index 5bd11b1..c30ea50 100644 --- a/privacysandbox/sdkruntime/sdkruntime-provider/src/androidTest/java/androidx/privacysandbox/sdkruntime/provider/SandboxedSdkProviderAdapterTest.kt +++ b/privacysandbox/sdkruntime/sdkruntime-provider/src/androidTest/java/androidx/privacysandbox/sdkruntime/provider/SandboxedSdkProviderAdapterTest.kt
@@ -50,9 +50,8 @@ @Test fun testAdapterGetCompatClassNameFromAsset() { - val expectedClassName = context.assets - .open("SandboxedSdkProviderCompatClassName.txt") - .use { inputStream -> + val expectedClassName = + context.assets.open("SandboxedSdkProviderCompatClassName.txt").use { inputStream -> inputStream.bufferedReader().readLine() } @@ -62,8 +61,7 @@ adapter.onLoadSdk(Bundle()) val delegate = adapter.extractDelegate() - assertThat(delegate.javaClass.name) - .isEqualTo(expectedClassName) + assertThat(delegate.javaClass.name).isEqualTo(expectedClassName) } @Test @@ -73,8 +71,7 @@ adapter.onLoadSdk(Bundle()) val delegate = adapter.extractDelegate() - assertThat(delegate.context) - .isSameInstanceAs(context) + assertThat(delegate.context).isSameInstanceAs(context) } @Test @@ -85,34 +82,26 @@ val result = adapter.onLoadSdk(params) val delegate = adapter.extractDelegate() - assertThat(delegate.mLastOnLoadSdkBundle) - .isSameInstanceAs(params) - assertThat(result.getInterface()) - .isEqualTo(delegate.mResult.getInterface()) + assertThat(delegate.mLastOnLoadSdkBundle).isSameInstanceAs(params) + assertThat(result.getInterface()).isEqualTo(delegate.mResult.getInterface()) } @Test fun loadSdk_shouldRethrowExceptionFromCompatClass() { val adapter = createAdapterFor(TestOnLoadThrowSdkProvider::class) - val ex = assertThrows(LoadSdkException::class.java) { - adapter.onLoadSdk(Bundle()) - } + val ex = assertThrows(LoadSdkException::class.java) { adapter.onLoadSdk(Bundle()) } val delegate = adapter.extractDelegate() - assertThat(ex.cause) - .isSameInstanceAs(delegate.mError.cause) - assertThat(ex.extraInformation) - .isSameInstanceAs(delegate.mError.extraInformation) + assertThat(ex.cause).isSameInstanceAs(delegate.mError.cause) + assertThat(ex.extraInformation).isSameInstanceAs(delegate.mError.extraInformation) } @Test fun loadSdk_shouldThrowIfCompatClassNotExists() { val adapter = createAdapterFor("NOTEXISTS") - assertThrows(ClassNotFoundException::class.java) { - adapter.onLoadSdk(Bundle()) - } + assertThrows(ClassNotFoundException::class.java) { adapter.onLoadSdk(Bundle()) } } @Test @@ -122,8 +111,7 @@ adapter.beforeUnloadSdk() val delegate = adapter.extractDelegate() - assertThat(delegate.mBeforeUnloadSdkCalled) - .isTrue() + assertThat(delegate.mBeforeUnloadSdkCalled).isTrue() } @Test @@ -137,16 +125,11 @@ val result = adapter.getView(windowContext, params, width, height) val delegate = adapter.extractDelegate() - assertThat(result) - .isSameInstanceAs(delegate.mView) - assertThat(delegate.mLastWindowContext) - .isSameInstanceAs(windowContext) - assertThat(delegate.mLastParams) - .isSameInstanceAs(params) - assertThat(delegate.mLastWidth) - .isSameInstanceAs(width) - assertThat(delegate.mLastHeigh) - .isSameInstanceAs(height) + assertThat(result).isSameInstanceAs(delegate.mView) + assertThat(delegate.mLastWindowContext).isSameInstanceAs(windowContext) + assertThat(delegate.mLastParams).isSameInstanceAs(params) + assertThat(delegate.mLastWidth).isSameInstanceAs(width) + assertThat(delegate.mLastHeigh).isSameInstanceAs(height) } private fun createAdapterFor( @@ -154,18 +137,20 @@ ): SandboxedSdkProviderAdapter = createAdapterFor(clazz.java.name) private fun createAdapterFor(delegateClassName: String): SandboxedSdkProviderAdapter { - val adapter = SandboxedSdkProviderAdapter( - object : SandboxedSdkProviderAdapter.CompatClassNameProvider { - override fun getCompatProviderClassName(context: Context): String { - return delegateClassName + val adapter = + SandboxedSdkProviderAdapter( + object : SandboxedSdkProviderAdapter.CompatClassNameProvider { + override fun getCompatProviderClassName(context: Context): String { + return delegateClassName + } } - }) + ) adapter.attachContext(context) return adapter } - private inline fun- SandboxedSdkProviderAdapter.extractDelegate(): T = delegate as T + private inline fun SandboxedSdkProviderAdapter + .extractDelegate(): T = delegate as T class TestOnLoadReturnResultSdkProvider : SandboxedSdkProviderCompat() { var mResult = SandboxedSdkCompat(Binder())
diff --git a/privacysandbox/sdkruntime/sdkruntime-provider/src/main/java/androidx/privacysandbox/sdkruntime/provider/SandboxedSdkProviderAdapter.kt b/privacysandbox/sdkruntime/sdkruntime-provider/src/main/java/androidx/privacysandbox/sdkruntime/provider/SandboxedSdkProviderAdapter.kt index 0ec0f13..b205745 100644 --- a/privacysandbox/sdkruntime/sdkruntime-provider/src/main/java/androidx/privacysandbox/sdkruntime/provider/SandboxedSdkProviderAdapter.kt +++ b/privacysandbox/sdkruntime/sdkruntime-provider/src/main/java/androidx/privacysandbox/sdkruntime/provider/SandboxedSdkProviderAdapter.kt
@@ -29,21 +29,18 @@ /** * Implementation of platform [SandboxedSdkProvider] that delegate to [SandboxedSdkProviderCompat] * Gets compat class name from asset "SandboxedSdkProviderCompatClassName.txt" - * */ @RequiresApi(34) -class SandboxedSdkProviderAdapter internal constructor( - private val classNameProvider: CompatClassNameProvider -) : SandboxedSdkProvider() { +class SandboxedSdkProviderAdapter +internal constructor(private val classNameProvider: CompatClassNameProvider) : + SandboxedSdkProvider() { - /** - * Provides classname of [SandboxedSdkProviderCompat] implementation. - */ + /** Provides classname of [SandboxedSdkProviderCompat] implementation. */ internal interface CompatClassNameProvider { fun getCompatProviderClassName(context: Context): String } - constructor () : this(DefaultClassNameProvider()) + constructor() : this(DefaultClassNameProvider()) internal val delegate: SandboxedSdkProviderCompat by lazy { val currentContext = context!! @@ -68,22 +65,16 @@ delegate.beforeUnloadSdk() } - override fun getView( - windowContext: Context, - params: Bundle, - width: Int, - height: Int - ): View { + override fun getView(windowContext: Context, params: Bundle, width: Int, height: Int): View { return delegate.getView(windowContext, params, width, height) } private class DefaultClassNameProvider : CompatClassNameProvider { override fun getCompatProviderClassName(context: Context): String { // TODO(b/257966930) Read classname from SDK manifest property - return context.assets.open(COMPAT_SDK_PROVIDER_CLASS_ASSET_NAME) - .use { inputStream -> - inputStream.bufferedReader().readLine() - } + return context.assets.open(COMPAT_SDK_PROVIDER_CLASS_ASSET_NAME).use { inputStream -> + inputStream.bufferedReader().readLine() + } } }
diff --git a/privacysandbox/sdkruntime/test-sdks/current/src/main/java/androidx/privacysandbox/sdkruntime/testsdk/CompatProvider.kt b/privacysandbox/sdkruntime/test-sdks/current/src/main/java/androidx/privacysandbox/sdkruntime/testsdk/CompatProvider.kt index fc1f0b5..8fa12f8 100644 --- a/privacysandbox/sdkruntime/test-sdks/current/src/main/java/androidx/privacysandbox/sdkruntime/testsdk/CompatProvider.kt +++ b/privacysandbox/sdkruntime/test-sdks/current/src/main/java/androidx/privacysandbox/sdkruntime/testsdk/CompatProvider.kt
@@ -31,14 +31,11 @@ @Suppress("unused") // Reflection usage from tests in privacysandbox:sdkruntime:sdkruntime-client class CompatProvider : SandboxedSdkProviderCompat() { - @JvmField - var onLoadSdkBinder: Binder? = null + @JvmField var onLoadSdkBinder: Binder? = null - @JvmField - var lastOnLoadSdkParams: Bundle? = null + @JvmField var lastOnLoadSdkParams: Bundle? = null - @JvmField - var isBeforeUnloadSdkCalled = false + @JvmField var isBeforeUnloadSdkCalled = false @Throws(LoadSdkCompatException::class) override fun onLoadSdk(params: Bundle): SandboxedSdkCompat { @@ -56,18 +53,11 @@ isBeforeUnloadSdkCalled = true } - override fun getView( - windowContext: Context, - params: Bundle, - width: Int, - height: Int - ): View { + override fun getView(windowContext: Context, params: Bundle, width: Int, height: Int): View { return View(windowContext) } - internal class CurrentVersionSdkTest( - private val context: Context - ) : Binder() { + internal class CurrentVersionSdkTest(private val context: Context) : Binder() { fun getSandboxedSdks(): List= SdkSandboxControllerCompat.from(context).getSandboxedSdks() @@ -81,9 +71,8 @@ SdkSandboxControllerCompat.from(context).unregisterSdkSandboxActivityHandler(handler) } - fun loadSdk(sdkName: String, sdkParams: Bundle): SandboxedSdkCompat = - runBlocking { - SdkSandboxControllerCompat.from(context).loadSdk(sdkName, sdkParams) - } + fun loadSdk(sdkName: String, sdkParams: Bundle): SandboxedSdkCompat = runBlocking { + SdkSandboxControllerCompat.from(context).loadSdk(sdkName, sdkParams) + } } }
diff --git a/privacysandbox/sdkruntime/test-sdks/v1/src/main/java/androidx/privacysandbox/sdkruntime/testsdk/CompatProvider.kt b/privacysandbox/sdkruntime/test-sdks/v1/src/main/java/androidx/privacysandbox/sdkruntime/testsdk/CompatProvider.kt index 307363e..6aab774 100644 --- a/privacysandbox/sdkruntime/test-sdks/v1/src/main/java/androidx/privacysandbox/sdkruntime/testsdk/CompatProvider.kt +++ b/privacysandbox/sdkruntime/test-sdks/v1/src/main/java/androidx/privacysandbox/sdkruntime/testsdk/CompatProvider.kt
@@ -26,14 +26,11 @@ @Suppress("unused") // Reflection usage from tests in privacysandbox:sdkruntime:sdkruntime-client class CompatProvider : SandboxedSdkProviderCompat() { - @JvmField - var onLoadSdkBinder: Binder? = null + @JvmField var onLoadSdkBinder: Binder? = null - @JvmField - var lastOnLoadSdkParams: Bundle? = null + @JvmField var lastOnLoadSdkParams: Bundle? = null - @JvmField - var isBeforeUnloadSdkCalled = false + @JvmField var isBeforeUnloadSdkCalled = false @Throws(LoadSdkCompatException::class) override fun onLoadSdk(params: Bundle): SandboxedSdkCompat { @@ -51,12 +48,7 @@ isBeforeUnloadSdkCalled = true } - override fun getView( - windowContext: Context, - params: Bundle, - width: Int, - height: Int - ): View { + override fun getView(windowContext: Context, params: Bundle, width: Int, height: Int): View { return View(windowContext) } }
diff --git a/privacysandbox/sdkruntime/test-sdks/v2/src/main/java/androidx/privacysandbox/sdkruntime/testsdk/CompatProvider.kt b/privacysandbox/sdkruntime/test-sdks/v2/src/main/java/androidx/privacysandbox/sdkruntime/testsdk/CompatProvider.kt index 8240d3ca..3df8a54 100644 --- a/privacysandbox/sdkruntime/test-sdks/v2/src/main/java/androidx/privacysandbox/sdkruntime/testsdk/CompatProvider.kt +++ b/privacysandbox/sdkruntime/test-sdks/v2/src/main/java/androidx/privacysandbox/sdkruntime/testsdk/CompatProvider.kt
@@ -27,14 +27,11 @@ @Suppress("unused") // Reflection usage from tests in privacysandbox:sdkruntime:sdkruntime-client class CompatProvider : SandboxedSdkProviderCompat() { - @JvmField - var onLoadSdkBinder: Binder? = null + @JvmField var onLoadSdkBinder: Binder? = null - @JvmField - var lastOnLoadSdkParams: Bundle? = null + @JvmField var lastOnLoadSdkParams: Bundle? = null - @JvmField - var isBeforeUnloadSdkCalled = false + @JvmField var isBeforeUnloadSdkCalled = false @Throws(LoadSdkCompatException::class) override fun onLoadSdk(params: Bundle): SandboxedSdkCompat { @@ -52,18 +49,11 @@ isBeforeUnloadSdkCalled = true } - override fun getView( - windowContext: Context, - params: Bundle, - width: Int, - height: Int - ): View { + override fun getView(windowContext: Context, params: Bundle, width: Int, height: Int): View { return View(windowContext) } - internal class SdkImpl( - private val context: Context - ) : Binder() { + internal class SdkImpl(private val context: Context) : Binder() { fun getSandboxedSdks(): List= SdkSandboxControllerCompat.from(context).getSandboxedSdks() }
diff --git a/privacysandbox/sdkruntime/test-sdks/v4/src/main/java/androidx/privacysandbox/sdkruntime/testsdk/CompatProvider.kt b/privacysandbox/sdkruntime/test-sdks/v4/src/main/java/androidx/privacysandbox/sdkruntime/testsdk/CompatProvider.kt index e24fb65..b115b53 100644 --- a/privacysandbox/sdkruntime/test-sdks/v4/src/main/java/androidx/privacysandbox/sdkruntime/testsdk/CompatProvider.kt +++ b/privacysandbox/sdkruntime/test-sdks/v4/src/main/java/androidx/privacysandbox/sdkruntime/testsdk/CompatProvider.kt
@@ -30,14 +30,11 @@ @Suppress("unused") // Reflection usage from tests in privacysandbox:sdkruntime:sdkruntime-client class CompatProvider : SandboxedSdkProviderCompat() { - @JvmField - var onLoadSdkBinder: Binder? = null + @JvmField var onLoadSdkBinder: Binder? = null - @JvmField - var lastOnLoadSdkParams: Bundle? = null + @JvmField var lastOnLoadSdkParams: Bundle? = null - @JvmField - var isBeforeUnloadSdkCalled = false + @JvmField var isBeforeUnloadSdkCalled = false @Throws(LoadSdkCompatException::class) override fun onLoadSdk(params: Bundle): SandboxedSdkCompat { @@ -55,18 +52,11 @@ isBeforeUnloadSdkCalled = true } - override fun getView( - windowContext: Context, - params: Bundle, - width: Int, - height: Int - ): View { + override fun getView(windowContext: Context, params: Bundle, width: Int, height: Int): View { return View(windowContext) } - internal class SdkImpl( - private val context: Context - ) : Binder() { + internal class SdkImpl(private val context: Context) : Binder() { fun getSandboxedSdks(): List= SdkSandboxControllerCompat.from(context).getSandboxedSdks()
diff --git a/privacysandbox/sdkruntime/test-sdks/v5/src/main/java/androidx/privacysandbox/sdkruntime/testsdk/CompatProvider.kt b/privacysandbox/sdkruntime/test-sdks/v5/src/main/java/androidx/privacysandbox/sdkruntime/testsdk/CompatProvider.kt index 857bdc9..62484c6 100644 --- a/privacysandbox/sdkruntime/test-sdks/v5/src/main/java/androidx/privacysandbox/sdkruntime/testsdk/CompatProvider.kt +++ b/privacysandbox/sdkruntime/test-sdks/v5/src/main/java/androidx/privacysandbox/sdkruntime/testsdk/CompatProvider.kt
@@ -31,14 +31,11 @@ @Suppress("unused") // Reflection usage from tests in privacysandbox:sdkruntime:sdkruntime-client class CompatProvider : SandboxedSdkProviderCompat() { - @JvmField - var onLoadSdkBinder: Binder? = null + @JvmField var onLoadSdkBinder: Binder? = null - @JvmField - var lastOnLoadSdkParams: Bundle? = null + @JvmField var lastOnLoadSdkParams: Bundle? = null - @JvmField - var isBeforeUnloadSdkCalled = false + @JvmField var isBeforeUnloadSdkCalled = false @Throws(LoadSdkCompatException::class) override fun onLoadSdk(params: Bundle): SandboxedSdkCompat { @@ -56,18 +53,11 @@ isBeforeUnloadSdkCalled = true } - override fun getView( - windowContext: Context, - params: Bundle, - width: Int, - height: Int - ): View { + override fun getView(windowContext: Context, params: Bundle, width: Int, height: Int): View { return View(windowContext) } - internal class SdkImpl( - private val context: Context - ) : Binder() { + internal class SdkImpl(private val context: Context) : Binder() { fun getSandboxedSdks(): List= SdkSandboxControllerCompat.from(context).getSandboxedSdks() @@ -81,9 +71,8 @@ SdkSandboxControllerCompat.from(context).unregisterSdkSandboxActivityHandler(handler) } - fun loadSdk(sdkName: String, sdkParams: Bundle): SandboxedSdkCompat = - runBlocking { - SdkSandboxControllerCompat.from(context).loadSdk(sdkName, sdkParams) - } + fun loadSdk(sdkName: String, sdkParams: Bundle): SandboxedSdkCompat = runBlocking { + SdkSandboxControllerCompat.from(context).loadSdk(sdkName, sdkParams) + } } }
diff --git a/privacysandbox/tools/tools-apicompiler/src/main/java/androidx/privacysandbox/tools/apicompiler/PrivacySandboxKspCompiler.kt b/privacysandbox/tools/tools-apicompiler/src/main/java/androidx/privacysandbox/tools/apicompiler/PrivacySandboxKspCompiler.kt index f9d560c..1a973e3 100644 --- a/privacysandbox/tools/tools-apicompiler/src/main/java/androidx/privacysandbox/tools/apicompiler/PrivacySandboxKspCompiler.kt +++ b/privacysandbox/tools/tools-apicompiler/src/main/java/androidx/privacysandbox/tools/apicompiler/PrivacySandboxKspCompiler.kt
@@ -46,8 +46,9 @@ // by KSP between rounds or for incremental compilation. This means that at some point // KSP will always invoke this processor with no valid services, so we should just stop // processing. - if (resolver.getSymbolsWithAnnotation( - PrivacySandboxService::class.qualifiedName!!).none()) { + if ( + resolver.getSymbolsWithAnnotation(PrivacySandboxService::class.qualifiedName!!).none() + ) { return emptyList() } @@ -60,25 +61,27 @@ if (frameworkAidlPath == null) { logger.warn( "KSP argument '$FRAMEWORK_AIDL_PATH_OPTIONS_KEY' was not set. This " + - "will become a required argument in the future." + "will become a required argument in the future." ) } val skipCompatLibrary = options[SKIP_SDK_RUNTIME_COMPAT_LIBRARY_OPTIONS_KEY]?.lowercase().toBoolean() - val target = if (skipCompatLibrary) { - SandboxApiVersion.API_33 - } else SandboxApiVersion.SDK_RUNTIME_COMPAT_LIBRARY + val target = + if (skipCompatLibrary) { + SandboxApiVersion.API_33 + } else SandboxApiVersion.SDK_RUNTIME_COMPAT_LIBRARY val parsedApi = ApiParser(resolver, logger).parseApi() SdkCodeGenerator( - codeGenerator, - parsedApi, - aidlCompilerPath, - frameworkAidlPath, - target, - ).generate() + codeGenerator, + parsedApi, + aidlCompilerPath, + frameworkAidlPath, + target, + ) + .generate() return emptyList() }
diff --git a/privacysandbox/tools/tools-apicompiler/src/main/java/androidx/privacysandbox/tools/apicompiler/generator/AbstractSdkProviderGenerator.kt b/privacysandbox/tools/tools-apicompiler/src/main/java/androidx/privacysandbox/tools/apicompiler/generator/AbstractSdkProviderGenerator.kt index 21bb582..eb1aed0 100644 --- a/privacysandbox/tools/tools-apicompiler/src/main/java/androidx/privacysandbox/tools/apicompiler/generator/AbstractSdkProviderGenerator.kt +++ b/privacysandbox/tools/tools-apicompiler/src/main/java/androidx/privacysandbox/tools/apicompiler/generator/AbstractSdkProviderGenerator.kt
@@ -48,12 +48,11 @@ .addFunction(generateGetViewFunction()) .addFunction(generateCreateServiceFunction(api.getOnlyService())) - return FileSpec.builder(packageName, className) - .addType(classSpec.build()) - .build() + return FileSpec.builder(packageName, className).addType(classSpec.build()).build() } abstract val superclassName: ClassName + abstract fun generateOnLoadSdkFunction(): FunSpec protected fun createServiceFunctionName(service: AnnotatedInterface) =
diff --git a/privacysandbox/tools/tools-apicompiler/src/main/java/androidx/privacysandbox/tools/apicompiler/generator/Api33SdkProviderGenerator.kt b/privacysandbox/tools/tools-apicompiler/src/main/java/androidx/privacysandbox/tools/apicompiler/generator/Api33SdkProviderGenerator.kt index f4c9aef..bf15777 100644 --- a/privacysandbox/tools/tools-apicompiler/src/main/java/androidx/privacysandbox/tools/apicompiler/generator/Api33SdkProviderGenerator.kt +++ b/privacysandbox/tools/tools-apicompiler/src/main/java/androidx/privacysandbox/tools/apicompiler/generator/Api33SdkProviderGenerator.kt
@@ -32,34 +32,31 @@ internal class Api33SdkProviderGenerator(parsedApi: ParsedApi) : AbstractSdkProviderGenerator(parsedApi) { companion object { - private val sandboxedSdkClass = - ClassName("android.app.sdksandbox", "SandboxedSdk") + private val sandboxedSdkClass = ClassName("android.app.sdksandbox", "SandboxedSdk") } - override val superclassName = - ClassName("android.app.sdksandbox", "SandboxedSdkProvider") + override val superclassName = ClassName("android.app.sdksandbox", "SandboxedSdkProvider") - override fun generateOnLoadSdkFunction() = FunSpec.builder("onLoadSdk").build { - addModifiers(KModifier.PUBLIC, KModifier.OVERRIDE) - addParameter("params", bundleClass) - returns(sandboxedSdkClass) + override fun generateOnLoadSdkFunction() = + FunSpec.builder("onLoadSdk").build { + addModifiers(KModifier.PUBLIC, KModifier.OVERRIDE) + addParameter("params", bundleClass) + returns(sandboxedSdkClass) - addStatement("val ctx = %N", contextPropertyName) - addCode { - addControlFlow("if (ctx == null)") { - addStatement( - "throw IllegalStateException(\"Context must not be null. " + - "Do you need to call attachContext()?\")" - ) + addStatement("val ctx = %N", contextPropertyName) + addCode { + addControlFlow("if (ctx == null)") { + addStatement( + "throw IllegalStateException(\"Context must not be null. " + + "Do you need to call attachContext()?\")" + ) + } } + addStatement("val sdk = ${createServiceFunctionName(api.getOnlyService())}(ctx)") + addStatement( + "return %T(%T(sdk, ctx))", + sandboxedSdkClass, + api.getOnlyService().stubDelegateNameSpec(), + ) } - addStatement( - "val sdk = ${createServiceFunctionName(api.getOnlyService())}(ctx)" - ) - addStatement( - "return %T(%T(sdk, ctx))", - sandboxedSdkClass, - api.getOnlyService().stubDelegateNameSpec(), - ) - } }
diff --git a/privacysandbox/tools/tools-apicompiler/src/main/java/androidx/privacysandbox/tools/apicompiler/generator/CompatSdkProviderGenerator.kt b/privacysandbox/tools/tools-apicompiler/src/main/java/androidx/privacysandbox/tools/apicompiler/generator/CompatSdkProviderGenerator.kt index 14bd699..15d066d 100644 --- a/privacysandbox/tools/tools-apicompiler/src/main/java/androidx/privacysandbox/tools/apicompiler/generator/CompatSdkProviderGenerator.kt +++ b/privacysandbox/tools/tools-apicompiler/src/main/java/androidx/privacysandbox/tools/apicompiler/generator/CompatSdkProviderGenerator.kt
@@ -39,27 +39,26 @@ override val superclassName = ClassName("androidx.privacysandbox.sdkruntime.core", "SandboxedSdkProviderCompat") - override fun generateOnLoadSdkFunction() = FunSpec.builder("onLoadSdk").build { - addModifiers(KModifier.PUBLIC, KModifier.OVERRIDE) - addParameter("params", bundleClass) - returns(sandboxedSdkCompatClass) + override fun generateOnLoadSdkFunction() = + FunSpec.builder("onLoadSdk").build { + addModifiers(KModifier.PUBLIC, KModifier.OVERRIDE) + addParameter("params", bundleClass) + returns(sandboxedSdkCompatClass) - addStatement("val ctx = %N", contextPropertyName) - addCode { - addControlFlow("if (ctx == null)") { - addStatement( - "throw IllegalStateException(\"Context must not be null. " + - "Do you need to call attachContext()?\")" - ) + addStatement("val ctx = %N", contextPropertyName) + addCode { + addControlFlow("if (ctx == null)") { + addStatement( + "throw IllegalStateException(\"Context must not be null. " + + "Do you need to call attachContext()?\")" + ) + } } + addStatement("val sdk = ${createServiceFunctionName(api.getOnlyService())}(ctx)") + addStatement( + "return %T(%T(sdk, ctx))", + sandboxedSdkCompatClass, + api.getOnlyService().stubDelegateNameSpec(), + ) } - addStatement( - "val sdk = ${createServiceFunctionName(api.getOnlyService())}(ctx)" - ) - addStatement( - "return %T(%T(sdk, ctx))", - sandboxedSdkCompatClass, - api.getOnlyService().stubDelegateNameSpec(), - ) - } }
diff --git a/privacysandbox/tools/tools-apicompiler/src/main/java/androidx/privacysandbox/tools/apicompiler/generator/SdkCodeGenerator.kt b/privacysandbox/tools/tools-apicompiler/src/main/java/androidx/privacysandbox/tools/apicompiler/generator/SdkCodeGenerator.kt index 057b12d..c3fb3a7 100644 --- a/privacysandbox/tools/tools-apicompiler/src/main/java/androidx/privacysandbox/tools/apicompiler/generator/SdkCodeGenerator.kt +++ b/privacysandbox/tools/tools-apicompiler/src/main/java/androidx/privacysandbox/tools/apicompiler/generator/SdkCodeGenerator.kt
@@ -80,18 +80,20 @@ val workingDir = createTempDirectory("aidl") try { AidlGenerator.generate( - AidlCompiler(aidlCompilerPath, frameworkAidlPath), - api, workingDir - ) + AidlCompiler(aidlCompilerPath, frameworkAidlPath), + api, + workingDir + ) .forEach { source -> // Sources created by the AIDL compiler have to be copied to files created // through the KSP APIs, so that they are included in downstream compilation. - val kspGeneratedFile = codeGenerator.createNewFile( - Dependencies.ALL_FILES, - source.packageName, - source.interfaceName, - extensionName = "java" - ) + val kspGeneratedFile = + codeGenerator.createNewFile( + Dependencies.ALL_FILES, + source.packageName, + source.interfaceName, + extensionName = "java" + ) kspGeneratedFile.use { outputStream -> source.file.inputStream().use { inputStream -> inputStream.copyTo(outputStream) @@ -104,43 +106,42 @@ } private fun generateAbstractSdkProvider() { - val generator = when (sandboxApiVersion) { - SandboxApiVersion.API_33 -> Api33SdkProviderGenerator(api) - SandboxApiVersion.SDK_RUNTIME_COMPAT_LIBRARY -> CompatSdkProviderGenerator(api) - } + val generator = + when (sandboxApiVersion) { + SandboxApiVersion.API_33 -> Api33SdkProviderGenerator(api) + SandboxApiVersion.SDK_RUNTIME_COMPAT_LIBRARY -> CompatSdkProviderGenerator(api) + } generator.generate()?.also(::write) } private fun generateStubDelegates() { val stubDelegateGenerator = StubDelegatesGenerator(basePackageName(), binderCodeConverter) - api.services.map { stubDelegateGenerator.generate(it, target) } - .forEach(::write) - api.interfaces.map { stubDelegateGenerator.generate(it, target) } - .forEach(::write) + api.services.map { stubDelegateGenerator.generate(it, target) }.forEach(::write) + api.interfaces.map { stubDelegateGenerator.generate(it, target) }.forEach(::write) } private fun generateValueConverters() { - val valueConverterFileGenerator = - ValueConverterFileGenerator(binderCodeConverter, target) + val valueConverterFileGenerator = ValueConverterFileGenerator(binderCodeConverter, target) api.values.map(valueConverterFileGenerator::generate).forEach(::write) - api.interfaces.filter { it.inheritsSandboxedUiAdapter }.map { - CoreLibInfoAndBinderWrapperConverterGenerator.generate(it).also(::write) - } + api.interfaces + .filter { it.inheritsSandboxedUiAdapter } + .map { CoreLibInfoAndBinderWrapperConverterGenerator.generate(it).also(::write) } } private fun generateCallbackProxies() { val clientProxyGenerator = ClientProxyTypeGenerator(basePackageName(), binderCodeConverter) - api.callbacks.map { clientProxyGenerator.generate(it, target) } - .forEach(::write) + api.callbacks.map { clientProxyGenerator.generate(it, target) }.forEach(::write) } private fun generateToolMetadata() { - codeGenerator.createNewFile( - Dependencies.ALL_FILES, - Metadata.filePath.parent.toString(), - Metadata.filePath.nameWithoutExtension, - Metadata.filePath.extension, - ).use { Metadata.toolMetadata.writeTo(it) } + codeGenerator + .createNewFile( + Dependencies.ALL_FILES, + Metadata.filePath.parent.toString(), + Metadata.filePath.nameWithoutExtension, + Metadata.filePath.extension, + ) + .use { Metadata.toolMetadata.writeTo(it) } } private fun generateServiceFactoryFile() { @@ -148,16 +149,13 @@ // API descriptors, and the client can use those symbols without running the API Generator. // It's not intended to be used by the SDK code. val serviceFactoryFileGenerator = ServiceFactoryFileGenerator(generateStubs = true) - api.services.forEach { - serviceFactoryFileGenerator.generate(it).also(::write) - } + api.services.forEach { serviceFactoryFileGenerator.generate(it).also(::write) } } private fun generateSuspendFunctionUtilities() { if (!api.hasSuspendFunctions()) return TransportCancellationGenerator(basePackageName()).generate().also(::write) - ThrowableParcelConverterFileGenerator(basePackageName()).generate() - .also(::write) + ThrowableParcelConverterFileGenerator(basePackageName()).generate().also(::write) PrivacySandboxExceptionFileGenerator(basePackageName()).generate().also(::write) PrivacySandboxCancellationExceptionFileGenerator(basePackageName()).generate().also(::write) } @@ -168,8 +166,10 @@ } private fun write(spec: FileSpec) { - codeGenerator.createNewFile(Dependencies.ALL_FILES, spec.packageName, spec.name) - .bufferedWriter().use(spec::writeTo) + codeGenerator + .createNewFile(Dependencies.ALL_FILES, spec.packageName, spec.name) + .bufferedWriter() + .use(spec::writeTo) } private fun basePackageName() = api.getOnlyService().type.packageName
diff --git a/privacysandbox/tools/tools-apicompiler/src/main/java/androidx/privacysandbox/tools/apicompiler/parser/ApiParser.kt b/privacysandbox/tools/tools-apicompiler/src/main/java/androidx/privacysandbox/tools/apicompiler/parser/ApiParser.kt index 67ac55f..2143e0d 100644 --- a/privacysandbox/tools/tools-apicompiler/src/main/java/androidx/privacysandbox/tools/apicompiler/parser/ApiParser.kt +++ b/privacysandbox/tools/tools-apicompiler/src/main/java/androidx/privacysandbox/tools/apicompiler/parser/ApiParser.kt
@@ -51,7 +51,8 @@ services.joinToString { it.type.simpleName } - }).") + })." + ) } val values = parseAllValues() val callbacks = parseAllCallbacks() @@ -60,8 +61,10 @@ } private fun parseAllValues(): Set{ - return resolver.getSymbolsWithAnnotation(PrivacySandboxValue::class.qualifiedName!!) - .mapNotNull(valueParser::parseValue).toSet() + return resolver + .getSymbolsWithAnnotation(PrivacySandboxValue::class.qualifiedName!!) + .mapNotNull(valueParser::parseValue) + .toSet() } private fun parseAllServices(): Set{ @@ -82,14 +85,16 @@ .toSet() } - private fun getInterfacesWithAnnotation(annotationName: KClass<*>): - Sequence{ + private fun getInterfacesWithAnnotation( + annotationName: KClass<*> + ): Sequence{ val symbolsWithAnnotation = resolver.getSymbolsWithAnnotation(annotationName.qualifiedName!!) - if (symbolsWithAnnotation.any { - it !is KSClassDeclaration || - it.classKind != ClassKind.INTERFACE - }) { + if ( + symbolsWithAnnotation.any { + it !is KSClassDeclaration || it.classKind != ClassKind.INTERFACE + } + ) { logger.error("Only interfaces can be annotated with @${annotationName.simpleName}.") return emptySequence() }
diff --git a/privacysandbox/tools/tools-apicompiler/src/main/java/androidx/privacysandbox/tools/apicompiler/parser/InterfaceParser.kt b/privacysandbox/tools/tools-apicompiler/src/main/java/androidx/privacysandbox/tools/apicompiler/parser/InterfaceParser.kt index 080e840..1e0e45f 100644 --- a/privacysandbox/tools/tools-apicompiler/src/main/java/androidx/privacysandbox/tools/apicompiler/parser/InterfaceParser.kt +++ b/privacysandbox/tools/tools-apicompiler/src/main/java/androidx/privacysandbox/tools/apicompiler/parser/InterfaceParser.kt
@@ -43,22 +43,21 @@ check(interfaceDeclaration.classKind == ClassKind.INTERFACE) { "${interfaceDeclaration.qualifiedName} is not an interface." } - val name = interfaceDeclaration.qualifiedName?.getFullName() - ?: interfaceDeclaration.simpleName.getFullName() + val name = + interfaceDeclaration.qualifiedName?.getFullName() + ?: interfaceDeclaration.simpleName.getFullName() if (!interfaceDeclaration.isPublic()) { logger.error("Error in $name: annotated interfaces should be public.") } if (interfaceDeclaration.getDeclaredProperties().any()) { - logger.error( - "Error in $name: annotated interfaces cannot declare properties." - ) + logger.error("Error in $name: annotated interfaces cannot declare properties.") } - if (interfaceDeclaration.declarations.filterIsInstance() + if ( + interfaceDeclaration.declarations + .filterIsInstance() .any(KSClassDeclaration::isCompanionObject) ) { - logger.error( - "Error in $name: annotated interfaces cannot declare companion objects." - ) + logger.error("Error in $name: annotated interfaces cannot declare companion objects.") } val invalidModifiers = interfaceDeclaration.modifiers.filterNot(validInterfaceModifiers::contains) @@ -77,11 +76,12 @@ })." ) } - val superTypes = interfaceDeclaration.superTypes.map { - typeParser.parseFromDeclaration(it.resolve().declaration) - }.filterNot { it == any }.toList() - val invalidSuperTypes = - superTypes.filterNot { validInterfaceSuperTypes.contains(it) } + val superTypes = + interfaceDeclaration.superTypes + .map { typeParser.parseFromDeclaration(it.resolve().declaration) } + .filterNot { it == any } + .toList() + val invalidSuperTypes = superTypes.filterNot { validInterfaceSuperTypes.contains(it) } if (invalidSuperTypes.isNotEmpty()) { logger.error( "Error in $name: annotated interface inherits prohibited types (${ @@ -104,9 +104,11 @@ logger.error("Error in $name: method cannot have default implementation.") } if (method.typeParameters.isNotEmpty()) { - logger.error("Error in $name: method cannot declare type parameters (<${ + logger.error( + "Error in $name: method cannot declare type parameters (<${ method.typeParameters.joinToString(limit = 3) { it.name.getShortName() } - }>).") + }>)." + ) } val invalidModifiers = method.modifiers.filterNot(validMethodModifiers::contains) if (invalidModifiers.isNotEmpty()) { @@ -139,9 +141,7 @@ ): Parameter { val name = method.qualifiedName?.getFullName() ?: method.simpleName.getFullName() if (parameter.hasDefault) { - logger.error( - "Error in $name: parameters cannot have default values." - ) + logger.error("Error in $name: parameters cannot have default values.") } return Parameter(
diff --git a/privacysandbox/tools/tools-apicompiler/src/main/java/androidx/privacysandbox/tools/apicompiler/parser/TypeParser.kt b/privacysandbox/tools/tools-apicompiler/src/main/java/androidx/privacysandbox/tools/apicompiler/parser/TypeParser.kt index 156094a..357ae44 100644 --- a/privacysandbox/tools/tools-apicompiler/src/main/java/androidx/privacysandbox/tools/apicompiler/parser/TypeParser.kt +++ b/privacysandbox/tools/tools-apicompiler/src/main/java/androidx/privacysandbox/tools/apicompiler/parser/TypeParser.kt
@@ -35,15 +35,18 @@ if (resolvedType.isError) { logger.error("Failed to resolve type for $debugName.") } - val typeArguments = typeReference.element?.typeArguments?.mapNotNull { - if (it.type == null) { - logger.error("Error in $debugName: null type argument.") - } - if (it.variance != Variance.INVARIANT) { - logger.error("Error in $debugName: only invariant type arguments are supported.") - } - it.type - } ?: emptyList() + val typeArguments = + typeReference.element?.typeArguments?.mapNotNull { + if (it.type == null) { + logger.error("Error in $debugName: null type argument.") + } + if (it.variance != Variance.INVARIANT) { + logger.error( + "Error in $debugName: only invariant type arguments are supported." + ) + } + it.type + } ?: emptyList() return Type( packageName = resolvedType.declaration.packageName.getFullName(), simpleName = resolvedType.declaration.simpleName.getShortName(),
diff --git a/privacysandbox/tools/tools-apicompiler/src/main/java/androidx/privacysandbox/tools/apicompiler/parser/ValueParser.kt b/privacysandbox/tools/tools-apicompiler/src/main/java/androidx/privacysandbox/tools/apicompiler/parser/ValueParser.kt index 024e046..8811255 100644 --- a/privacysandbox/tools/tools-apicompiler/src/main/java/androidx/privacysandbox/tools/apicompiler/parser/ValueParser.kt +++ b/privacysandbox/tools/tools-apicompiler/src/main/java/androidx/privacysandbox/tools/apicompiler/parser/ValueParser.kt
@@ -65,9 +65,11 @@ } private fun parseEnumClass(classDeclaration: KSClassDeclaration): AnnotatedEnumClass { - val variants = classDeclaration.declarations.filterIsInstance() - .map { it.simpleName.asString() } - .toList() + val variants = + classDeclaration.declarations + .filterIsInstance() + .map { it.simpleName.asString() } + .toList() return AnnotatedEnumClass( type = typeParser.parseFromDeclaration(classDeclaration), variants = variants @@ -75,12 +77,12 @@ } private fun ensureNoCompanion(classDeclaration: KSClassDeclaration, name: String) { - if (classDeclaration.declarations.filterIsInstance() + if ( + classDeclaration.declarations + .filterIsInstance() .any(KSClassDeclaration::isCompanionObject) ) { - logger.error( - "Error in $name: annotated values cannot declare companion objects." - ) + logger.error("Error in $name: annotated values cannot declare companion objects.") } }
diff --git a/privacysandbox/tools/tools-apicompiler/src/test/java/androidx/privacysandbox/tools/apicompiler/AbstractApiCompilerDiffTest.kt b/privacysandbox/tools/tools-apicompiler/src/test/java/androidx/privacysandbox/tools/apicompiler/AbstractApiCompilerDiffTest.kt index 0086931..cda97ef 100644 --- a/privacysandbox/tools/tools-apicompiler/src/test/java/androidx/privacysandbox/tools/apicompiler/AbstractApiCompilerDiffTest.kt +++ b/privacysandbox/tools/tools-apicompiler/src/test/java/androidx/privacysandbox/tools/apicompiler/AbstractApiCompilerDiffTest.kt
@@ -29,10 +29,7 @@ open val extraProcessorOptions: Map= mapOf() - override fun generateSources( - inputSources: List, - outputDirectory: Path - ): List{ + override fun generateSources(inputSources: List, outputDirectory: Path): List val result = compileWithPrivacySandboxKspCompiler(inputSources, extraProcessorOptions) CompilationTestHelper.assertThat(result).succeeds() val sources = result.generatedSources{
diff --git a/privacysandbox/tools/tools-apicompiler/src/test/java/androidx/privacysandbox/tools/apicompiler/FullFeaturedSdkApiCompilerDiffTest.kt b/privacysandbox/tools/tools-apicompiler/src/test/java/androidx/privacysandbox/tools/apicompiler/FullFeaturedSdkApiCompilerDiffTest.kt index 0e952c2..f2eeb82 100644 --- a/privacysandbox/tools/tools-apicompiler/src/test/java/androidx/privacysandbox/tools/apicompiler/FullFeaturedSdkApiCompilerDiffTest.kt +++ b/privacysandbox/tools/tools-apicompiler/src/test/java/androidx/privacysandbox/tools/apicompiler/FullFeaturedSdkApiCompilerDiffTest.kt
@@ -23,36 +23,37 @@ @RunWith(JUnit4::class) class FullFeaturedSdkApiCompilerDiffTest : AbstractApiCompilerDiffTest() { override val subdirectoryName = "fullfeaturedsdk" - override val relativePathsToExpectedAidlClasses = listOf( - "com/mysdk/ICancellationSignal.java", - "com/mysdk/IMyCallback.java", - "com/mysdk/IMyInterface.java", - "com/mysdk/IMyInterfaceTransactionCallback.java", - "com/mysdk/IMySdk.java", - "com/mysdk/IMySecondInterface.java", - "com/mysdk/IMyUiInterface.java", - "com/mysdk/IMyUiInterfaceCoreLibInfoAndBinderWrapper.java", - "com/mysdk/IBundleTransactionCallback.java", - "com/mysdk/IMyUiInterfaceTransactionCallback.java", - "com/mysdk/IMySecondInterfaceTransactionCallback.java", - "com/mysdk/ISdkActivityLauncherTransactionCallback.java", - "com/mysdk/IResponseTransactionCallback.java", - "com/mysdk/IStringTransactionCallback.java", - "com/mysdk/IUnitTransactionCallback.java", - "com/mysdk/IListResponseTransactionCallback.java", - "com/mysdk/IListIntTransactionCallback.java", - "com/mysdk/IListLongTransactionCallback.java", - "com/mysdk/IListDoubleTransactionCallback.java", - "com/mysdk/IListStringTransactionCallback.java", - "com/mysdk/IListBooleanTransactionCallback.java", - "com/mysdk/IListFloatTransactionCallback.java", - "com/mysdk/IListCharTransactionCallback.java", - "com/mysdk/IListShortTransactionCallback.java", - "com/mysdk/ParcelableRequest.java", - "com/mysdk/ParcelableResponse.java", - "com/mysdk/ParcelableStackFrame.java", - "com/mysdk/ParcelableInnerValue.java", - "com/mysdk/ParcelableRequestFlag.java", - "com/mysdk/PrivacySandboxThrowableParcel.java", - ) + override val relativePathsToExpectedAidlClasses = + listOf( + "com/mysdk/ICancellationSignal.java", + "com/mysdk/IMyCallback.java", + "com/mysdk/IMyInterface.java", + "com/mysdk/IMyInterfaceTransactionCallback.java", + "com/mysdk/IMySdk.java", + "com/mysdk/IMySecondInterface.java", + "com/mysdk/IMyUiInterface.java", + "com/mysdk/IMyUiInterfaceCoreLibInfoAndBinderWrapper.java", + "com/mysdk/IBundleTransactionCallback.java", + "com/mysdk/IMyUiInterfaceTransactionCallback.java", + "com/mysdk/IMySecondInterfaceTransactionCallback.java", + "com/mysdk/ISdkActivityLauncherTransactionCallback.java", + "com/mysdk/IResponseTransactionCallback.java", + "com/mysdk/IStringTransactionCallback.java", + "com/mysdk/IUnitTransactionCallback.java", + "com/mysdk/IListResponseTransactionCallback.java", + "com/mysdk/IListIntTransactionCallback.java", + "com/mysdk/IListLongTransactionCallback.java", + "com/mysdk/IListDoubleTransactionCallback.java", + "com/mysdk/IListStringTransactionCallback.java", + "com/mysdk/IListBooleanTransactionCallback.java", + "com/mysdk/IListFloatTransactionCallback.java", + "com/mysdk/IListCharTransactionCallback.java", + "com/mysdk/IListShortTransactionCallback.java", + "com/mysdk/ParcelableRequest.java", + "com/mysdk/ParcelableResponse.java", + "com/mysdk/ParcelableStackFrame.java", + "com/mysdk/ParcelableInnerValue.java", + "com/mysdk/ParcelableRequestFlag.java", + "com/mysdk/PrivacySandboxThrowableParcel.java", + ) }
diff --git a/privacysandbox/tools/tools-apicompiler/src/test/java/androidx/privacysandbox/tools/apicompiler/PrivacySandboxKspCompilerTest.kt b/privacysandbox/tools/tools-apicompiler/src/test/java/androidx/privacysandbox/tools/apicompiler/PrivacySandboxKspCompilerTest.kt index 6f4b716..6244682 100644 --- a/privacysandbox/tools/tools-apicompiler/src/test/java/androidx/privacysandbox/tools/apicompiler/PrivacySandboxKspCompilerTest.kt +++ b/privacysandbox/tools/tools-apicompiler/src/test/java/androidx/privacysandbox/tools/apicompiler/PrivacySandboxKspCompilerTest.kt
@@ -53,18 +53,16 @@ val compilationResult = compileWithPrivacySandboxKspCompiler(listOf(source)) assertThat(compilationResult).succeeds() - val resourceMap = compilationResult.resourceOutputDir.walk() - .filter { it.isFile } - .map { it.toRelativeString(compilationResult.resourceOutputDir) to it.readBytes() } - .toMap() + val resourceMap = + compilationResult.resourceOutputDir + .walk() + .filter { it.isFile } + .map { it.toRelativeString(compilationResult.resourceOutputDir) to it.readBytes() } + .toMap() val expectedMetadataRelativePath = "META-INF/privacysandbox/tool-metadata.pb" assertThat(resourceMap).containsKey(expectedMetadataRelativePath) assertThat(ToolMetadata.parseFrom(resourceMap[expectedMetadataRelativePath])) - .isEqualTo( - ToolMetadata.newBuilder() - .setCodeGenerationVersion(3) - .build() - ) + .isEqualTo(ToolMetadata.newBuilder().setCodeGenerationVersion(3).build()) } @Test
diff --git a/privacysandbox/tools/tools-apicompiler/src/test/java/androidx/privacysandbox/tools/apicompiler/SdkWithPackagesApiCompilerDiffTest.kt b/privacysandbox/tools/tools-apicompiler/src/test/java/androidx/privacysandbox/tools/apicompiler/SdkWithPackagesApiCompilerDiffTest.kt index 2102122..78264b7 100644 --- a/privacysandbox/tools/tools-apicompiler/src/test/java/androidx/privacysandbox/tools/apicompiler/SdkWithPackagesApiCompilerDiffTest.kt +++ b/privacysandbox/tools/tools-apicompiler/src/test/java/androidx/privacysandbox/tools/apicompiler/SdkWithPackagesApiCompilerDiffTest.kt
@@ -20,24 +20,25 @@ import org.junit.runners.JUnit4 /** - * Test the Privacy Sandbox API Compiler with an SDK that defines an interface in another package. + * Test the Privacy Sandbox API Compiler with an SDK that defines an interface in another package. */ @RunWith(JUnit4::class) class SdkWithPackagesApiCompilerDiffTest : AbstractApiCompilerDiffTest() { override val subdirectoryName = "sdkwithpackages" - override val relativePathsToExpectedAidlClasses = listOf( - "com/myotherpackage/IMyOtherPackageInterface.java", - "com/myotherpackage/ParcelableMyOtherPackageDataClass.java", - "com/mysdk/ICancellationSignal.java", - "com/mysdk/IListIntTransactionCallback.java", - "com/mysdk/IMyOtherPackageDataClassTransactionCallback.java", - "com/mysdk/IUnitTransactionCallback.java", - "com/mysdk/IMyOtherPackageInterfaceTransactionCallback.java", - "com/mysdk/IMySdk.java", - "com/mysdk/ParcelableStackFrame.java", - "com/mysdk/IStringTransactionCallback.java", - "com/mysdk/IMyMainPackageInterfaceTransactionCallback.java", - "com/mysdk/IMyMainPackageInterface.java", - "com/mysdk/PrivacySandboxThrowableParcel.java" - ) + override val relativePathsToExpectedAidlClasses = + listOf( + "com/myotherpackage/IMyOtherPackageInterface.java", + "com/myotherpackage/ParcelableMyOtherPackageDataClass.java", + "com/mysdk/ICancellationSignal.java", + "com/mysdk/IListIntTransactionCallback.java", + "com/mysdk/IMyOtherPackageDataClassTransactionCallback.java", + "com/mysdk/IUnitTransactionCallback.java", + "com/mysdk/IMyOtherPackageInterfaceTransactionCallback.java", + "com/mysdk/IMySdk.java", + "com/mysdk/ParcelableStackFrame.java", + "com/mysdk/IStringTransactionCallback.java", + "com/mysdk/IMyMainPackageInterfaceTransactionCallback.java", + "com/mysdk/IMyMainPackageInterface.java", + "com/mysdk/PrivacySandboxThrowableParcel.java" + ) }
diff --git a/privacysandbox/tools/tools-apicompiler/src/test/java/androidx/privacysandbox/tools/apicompiler/TestUtils.kt b/privacysandbox/tools/tools-apicompiler/src/test/java/androidx/privacysandbox/tools/apicompiler/TestUtils.kt index e57803a..556d36b3 100644 --- a/privacysandbox/tools/tools-apicompiler/src/test/java/androidx/privacysandbox/tools/apicompiler/TestUtils.kt +++ b/privacysandbox/tools/tools-apicompiler/src/test/java/androidx/privacysandbox/tools/apicompiler/TestUtils.kt
@@ -24,8 +24,8 @@ /** * Compile the given sources using the PrivacySandboxKspCompiler. * - * Default parameters will set required options like AIDL compiler path and use the latest - * Android platform API stubs that support the Privacy Sandbox. + * Default parameters will set required options like AIDL compiler path and use the latest Android + * platform API stubs that support the Privacy Sandbox. */ fun compileWithPrivacySandboxKspCompiler( sources: List,
diff --git a/privacysandbox/tools/tools-apicompiler/src/test/java/androidx/privacysandbox/tools/apicompiler/WithoutRuntimeLibrarySdkApiCompilerDiffTest.kt b/privacysandbox/tools/tools-apicompiler/src/test/java/androidx/privacysandbox/tools/apicompiler/WithoutRuntimeLibrarySdkApiCompilerDiffTest.kt index 3cceb9a..9c76cb3 100644 --- a/privacysandbox/tools/tools-apicompiler/src/test/java/androidx/privacysandbox/tools/apicompiler/WithoutRuntimeLibrarySdkApiCompilerDiffTest.kt +++ b/privacysandbox/tools/tools-apicompiler/src/test/java/androidx/privacysandbox/tools/apicompiler/WithoutRuntimeLibrarySdkApiCompilerDiffTest.kt
@@ -23,11 +23,12 @@ class WithoutRuntimeLibrarySdkApiCompilerDiffTest : AbstractApiCompilerDiffTest() { override val subdirectoryName = "withoutruntimelibrarysdk" override val extraProcessorOptions = mapOf("skip_sdk_runtime_compat_library" to "true") - override val relativePathsToExpectedAidlClasses = listOf( - "com/mysdk/ICancellationSignal.java", - "com/mysdk/IWithoutRuntimeLibrarySdk.java", - "com/mysdk/IStringTransactionCallback.java", - "com/mysdk/ParcelableStackFrame.java", - "com/mysdk/PrivacySandboxThrowableParcel.java", - ) + override val relativePathsToExpectedAidlClasses = + listOf( + "com/mysdk/ICancellationSignal.java", + "com/mysdk/IWithoutRuntimeLibrarySdk.java", + "com/mysdk/IStringTransactionCallback.java", + "com/mysdk/ParcelableStackFrame.java", + "com/mysdk/PrivacySandboxThrowableParcel.java", + ) }
diff --git a/privacysandbox/tools/tools-apicompiler/src/test/java/androidx/privacysandbox/tools/apicompiler/parser/InterfaceParserTest.kt b/privacysandbox/tools/tools-apicompiler/src/test/java/androidx/privacysandbox/tools/apicompiler/parser/InterfaceParserTest.kt index 5cf9554..9cb0abf 100644 --- a/privacysandbox/tools/tools-apicompiler/src/test/java/androidx/privacysandbox/tools/apicompiler/parser/InterfaceParserTest.kt +++ b/privacysandbox/tools/tools-apicompiler/src/test/java/androidx/privacysandbox/tools/apicompiler/parser/InterfaceParserTest.kt
@@ -36,9 +36,10 @@ @Test fun parseServiceInterface_ok() { - val source = Source.kotlin( - "com/mysdk/MySdk.kt", - """ + val source = + Source.kotlin( + "com/mysdk/MySdk.kt", + """ package com.mysdk import androidx.privacysandbox.tools.PrivacySandboxService @PrivacySandboxService @@ -48,48 +49,55 @@ fun doMoreStuff() } """, - ) - assertThat(parseSources(source)).isEqualTo( - ParsedApi( - services = mutableSetOf( - AnnotatedInterface( - type = Type(packageName = "com.mysdk", simpleName = "MySdk"), - methods = listOf( - Method( - name = "doStuff", - parameters = listOf( - Parameter( - name = "x", - type = Types.int, - ), Parameter( - name = "y", - type = Types.int.asNullable(), + ) + assertThat(parseSources(source)) + .isEqualTo( + ParsedApi( + services = + mutableSetOf( + AnnotatedInterface( + type = Type(packageName = "com.mysdk", simpleName = "MySdk"), + methods = + listOf( + Method( + name = "doStuff", + parameters = + listOf( + Parameter( + name = "x", + type = Types.int, + ), + Parameter( + name = "y", + type = Types.int.asNullable(), + ) + ), + returnType = Types.string, + isSuspend = true, + ), + Method( + name = "processList", + parameters = + listOf( + Parameter( + name = "list", + type = Types.list(Types.int), + ) + ), + returnType = Types.list(Types.string), + isSuspend = true, + ), + Method( + name = "doMoreStuff", + parameters = listOf(), + returnType = Types.unit, + isSuspend = false, + ) ) - ), - returnType = Types.string, - isSuspend = true, - ), - Method( - name = "processList", - parameters = listOf( - Parameter( - name = "list", - type = Types.list(Types.int), - ) - ), - returnType = Types.list(Types.string), - isSuspend = true, - ), Method( - name = "doMoreStuff", - parameters = listOf(), - returnType = Types.unit, - isSuspend = false, ) ) - ) ) ) - ) } @Test @@ -117,43 +125,53 @@ |@PrivacySandboxInterface |interface MyUiInterface : SUiAdapter { |} - """.trimMargin() + """ + .trimMargin() ) - assertThat(parseSources(serviceSource, interfaceSource)).isEqualTo( - ParsedApi( - services = setOf( - AnnotatedInterface( - type = Type(packageName = "com.mysdk", simpleName = "MySdk"), - methods = listOf( - Method( - name = "doStuff", - parameters = listOf(), - returnType = Type( - packageName = "com.mysdk", - simpleName = "MyUiInterface" - ), - isSuspend = true, - ), - ) - ) - ), - interfaces = setOf( - AnnotatedInterface( - type = Type(packageName = "com.mysdk", simpleName = "MyUiInterface"), - superTypes = listOf( - Types.sandboxedUiAdapter, + assertThat(parseSources(serviceSource, interfaceSource)) + .isEqualTo( + ParsedApi( + services = + setOf( + AnnotatedInterface( + type = Type(packageName = "com.mysdk", simpleName = "MySdk"), + methods = + listOf( + Method( + name = "doStuff", + parameters = listOf(), + returnType = + Type( + packageName = "com.mysdk", + simpleName = "MyUiInterface" + ), + isSuspend = true, + ), + ) + ) ), - methods = listOf() - ) + interfaces = + setOf( + AnnotatedInterface( + type = + Type(packageName = "com.mysdk", simpleName = "MyUiInterface"), + superTypes = + listOf( + Types.sandboxedUiAdapter, + ), + methods = listOf() + ) + ) ) ) - ) } @Test fun serviceAnnotatedClass_fails() { - val source = Source.kotlin( - "com/mysdk/MySdk.kt", """ + val source = + Source.kotlin( + "com/mysdk/MySdk.kt", + """ package com.mysdk import androidx.privacysandbox.tools.PrivacySandboxService @PrivacySandboxService @@ -161,7 +179,7 @@ abstract fun doStuff(x: Int, y: Int): String } """ - ) + ) checkSourceFails(source) .containsError("Only interfaces can be annotated with @PrivacySandboxService.") @@ -169,22 +187,26 @@ @Test fun multipleServices_fails() { - val source = Source.kotlin( - "com/mysdk/MySdk.kt", """ + val source = + Source.kotlin( + "com/mysdk/MySdk.kt", + """ package com.mysdk import androidx.privacysandbox.tools.PrivacySandboxService @PrivacySandboxService interface MySdk """ - ) - val source2 = Source.kotlin( - "com/mysdk/MySdk2.kt", """ + ) + val source2 = + Source.kotlin( + "com/mysdk/MySdk2.kt", + """ package com.mysdk import androidx.privacysandbox.tools.PrivacySandboxService @PrivacySandboxService interface MySdk2 """ - ) + ) checkSourceFails(source, source2) .containsError( @@ -195,74 +217,83 @@ @Test fun privateInterface_fails() { - checkSourceFails( - serviceInterface("private interface MySdk") - ).containsError("Error in com.mysdk.MySdk: annotated interfaces should be public.") + checkSourceFails(serviceInterface("private interface MySdk")) + .containsError("Error in com.mysdk.MySdk: annotated interfaces should be public.") } @Test fun interfaceWithProperties_fails() { checkSourceFails( - serviceInterface( - """public interface MySdk { + serviceInterface( + """public interface MySdk { | val x: Int |} - """.trimMargin() + """ + .trimMargin() + ) ) - ).containsExactlyErrors( - "Error in com.mysdk.MySdk: annotated interfaces cannot declare properties." - ) + .containsExactlyErrors( + "Error in com.mysdk.MySdk: annotated interfaces cannot declare properties." + ) } @Test fun interfaceWithCompanionObject_fails() { checkSourceFails( - serviceInterface( - """interface MySdk { + serviceInterface( + """interface MySdk { | companion object { | fun foo() {} | } |} - """.trimMargin() + """ + .trimMargin() + ) ) - ).containsExactlyErrors( - "Error in com.mysdk.MySdk: annotated interfaces cannot declare companion objects." - ) + .containsExactlyErrors( + "Error in com.mysdk.MySdk: annotated interfaces cannot declare companion objects." + ) } @Test fun interfaceWithInvalidModifier_fails() { checkSourceFails( - serviceInterface( - """external fun interface MySdk { + serviceInterface( + """external fun interface MySdk { | suspend fun apply() |} - """.trimMargin() + """ + .trimMargin() + ) ) - ).containsExactlyErrors( - "Error in com.mysdk.MySdk: annotated interface contains invalid modifiers (external, " + - "fun)." - ) + .containsExactlyErrors( + "Error in com.mysdk.MySdk: annotated interface contains invalid modifiers (external, " + + "fun)." + ) } @Test fun interfaceWithGenerics_fails() { checkSourceFails( - serviceInterface( - """interface MySdk{ + serviceInterface( + """interface MySdk{ | suspend fun getT() |} - """.trimMargin() + """ + .trimMargin() + ) ) - ).containsExactlyErrors( - "Error in com.mysdk.MySdk: annotated interfaces cannot declare type parameters (T, U)." - ) + .containsExactlyErrors( + "Error in com.mysdk.MySdk: annotated interfaces cannot declare type parameters (T, U)." + ) } @Test fun interfaceInheritance_fails() { - val source = Source.kotlin( - "com/mysdk/MySdk.kt", """ + val source = + Source.kotlin( + "com/mysdk/MySdk.kt", + """ package com.mysdk import androidx.privacysandbox.tools.PrivacySandboxService import androidx.privacysandbox.tools.PrivacySandboxInterface @@ -276,17 +307,20 @@ interface MyInterface : FooInterface { suspend fun foo(): Int }""" - ) - checkSourceFails(source).containsExactlyErrors( - "Error in com.mysdk.MyInterface: annotated interface inherits prohibited types (" + - "FooInterface)." - ) + ) + checkSourceFails(source) + .containsExactlyErrors( + "Error in com.mysdk.MyInterface: annotated interface inherits prohibited types (" + + "FooInterface)." + ) } @Test fun interfaceInheritsManyInterfaces_fails() { - val source = Source.kotlin( - "com/mysdk/MySdk.kt", """ + val source = + Source.kotlin( + "com/mysdk/MySdk.kt", + """ package com.mysdk import androidx.privacysandbox.tools.PrivacySandboxService import androidx.privacysandbox.tools.PrivacySandboxInterface @@ -303,17 +337,20 @@ interface MyInterface : B, C, D, A { suspend fun foo(): Int }""" - ) - checkSourceFails(source).containsExactlyErrors( - "Error in com.mysdk.MyInterface: annotated interface inherits prohibited types (A, " + - "B, C, ...)." - ) + ) + checkSourceFails(source) + .containsExactlyErrors( + "Error in com.mysdk.MyInterface: annotated interface inherits prohibited types (A, " + + "B, C, ...)." + ) } @Test fun callbackInheritance_fails() { - val source = Source.kotlin( - "com/mysdk/MySdk.kt", """ + val source = + Source.kotlin( + "com/mysdk/MySdk.kt", + """ package com.mysdk import androidx.privacysandbox.tools.PrivacySandboxService import androidx.privacysandbox.tools.PrivacySandboxCallback @@ -326,39 +363,44 @@ @PrivacySandboxCallback interface MyCallback : FooInterface {} """ - ) - checkSourceFails(source).containsExactlyErrors( - "Error in com.mysdk.MyCallback: annotated interface inherits prohibited types (" + - "FooInterface)." - ) + ) + checkSourceFails(source) + .containsExactlyErrors( + "Error in com.mysdk.MyCallback: annotated interface inherits prohibited types (" + + "FooInterface)." + ) } @Test fun methodWithImplementation_fails() { - checkSourceFails(serviceMethod("suspend fun foo(): Int = 1")).containsExactlyErrors( - "Error in com.mysdk.MySdk.foo: method cannot have default implementation." - ) + checkSourceFails(serviceMethod("suspend fun foo(): Int = 1")) + .containsExactlyErrors( + "Error in com.mysdk.MySdk.foo: method cannot have default implementation." + ) } @Test fun methodWithGenerics_fails() { - checkSourceFails(serviceMethod("suspend funfoo()")).containsExactlyErrors( - "Error in com.mysdk.MySdk.foo: method cannot declare type parameters ()." - ) + checkSourceFails(serviceMethod("suspend funfoo()")) + .containsExactlyErrors( + "Error in com.mysdk.MySdk.foo: method cannot declare type parameters ()." + ) } @Test fun methodWithInvalidModifiers_fails() { - checkSourceFails(serviceMethod("suspend inline fun foo()")).containsExactlyErrors( - "Error in com.mysdk.MySdk.foo: method contains invalid modifiers (inline)." - ) + checkSourceFails(serviceMethod("suspend inline fun foo()")) + .containsExactlyErrors( + "Error in com.mysdk.MySdk.foo: method contains invalid modifiers (inline)." + ) } @Test fun parameterWithDefaultValue_fails() { - checkSourceFails(serviceMethod("suspend fun foo(x: Int = 5)")).containsExactlyErrors( - "Error in com.mysdk.MySdk.foo: parameters cannot have default values." - ) + checkSourceFails(serviceMethod("suspend fun foo(x: Int = 5)")) + .containsExactlyErrors( + "Error in com.mysdk.MySdk.foo: parameters cannot have default values." + ) } @Test @@ -386,15 +428,18 @@ .containsExactlyErrors( "Error in com.mysdk.MySdk.foo: only primitives, lists, data/enum classes " + "annotated with @PrivacySandboxValue, interfaces annotated with " + - "@PrivacySandboxCallback " + "or @PrivacySandboxInterface, and " + + "@PrivacySandboxCallback " + + "or @PrivacySandboxInterface, and " + "SdkActivityLaunchers are supported as parameter types." ) } @Test fun returnTypeCustomClass_fails() { - val source = Source.kotlin( - "com/mysdk/MySdk.kt", """ + val source = + Source.kotlin( + "com/mysdk/MySdk.kt", + """ package com.mysdk import androidx.privacysandbox.tools.PrivacySandboxService @PrivacySandboxService @@ -404,12 +449,13 @@ class CustomClass """ - ) - checkSourceFails(source).containsExactlyErrors( - "Error in com.mysdk.MySdk.foo: only primitives, lists, data/enum classes annotated " + - "with @PrivacySandboxValue, interfaces annotated with @PrivacySandboxInterface, " + - "and SdkActivityLaunchers are supported as return types." - ) + ) + checkSourceFails(source) + .containsExactlyErrors( + "Error in com.mysdk.MySdk.foo: only primitives, lists, data/enum classes annotated " + + "with @PrivacySandboxValue, interfaces annotated with @PrivacySandboxInterface, " + + "and SdkActivityLaunchers are supported as return types." + ) } @Test @@ -436,37 +482,42 @@ } """ ) - assertThat(parseSources(serviceSource, callbackSource)).isEqualTo( - ParsedApi( - services = setOf( - AnnotatedInterface( - type = Type(packageName = "com.mysdk", simpleName = "MySdk"), - ) - ), - callbacks = setOf( - AnnotatedInterface( - type = Type(packageName = "com.mysdk", simpleName = "MyCallback"), - methods = listOf( - Method( - name = "onComplete", - parameters = listOf( - Parameter( - name = "x", - type = Types.int, - ), - Parameter( - name = "y", - type = Types.int, + assertThat(parseSources(serviceSource, callbackSource)) + .isEqualTo( + ParsedApi( + services = + setOf( + AnnotatedInterface( + type = Type(packageName = "com.mysdk", simpleName = "MySdk"), + ) + ), + callbacks = + setOf( + AnnotatedInterface( + type = Type(packageName = "com.mysdk", simpleName = "MyCallback"), + methods = + listOf( + Method( + name = "onComplete", + parameters = + listOf( + Parameter( + name = "x", + type = Types.int, + ), + Parameter( + name = "y", + type = Types.int, + ) + ), + returnType = Types.unit, + isSuspend = false, + ), ) - ), - returnType = Types.unit, - isSuspend = false, - ), + ) ) - ) ) ) - ) } @Test @@ -495,72 +546,84 @@ } """ ) - assertThat(parseSources(serviceSource, interfaceSource)).isEqualTo( - ParsedApi( - services = setOf( - AnnotatedInterface( - type = Type(packageName = "com.mysdk", simpleName = "MySdk"), - methods = listOf( - Method( - name = "doStuff", - parameters = listOf( - Parameter( - name = "request", - type = Type( - packageName = "com.mysdk", - simpleName = "MyInterface" + assertThat(parseSources(serviceSource, interfaceSource)) + .isEqualTo( + ParsedApi( + services = + setOf( + AnnotatedInterface( + type = Type(packageName = "com.mysdk", simpleName = "MySdk"), + methods = + listOf( + Method( + name = "doStuff", + parameters = + listOf( + Parameter( + name = "request", + type = + Type( + packageName = "com.mysdk", + simpleName = "MyInterface" + ), + ) + ), + returnType = + Type( + packageName = "com.mysdk", + simpleName = "MyInterface" + ), + isSuspend = true, ), ) - ), - returnType = Type( - packageName = "com.mysdk", - simpleName = "MyInterface" - ), - isSuspend = true, - ), - ) - ) - ), - interfaces = setOf( - AnnotatedInterface( - type = Type(packageName = "com.mysdk", simpleName = "MyInterface"), - methods = listOf( - Method( - name = "doMoreStuff", - parameters = listOf( - Parameter( - name = "x", - type = Types.int, - ), - Parameter( - name = "y", - type = Types.int, + ) + ), + interfaces = + setOf( + AnnotatedInterface( + type = Type(packageName = "com.mysdk", simpleName = "MyInterface"), + methods = + listOf( + Method( + name = "doMoreStuff", + parameters = + listOf( + Parameter( + name = "x", + type = Types.int, + ), + Parameter( + name = "y", + type = Types.int, + ) + ), + returnType = Types.string, + isSuspend = true, + ), ) - ), - returnType = Types.string, - isSuspend = true, - ), + ) ) - ) ) ) - ) } - private fun serviceInterface(declaration: String) = Source.kotlin( - "com/mysdk/MySdk.kt", """ + private fun serviceInterface(declaration: String) = + Source.kotlin( + "com/mysdk/MySdk.kt", + """ package com.mysdk import androidx.privacysandbox.tools.PrivacySandboxService @PrivacySandboxService $declaration """ - ) + ) - private fun serviceMethod(declaration: String) = serviceInterface( - """ + private fun serviceMethod(declaration: String) = + serviceInterface( + """ interface MySdk { $declaration } """ - ) + ) }
diff --git a/privacysandbox/tools/tools-apicompiler/src/test/java/androidx/privacysandbox/tools/apicompiler/parser/ValueParserTest.kt b/privacysandbox/tools/tools-apicompiler/src/test/java/androidx/privacysandbox/tools/apicompiler/parser/ValueParserTest.kt index 8a20a25..3a486ea 100644 --- a/privacysandbox/tools/tools-apicompiler/src/test/java/androidx/privacysandbox/tools/apicompiler/parser/ValueParserTest.kt +++ b/privacysandbox/tools/tools-apicompiler/src/test/java/androidx/privacysandbox/tools/apicompiler/parser/ValueParserTest.kt
@@ -39,8 +39,10 @@ @Test fun parseDataClass_ok() { - val source = Source.kotlin( - "com/mysdk/MySdk.kt", """ + val source = + Source.kotlin( + "com/mysdk/MySdk.kt", + """ package com.mysdk import androidx.privacysandbox.tools.PrivacySandboxService import androidx.privacysandbox.tools.PrivacySandboxValue @@ -56,55 +58,72 @@ @PrivacySandboxValue data class MagicPayload(val magicList: List) """ - ) - assertThat(parseSources(source)).isEqualTo( - ParsedApi( - services = setOf( - AnnotatedInterface( - type = Type(packageName = "com.mysdk", simpleName = "MySdk"), - methods = listOf( - Method( - name = "doStuff", - parameters = listOf( - Parameter("request", Type("com.mysdk", "MySdkRequest")) - ), - returnType = Type("com.mysdk", "MySdkResponse"), - isSuspend = true + ) + assertThat(parseSources(source)) + .isEqualTo( + ParsedApi( + services = + setOf( + AnnotatedInterface( + type = Type(packageName = "com.mysdk", simpleName = "MySdk"), + methods = + listOf( + Method( + name = "doStuff", + parameters = + listOf( + Parameter( + "request", + Type("com.mysdk", "MySdkRequest") + ) + ), + returnType = Type("com.mysdk", "MySdkResponse"), + isSuspend = true + ) + ) ) - ) - ) - ), - values = setOf( - AnnotatedDataClass( - type = Type(packageName = "com.mysdk", simpleName = "MySdkRequest"), - properties = listOf( - ValueProperty("id", Types.int), - ValueProperty("message", Types.string.asNullable()), - ) - ), - AnnotatedDataClass( - type = Type(packageName = "com.mysdk", simpleName = "MySdkResponse"), - properties = listOf( - ValueProperty( - "magicPayload", - Type(packageName = "com.mysdk", simpleName = "MagicPayload") + ), + values = + setOf( + AnnotatedDataClass( + type = Type(packageName = "com.mysdk", simpleName = "MySdkRequest"), + properties = + listOf( + ValueProperty("id", Types.int), + ValueProperty("message", Types.string.asNullable()), + ) ), - ValueProperty("isTrulyMagic", Types.boolean), + AnnotatedDataClass( + type = + Type(packageName = "com.mysdk", simpleName = "MySdkResponse"), + properties = + listOf( + ValueProperty( + "magicPayload", + Type( + packageName = "com.mysdk", + simpleName = "MagicPayload" + ) + ), + ValueProperty("isTrulyMagic", Types.boolean), + ) + ), + AnnotatedDataClass( + type = Type(packageName = "com.mysdk", simpleName = "MagicPayload"), + properties = + listOf(ValueProperty("magicList", Types.list(Types.long))) + ), ) - ), - AnnotatedDataClass( - type = Type(packageName = "com.mysdk", simpleName = "MagicPayload"), - properties = listOf(ValueProperty("magicList", Types.list(Types.long))) - ), ) ) - ) } @Test fun parseEnumClass_ok() { - val source = Source.kotlin( - "com/mysdk/MySdk.kt", """ + val source = + Source.kotlin( + "com/mysdk/MySdk.kt", + """ package com.mysdk import androidx.privacysandbox.tools.PrivacySandboxService import androidx.privacysandbox.tools.PrivacySandboxValue @@ -114,21 +133,24 @@ @PrivacySandboxValue enum class MyEnum { FOO, BAR } """ - ) - assertThat(parseSources(source).values).isEqualTo( - setOf( - AnnotatedEnumClass( - Type(packageName = "com.mysdk", simpleName = "MyEnum"), - listOf("FOO", "BAR") + ) + assertThat(parseSources(source).values) + .isEqualTo( + setOf( + AnnotatedEnumClass( + Type(packageName = "com.mysdk", simpleName = "MyEnum"), + listOf("FOO", "BAR") + ) ) ) - ) } @Test fun enumClassImplementingInterface_fails() { - val source = Source.kotlin( - "com/mysdk/MySdk.kt", """ + val source = + Source.kotlin( + "com/mysdk/MySdk.kt", + """ package com.mysdk import androidx.privacysandbox.tools.PrivacySandboxService import androidx.privacysandbox.tools.PrivacySandboxValue @@ -141,11 +163,12 @@ STOP, GO; } """ - ) - checkSourceFails(source).containsExactlyErrors( - "Error in com.mysdk.MoveState: values annotated with @PrivacySandboxValue" + - " may not inherit other types (com.mysdk.Transmogrifable)" - ) + ) + checkSourceFails(source) + .containsExactlyErrors( + "Error in com.mysdk.MoveState: values annotated with @PrivacySandboxValue" + + " may not inherit other types (com.mysdk.Transmogrifable)" + ) } @Test @@ -176,15 +199,17 @@ @Test fun dataClassWithCompanionObject_fails() { - val dataClass = annotatedValue( - """ + val dataClass = + annotatedValue( + """ |data class MySdkRequest(val id: Int) { | companion object { | val someConstant = 12 | } |} - """.trimMargin() - ) + """ + .trimMargin() + ) checkSourceFails(dataClass) .containsExactlyErrors( "Error in com.mysdk.MySdkRequest: annotated values cannot declare companion " + @@ -204,9 +229,7 @@ @Test fun dataClassWithMutableProperty_fails() { - val dataClass = annotatedValue( - "data class MySdkRequest(val id: Int, var data: String)" - ) + val dataClass = annotatedValue("data class MySdkRequest(val id: Int, var data: String)") checkSourceFails(dataClass) .containsExactlyErrors( "Error in com.mysdk.MySdkRequest.data: properties cannot be mutable." @@ -215,9 +238,7 @@ @Test fun dataClassWithInvalidPropertyType_fails() { - val dataClass = annotatedValue( - "data class MySdkRequest(val foo: IntArray)" - ) + val dataClass = annotatedValue("data class MySdkRequest(val foo: IntArray)") checkSourceFails(dataClass) .containsExactlyErrors( "Error in com.mysdk.MySdkRequest.foo: only primitives, lists, data/enum classes " + @@ -227,8 +248,10 @@ ) } - private fun annotatedValue(declaration: String) = Source.kotlin( - "com/mysdk/MySdk.kt", """ + private fun annotatedValue(declaration: String) = + Source.kotlin( + "com/mysdk/MySdk.kt", + """ package com.mysdk import androidx.privacysandbox.tools.PrivacySandboxService import androidx.privacysandbox.tools.PrivacySandboxValue @@ -237,5 +260,5 @@ @PrivacySandboxValue $declaration """ - ) + ) }
diff --git a/privacysandbox/tools/tools-apicompiler/src/test/java/androidx/privacysandbox/tools/apicompiler/util/KspTestRunner.kt b/privacysandbox/tools/tools-apicompiler/src/test/java/androidx/privacysandbox/tools/apicompiler/util/KspTestRunner.kt index 2f6420e..977f26e 100644 --- a/privacysandbox/tools/tools-apicompiler/src/test/java/androidx/privacysandbox/tools/apicompiler/util/KspTestRunner.kt +++ b/privacysandbox/tools/tools-apicompiler/src/test/java/androidx/privacysandbox/tools/apicompiler/util/KspTestRunner.kt
@@ -31,33 +31,33 @@ import com.google.devtools.ksp.symbol.KSAnnotated import java.nio.file.Files -/** - * Helper to run KSP processing functionality in tests. - */ +/** Helper to run KSP processing functionality in tests. */ fun parseSources(vararg sources: Source): ParsedApi { val provider = CapturingSymbolProcessor.Provider() assertThat( - compile( - Files.createTempDirectory("test").toFile(), - TestCompilationArguments( - sources = sources.toList(), - symbolProcessorProviders = listOf(provider), + compile( + Files.createTempDirectory("test").toFile(), + TestCompilationArguments( + sources = sources.toList(), + symbolProcessorProviders = listOf(provider), + ) ) ) - ).succeeds() + .succeeds() assert(provider.processor.capture != null) { "KSP run didn't produce any output." } return provider.processor.capture!! } fun checkSourceFails(vararg sources: Source): CompilationResultSubject { val provider = CapturingSymbolProcessor.Provider() - val result = compile( - Files.createTempDirectory("test").toFile(), - TestCompilationArguments( - sources = sources.asList(), - symbolProcessorProviders = listOf(provider) + val result = + compile( + Files.createTempDirectory("test").toFile(), + TestCompilationArguments( + sources = sources.asList(), + symbolProcessorProviders = listOf(provider) + ) ) - ) return assertThat(result).also { it.fails() } }
diff --git a/privacysandbox/tools/tools-apigenerator/src/main/java/androidx/privacysandbox/tools/apigenerator/InterfaceFileGenerator.kt b/privacysandbox/tools/tools-apigenerator/src/main/java/androidx/privacysandbox/tools/apigenerator/InterfaceFileGenerator.kt index 3c43900..202fa39 100644 --- a/privacysandbox/tools/tools-apigenerator/src/main/java/androidx/privacysandbox/tools/apigenerator/InterfaceFileGenerator.kt +++ b/privacysandbox/tools/tools-apigenerator/src/main/java/androidx/privacysandbox/tools/apigenerator/InterfaceFileGenerator.kt
@@ -38,9 +38,8 @@ } return FileSpec.get(annotatedInterface.type.packageName, annotatedInterfaceType) - .toBuilder().build { - addCommonSettings() - } + .toBuilder() + .build { addCommonSettings() } } private fun generateInterfaceMethod(method: Method) =
diff --git a/privacysandbox/tools/tools-apigenerator/src/main/java/androidx/privacysandbox/tools/apigenerator/PrivacySandboxApiGenerator.kt b/privacysandbox/tools/tools-apigenerator/src/main/java/androidx/privacysandbox/tools/apigenerator/PrivacySandboxApiGenerator.kt index 342ef86..0876d1f 100644 --- a/privacysandbox/tools/tools-apigenerator/src/main/java/androidx/privacysandbox/tools/apigenerator/PrivacySandboxApiGenerator.kt +++ b/privacysandbox/tools/tools-apigenerator/src/main/java/androidx/privacysandbox/tools/apigenerator/PrivacySandboxApiGenerator.kt
@@ -64,9 +64,9 @@ /** * Generate API sources for a given SDK. * - * The SDK interface is defined by the [sdkInterfaceDescriptors], which is expected to be - * a zip file with a set of compiled Kotlin interfaces using Privacy Sandbox tool annotations. - * The SDK is expected to be compiled with compatible Privacy Sandbox tools. + * The SDK interface is defined by the [sdkInterfaceDescriptors], which is expected to be a zip + * file with a set of compiled Kotlin interfaces using Privacy Sandbox tool annotations. The SDK + * is expected to be compiled with compatible Privacy Sandbox tools. * * @param sdkInterfaceDescriptors Zip file with the SDK's annotated and compiled interfaces. * @param aidlCompiler AIDL compiler binary. It must target API 30 or above. @@ -122,8 +122,7 @@ private fun generateBinders(api: ParsedApi, aidlCompiler: AidlCompiler, output: File) { val aidlWorkingDir = output.resolve("tmp-aidl").also { it.mkdir() } try { - val generatedFiles = - AidlGenerator.generate(aidlCompiler, api, aidlWorkingDir.toPath()) + val generatedFiles = AidlGenerator.generate(aidlCompiler, api, aidlWorkingDir.toPath()) generatedFiles.forEach { val relativePath = aidlWorkingDir.toPath().relativize(it.file.toPath()) val source = it.file.toPath() @@ -138,9 +137,7 @@ private fun generateServiceFactory(api: ParsedApi, output: File) { val serviceFactoryFileGenerator = ServiceFactoryFileGenerator() - api.services.forEach { - serviceFactoryFileGenerator.generate(it).writeTo(output) - } + api.services.forEach { serviceFactoryFileGenerator.generate(it).writeTo(output) } } private fun generateStubDelegates( @@ -187,9 +184,9 @@ } private fun generateCoreLibInfoConverters(api: ParsedApi, output: File) { - api.interfaces.filter { it.inheritsSandboxedUiAdapter }.map { - CoreLibInfoAndBinderWrapperConverterGenerator.generate(it).writeTo(output) - } + api.interfaces + .filter { it.inheritsSandboxedUiAdapter } + .map { CoreLibInfoAndBinderWrapperConverterGenerator.generate(it).writeTo(output) } } private fun generateSdkActivityLauncherUtilities( @@ -226,15 +223,14 @@ } private fun ensureValidMetadata(metadataFile: Path) { - require(metadataFile.exists()) { - "Missing tool metadata in SDK API descriptor." - } + require(metadataFile.exists()) { "Missing tool metadata in SDK API descriptor." } - val metadata = try { - ToolMetadata.parseFrom(metadataFile.readBytes()) - } catch (e: InvalidProtocolBufferException) { - throw IllegalArgumentException("Invalid Privacy Sandbox tool metadata.", e) - } + val metadata = + try { + ToolMetadata.parseFrom(metadataFile.readBytes()) + } catch (e: InvalidProtocolBufferException) { + throw IllegalArgumentException("Invalid Privacy Sandbox tool metadata.", e) + } val sdkCodeGenerationVersion = metadata.codeGenerationVersion val consumerVersion = Metadata.toolMetadata.codeGenerationVersion @@ -250,9 +246,9 @@ output: File ) { if (!api.hasSuspendFunctions()) return - ThrowableParcelConverterFileGenerator(basePackageName) - .generate().writeTo(output) - TransportCancellationGenerator(api.getOnlyService().type.packageName).generate() + ThrowableParcelConverterFileGenerator(basePackageName).generate().writeTo(output) + TransportCancellationGenerator(api.getOnlyService().type.packageName) + .generate() .writeTo(output) PrivacySandboxExceptionFileGenerator(basePackageName).generate().writeTo(output) PrivacySandboxCancellationExceptionFileGenerator(basePackageName).generate().writeTo(output)
diff --git a/privacysandbox/tools/tools-apigenerator/src/main/java/androidx/privacysandbox/tools/apigenerator/parser/AnnotatedClassReader.kt b/privacysandbox/tools/tools-apigenerator/src/main/java/androidx/privacysandbox/tools/apigenerator/parser/AnnotatedClassReader.kt index e8c754f..d39025a 100644 --- a/privacysandbox/tools/tools-apigenerator/src/main/java/androidx/privacysandbox/tools/apigenerator/parser/AnnotatedClassReader.kt +++ b/privacysandbox/tools/tools-apigenerator/src/main/java/androidx/privacysandbox/tools/apigenerator/parser/AnnotatedClassReader.kt
@@ -45,24 +45,26 @@ val values = mutableSetOf() val callbacks = mutableSetOf() val interfaces = mutableSetOf() - stubClassPath.toFile().walk() + stubClassPath + .toFile() + .walk() .filter { it.extension == "class" } .map { toClassNode(it.readBytes()) } .forEach { classNode -> - if (classNode.isAnnotatedWith()) { - services.add(parseKotlinMetadata(classNode)) + if (classNode.isAnnotatedWith()) { + services.add(parseKotlinMetadata(classNode)) + } + // TODO(b/323369085): Validate that enum variants don't have methods + if (classNode.isAnnotatedWith()) { + values.add(parseKotlinMetadata(classNode)) + } + if (classNode.isAnnotatedWith()) { + callbacks.add(parseKotlinMetadata(classNode)) + } + if (classNode.isAnnotatedWith()) { + interfaces.add(parseKotlinMetadata(classNode)) + } } - // TODO(b/323369085): Validate that enum variants don't have methods - if (classNode.isAnnotatedWith()) { - values.add(parseKotlinMetadata(classNode)) - } - if (classNode.isAnnotatedWith()) { - callbacks.add(parseKotlinMetadata(classNode)) - } - if (classNode.isAnnotatedWith()) { - interfaces.add(parseKotlinMetadata(classNode)) - } - } return AnnotatedClasses( services = services.toSet(), values = values.toSet(), @@ -92,22 +94,24 @@ // ASM models annotation attributes as flat List, so the unchecked cast is // inevitable when some of these objects have type parameters, like the lists below. @Suppress("UNCHECKED_CAST") - val metadataAnnotation = Metadata( - kind = metadataValues["k"] as Int?, - metadataVersion = (metadataValues["mv"] as? List?)?.toIntArray(), - data1 = (metadataValues["d1"] as? List?)?.toTypedArray(), - data2 = (metadataValues["d2"] as? List?)?.toTypedArray(), - extraInt = metadataValues["xi"] as? Int?, - packageName = metadataValues["pn"] as? String?, - extraString = metadataValues["xs"] as? String?, - ) + val metadataAnnotation = + Metadata( + kind = metadataValues["k"] as Int?, + metadataVersion = (metadataValues["mv"] as? List?)?.toIntArray(), + data1 = (metadataValues["d1"] as? List?)?.toTypedArray(), + data2 = (metadataValues["d2"] as? List?)?.toTypedArray(), + extraInt = metadataValues["xi"] as? Int?, + packageName = metadataValues["pn"] as? String?, + extraString = metadataValues["xs"] as? String?, + ) return when (val metadata = KotlinClassMetadata.readStrict(metadataAnnotation)) { is KotlinClassMetadata.Class -> metadata.kmClass - else -> throw PrivacySandboxParsingException( - "Unable to parse Kotlin metadata from ${classNode.name}. " + - "Is this a valid Kotlin class?" - ) + else -> + throw PrivacySandboxParsingException( + "Unable to parse Kotlin metadata from ${classNode.name}. " + + "Is this a valid Kotlin class?" + ) } }
diff --git a/privacysandbox/tools/tools-apigenerator/src/main/java/androidx/privacysandbox/tools/apigenerator/parser/ApiStubParser.kt b/privacysandbox/tools/tools-apigenerator/src/main/java/androidx/privacysandbox/tools/apigenerator/parser/ApiStubParser.kt index f43a17f..8d024db 100644 --- a/privacysandbox/tools/tools-apigenerator/src/main/java/androidx/privacysandbox/tools/apigenerator/parser/ApiStubParser.kt +++ b/privacysandbox/tools/tools-apigenerator/src/main/java/androidx/privacysandbox/tools/apigenerator/parser/ApiStubParser.kt
@@ -50,15 +50,17 @@ internal fun parse(sdkStubsClasspath: Path): ParsedApi { val (services, values, callbacks, interfaces) = AnnotatedClassReader.readAnnotatedClasses(sdkStubsClasspath) - if (services.isEmpty()) throw PrivacySandboxParsingException( - "Unable to find valid interfaces annotated with @PrivacySandboxService." - ) + if (services.isEmpty()) + throw PrivacySandboxParsingException( + "Unable to find valid interfaces annotated with @PrivacySandboxService." + ) return ParsedApi( - services.map { parseInterface(it, "PrivacySandboxService") }.toSet(), - values.map(::parseValue).toSet(), - callbacks.map { parseInterface(it, "PrivacySandboxCallback") }.toSet(), - interfaces.map { parseInterface(it, "PrivacySandboxInterface") }.toSet(), - ).also(::validate) + services.map { parseInterface(it, "PrivacySandboxService") }.toSet(), + values.map(::parseValue).toSet(), + callbacks.map { parseInterface(it, "PrivacySandboxCallback") }.toSet(), + interfaces.map { parseInterface(it, "PrivacySandboxInterface") }.toSet(), + ) + .also(::validate) } private fun parseInterface(service: KmClass, annotationName: String): AnnotatedInterface { @@ -89,11 +91,15 @@ "annotated with @PrivacySandboxValue." ) } - val superTypes = value.supertypes.asSequence().map { it.classifier } - .filterIsInstance() - .map { it.name } - .filter { it !in listOf("kotlin/Enum", "kotlin/Any") } - .map { parseClassName(it) }.toList() + val superTypes = + value.supertypes + .asSequence() + .map { it.classifier } + .filterIsInstance() + .map { it.name } + .filter { it !in listOf("kotlin/Enum", "kotlin/Any") } + .map { parseClassName(it) } + .toList() if (superTypes.isNotEmpty()) { throw PrivacySandboxParsingException( "Error in ${type.qualifiedName}: values annotated with @PrivacySandboxValue may " + @@ -111,10 +117,7 @@ } /** Parses properties and sorts them based on the order of constructor parameters. */ - private fun parseProperties( - type: Type, - valueClass: KmClass - ): List{ + private fun parseProperties(type: Type, valueClass: KmClass): List{ // TODO: handle multiple constructors. if (valueClass.constructors.size != 1) { throw PrivacySandboxParsingException("Multiple constructors for values not supported.") @@ -161,9 +164,8 @@ ): Type { // Package names are separated with slashes and nested classes are separated with dots. // (e.g com/example/OuterClass.InnerClass). - val (packageName, simpleName) = className.split('/').run { - dropLast(1).joinToString(separator = ".") to last() - } + val (packageName, simpleName) = + className.split('/').run { dropLast(1).joinToString(separator = ".") to last() } if (simpleName.contains('.')) { throw PrivacySandboxParsingException( @@ -179,8 +181,7 @@ val validationResult = ModelValidator.validate(api) if (validationResult.isFailure) { throw PrivacySandboxParsingException( - "Invalid API descriptors:\n" + - validationResult.errors.joinToString("\n") + "Invalid API descriptors:\n" + validationResult.errors.joinToString("\n") ) } }
diff --git a/privacysandbox/tools/tools-apigenerator/src/test/java/androidx/privacysandbox/tools/apigenerator/AbstractApiGeneratorDiffTest.kt b/privacysandbox/tools/tools-apigenerator/src/test/java/androidx/privacysandbox/tools/apigenerator/AbstractApiGeneratorDiffTest.kt index 415aa55..bc1baf9 100644 --- a/privacysandbox/tools/tools-apigenerator/src/test/java/androidx/privacysandbox/tools/apigenerator/AbstractApiGeneratorDiffTest.kt +++ b/privacysandbox/tools/tools-apigenerator/src/test/java/androidx/privacysandbox/tools/apigenerator/AbstractApiGeneratorDiffTest.kt
@@ -31,10 +31,7 @@ */ abstract class AbstractApiGeneratorDiffTest : AbstractDiffTest() { - override fun generateSources( - inputSources: List, - outputDirectory: Path - ): List{ + override fun generateSources(inputSources: List, outputDirectory: Path): List val descriptors = compileIntoInterfaceDescriptorsJar( inputSources, @@ -43,7 +40,10 @@ val generator = PrivacySandboxApiGenerator() generator.generate( descriptors, - TestEnvironment.aidlCompilerPath, TestEnvironment.frameworkAidlPath, outputDirectory) + TestEnvironment.aidlCompilerPath, + TestEnvironment.frameworkAidlPath, + outputDirectory + ) return loadSourcesFromDirectory(outputDirectory.toFile()) }{
diff --git a/privacysandbox/tools/tools-apigenerator/src/test/java/androidx/privacysandbox/tools/apigenerator/CallbacksApiGeneratorDiffTest.kt b/privacysandbox/tools/tools-apigenerator/src/test/java/androidx/privacysandbox/tools/apigenerator/CallbacksApiGeneratorDiffTest.kt index 61639fe..e2e5a08 100644 --- a/privacysandbox/tools/tools-apigenerator/src/test/java/androidx/privacysandbox/tools/apigenerator/CallbacksApiGeneratorDiffTest.kt +++ b/privacysandbox/tools/tools-apigenerator/src/test/java/androidx/privacysandbox/tools/apigenerator/CallbacksApiGeneratorDiffTest.kt
@@ -22,17 +22,18 @@ @RunWith(JUnit4::class) class CallbacksApiGeneratorDiffTest : AbstractApiGeneratorDiffTest() { override val subdirectoryName = "callbacks" - override val relativePathsToExpectedAidlClasses = listOf( - "com/sdkwithcallbacks/IMyInterface.java", - "com/sdkwithcallbacks/ISdkCallback.java", - "com/sdkwithcallbacks/ISdkService.java", - "com/sdkwithcallbacks/ParcelableResponse.java", - "com/sdkwithcallbacks/ParcelableMyEnum.java", - "com/sdkwithcallbacks/IMyUiInterface.java", - "com/sdkwithcallbacks/IMyUiInterfaceCoreLibInfoAndBinderWrapper.java", - "com/sdkwithcallbacks/PrivacySandboxThrowableParcel.java", - "com/sdkwithcallbacks/IResponseTransactionCallback.java", - "com/sdkwithcallbacks/ICancellationSignal.java", - "com/sdkwithcallbacks/ParcelableStackFrame.java", - ) + override val relativePathsToExpectedAidlClasses = + listOf( + "com/sdkwithcallbacks/IMyInterface.java", + "com/sdkwithcallbacks/ISdkCallback.java", + "com/sdkwithcallbacks/ISdkService.java", + "com/sdkwithcallbacks/ParcelableResponse.java", + "com/sdkwithcallbacks/ParcelableMyEnum.java", + "com/sdkwithcallbacks/IMyUiInterface.java", + "com/sdkwithcallbacks/IMyUiInterfaceCoreLibInfoAndBinderWrapper.java", + "com/sdkwithcallbacks/PrivacySandboxThrowableParcel.java", + "com/sdkwithcallbacks/IResponseTransactionCallback.java", + "com/sdkwithcallbacks/ICancellationSignal.java", + "com/sdkwithcallbacks/ParcelableStackFrame.java", + ) }
diff --git a/privacysandbox/tools/tools-apigenerator/src/test/java/androidx/privacysandbox/tools/apigenerator/InterfaceApiGeneratorDiffTest.kt b/privacysandbox/tools/tools-apigenerator/src/test/java/androidx/privacysandbox/tools/apigenerator/InterfaceApiGeneratorDiffTest.kt index 7558126..3588f0a 100644 --- a/privacysandbox/tools/tools-apigenerator/src/test/java/androidx/privacysandbox/tools/apigenerator/InterfaceApiGeneratorDiffTest.kt +++ b/privacysandbox/tools/tools-apigenerator/src/test/java/androidx/privacysandbox/tools/apigenerator/InterfaceApiGeneratorDiffTest.kt
@@ -22,16 +22,17 @@ @RunWith(JUnit4::class) class InterfaceApiGeneratorDiffTest : AbstractApiGeneratorDiffTest() { override val subdirectoryName = "interfaces" - override val relativePathsToExpectedAidlClasses = listOf( - "com/sdk/IMySdk.java", - "com/sdk/IMyInterface.java", - "com/sdk/IMySecondInterface.java", - "com/sdk/IMyInterfaceTransactionCallback.java", - "com/sdk/IMySecondInterfaceTransactionCallback.java", - "com/sdk/IMySecondInterfaceCoreLibInfoAndBinderWrapper.java", - "com/sdk/IIntTransactionCallback.java", - "com/sdk/ICancellationSignal.java", - "com/sdk/ParcelableStackFrame.java", - "com/sdk/PrivacySandboxThrowableParcel.java", - ) + override val relativePathsToExpectedAidlClasses = + listOf( + "com/sdk/IMySdk.java", + "com/sdk/IMyInterface.java", + "com/sdk/IMySecondInterface.java", + "com/sdk/IMyInterfaceTransactionCallback.java", + "com/sdk/IMySecondInterfaceTransactionCallback.java", + "com/sdk/IMySecondInterfaceCoreLibInfoAndBinderWrapper.java", + "com/sdk/IIntTransactionCallback.java", + "com/sdk/ICancellationSignal.java", + "com/sdk/ParcelableStackFrame.java", + "com/sdk/PrivacySandboxThrowableParcel.java", + ) }
diff --git a/privacysandbox/tools/tools-apigenerator/src/test/java/androidx/privacysandbox/tools/apigenerator/PrimitivesApiGeneratorDiffTest.kt b/privacysandbox/tools/tools-apigenerator/src/test/java/androidx/privacysandbox/tools/apigenerator/PrimitivesApiGeneratorDiffTest.kt index ab5025f..681102e 100644 --- a/privacysandbox/tools/tools-apigenerator/src/test/java/androidx/privacysandbox/tools/apigenerator/PrimitivesApiGeneratorDiffTest.kt +++ b/privacysandbox/tools/tools-apigenerator/src/test/java/androidx/privacysandbox/tools/apigenerator/PrimitivesApiGeneratorDiffTest.kt
@@ -22,22 +22,23 @@ @RunWith(JUnit4::class) class PrimitivesApiGeneratorDiffTest : AbstractApiGeneratorDiffTest() { override val subdirectoryName = "primitives" - override val relativePathsToExpectedAidlClasses = listOf( - "com/mysdk/ITestSandboxSdk.java", - "com/mysdk/IBooleanTransactionCallback.java", - "com/mysdk/IBundleTransactionCallback.java", - "com/mysdk/ICancellationSignal.java", - "com/mysdk/IUnitTransactionCallback.java", - "com/mysdk/IListLongTransactionCallback.java", - "com/mysdk/IListDoubleTransactionCallback.java", - "com/mysdk/IListShortTransactionCallback.java", - "com/mysdk/IListStringTransactionCallback.java", - "com/mysdk/IListBooleanTransactionCallback.java", - "com/mysdk/IListBundleTransactionCallback.java", - "com/mysdk/IListFloatTransactionCallback.java", - "com/mysdk/IListCharTransactionCallback.java", - "com/mysdk/IListIntTransactionCallback.java", - "com/mysdk/ParcelableStackFrame.java", - "com/mysdk/PrivacySandboxThrowableParcel.java", - ) + override val relativePathsToExpectedAidlClasses = + listOf( + "com/mysdk/ITestSandboxSdk.java", + "com/mysdk/IBooleanTransactionCallback.java", + "com/mysdk/IBundleTransactionCallback.java", + "com/mysdk/ICancellationSignal.java", + "com/mysdk/IUnitTransactionCallback.java", + "com/mysdk/IListLongTransactionCallback.java", + "com/mysdk/IListDoubleTransactionCallback.java", + "com/mysdk/IListShortTransactionCallback.java", + "com/mysdk/IListStringTransactionCallback.java", + "com/mysdk/IListBooleanTransactionCallback.java", + "com/mysdk/IListBundleTransactionCallback.java", + "com/mysdk/IListFloatTransactionCallback.java", + "com/mysdk/IListCharTransactionCallback.java", + "com/mysdk/IListIntTransactionCallback.java", + "com/mysdk/ParcelableStackFrame.java", + "com/mysdk/PrivacySandboxThrowableParcel.java", + ) }
diff --git a/privacysandbox/tools/tools-apigenerator/src/test/java/androidx/privacysandbox/tools/apigenerator/TestUtils.kt b/privacysandbox/tools/tools-apigenerator/src/test/java/androidx/privacysandbox/tools/apigenerator/TestUtils.kt index fade128..4eb9dec 100644 --- a/privacysandbox/tools/tools-apigenerator/src/test/java/androidx/privacysandbox/tools/apigenerator/TestUtils.kt +++ b/privacysandbox/tools/tools-apigenerator/src/test/java/androidx/privacysandbox/tools/apigenerator/TestUtils.kt
@@ -30,7 +30,7 @@ * Compiles the given [sources] and creates a packaged SDK API descriptors jar. * * @param descriptorResources map of extra resources that will be added to descriptors jar keyed by - * their relative path. + * their relative path. */ fun compileIntoInterfaceDescriptorsJar( sources: List, @@ -47,24 +47,21 @@ writeBytes(contents) } } - PrivacySandboxApiPackager().packageSdkDescriptors( - outputClasspath, sdkInterfaceDescriptors - ) + PrivacySandboxApiPackager().packageSdkDescriptors(outputClasspath, sdkInterfaceDescriptors) return sdkInterfaceDescriptors } /** * Merges all class paths from a compilation result into a single one. * - * Room's compilation library returns different class paths for Kotlin and Java, so we need to - * merge them for tests that depend on the two. This is a naive implementation that simply - * overwrites classes that appear in multiple class paths. + * Room's compilation library returns different class paths for Kotlin and Java, so we need to merge + * them for tests that depend on the two. This is a naive implementation that simply overwrites + * classes that appear in multiple class paths. */ fun mergedClasspath(compilationResult: TestCompilationResult): Path { val outputClasspath = createTempDirectory("classpath").also { it.toFile().deleteOnExit() } - compilationResult.outputClasspath - .forEach { classpath -> - classpath.copyRecursively(outputClasspath.toFile(), overwrite = true) - } + compilationResult.outputClasspath.forEach { classpath -> + classpath.copyRecursively(outputClasspath.toFile(), overwrite = true) + } return outputClasspath }
diff --git a/privacysandbox/tools/tools-apigenerator/src/test/java/androidx/privacysandbox/tools/apigenerator/ValuesApiGeneratorDiffTest.kt b/privacysandbox/tools/tools-apigenerator/src/test/java/androidx/privacysandbox/tools/apigenerator/ValuesApiGeneratorDiffTest.kt index cbafae6..7e9a77c 100644 --- a/privacysandbox/tools/tools-apigenerator/src/test/java/androidx/privacysandbox/tools/apigenerator/ValuesApiGeneratorDiffTest.kt +++ b/privacysandbox/tools/tools-apigenerator/src/test/java/androidx/privacysandbox/tools/apigenerator/ValuesApiGeneratorDiffTest.kt
@@ -22,20 +22,21 @@ @RunWith(JUnit4::class) class ValuesApiGeneratorDiffTest : AbstractApiGeneratorDiffTest() { override val subdirectoryName = "values" - override val relativePathsToExpectedAidlClasses = listOf( - "com/sdkwithvalues/IMyInterface.java", - "com/sdkwithvalues/IMyUiInterface.java", - "com/sdkwithvalues/ISdkInterface.java", - "com/sdkwithvalues/ISdkResponseTransactionCallback.java", - "com/sdkwithvalues/IListSdkResponseTransactionCallback.java", - "com/sdkwithvalues/IRequestFlagTransactionCallback.java", - "com/sdkwithvalues/ParcelableInnerSdkValue.java", - "com/sdkwithvalues/ParcelableSdkRequest.java", - "com/sdkwithvalues/ParcelableSdkResponse.java", - "com/sdkwithvalues/ParcelableRequestFlag.java", - "com/sdkwithvalues/ICancellationSignal.java", - "com/sdkwithvalues/ParcelableStackFrame.java", - "com/sdkwithvalues/PrivacySandboxThrowableParcel.java", - "com/sdkwithvalues/IMyUiInterfaceCoreLibInfoAndBinderWrapper.java" - ) + override val relativePathsToExpectedAidlClasses = + listOf( + "com/sdkwithvalues/IMyInterface.java", + "com/sdkwithvalues/IMyUiInterface.java", + "com/sdkwithvalues/ISdkInterface.java", + "com/sdkwithvalues/ISdkResponseTransactionCallback.java", + "com/sdkwithvalues/IListSdkResponseTransactionCallback.java", + "com/sdkwithvalues/IRequestFlagTransactionCallback.java", + "com/sdkwithvalues/ParcelableInnerSdkValue.java", + "com/sdkwithvalues/ParcelableSdkRequest.java", + "com/sdkwithvalues/ParcelableSdkResponse.java", + "com/sdkwithvalues/ParcelableRequestFlag.java", + "com/sdkwithvalues/ICancellationSignal.java", + "com/sdkwithvalues/ParcelableStackFrame.java", + "com/sdkwithvalues/PrivacySandboxThrowableParcel.java", + "com/sdkwithvalues/IMyUiInterfaceCoreLibInfoAndBinderWrapper.java" + ) }
diff --git a/privacysandbox/tools/tools-apigenerator/src/test/java/androidx/privacysandbox/tools/apigenerator/VersionCompatibilityCheckTest.kt b/privacysandbox/tools/tools-apigenerator/src/test/java/androidx/privacysandbox/tools/apigenerator/VersionCompatibilityCheckTest.kt index ffed244..cbfb2ec 100644 --- a/privacysandbox/tools/tools-apigenerator/src/test/java/androidx/privacysandbox/tools/apigenerator/VersionCompatibilityCheckTest.kt +++ b/privacysandbox/tools/tools-apigenerator/src/test/java/androidx/privacysandbox/tools/apigenerator/VersionCompatibilityCheckTest.kt
@@ -29,9 +29,11 @@ @RunWith(JUnit4::class) class VersionCompatibilityCheckTest { - private val validSources = listOf( - Source.kotlin( - "com/mysdk/TestSandboxSdk.kt", """ + private val validSources = + listOf( + Source.kotlin( + "com/mysdk/TestSandboxSdk.kt", + """ package com.mysdk import androidx.privacysandbox.tools.PrivacySandboxService @PrivacySandboxService @@ -39,63 +41,61 @@ fun doSomething(number: Int) } """ + ) ) - ) private val validMetadataContent = Metadata.toolMetadata.toByteArray() @Test fun sdkDescriptorWithMissingMetadata_throws() { - assertThrows{ - runGeneratorWithResources(mapOf()) - }.hasMessageThat().contains("Missing tool metadata in SDK API descriptor") + assertThrows{ runGeneratorWithResources(mapOf()) } + .hasMessageThat() + .contains("Missing tool metadata in SDK API descriptor") } @Test fun sdkDescriptorWithMetadataInWrongPath_throws() { assertThrows{ - runGeneratorWithResources( - mapOf(Path("invalid/dir/metadata.pb") to validMetadataContent) - ) - }.hasMessageThat().contains("Missing tool metadata in SDK API descriptor") + runGeneratorWithResources( + mapOf(Path("invalid/dir/metadata.pb") to validMetadataContent) + ) + } + .hasMessageThat() + .contains("Missing tool metadata in SDK API descriptor") } @Test fun sdkDescriptorWithInvalidMetadataContent_throws() { assertThrows{ - runGeneratorWithResources( - mapOf(Metadata.filePath to "bogus data".toByteArray()) - ) - }.hasMessageThat().contains("Invalid Privacy Sandbox tool metadata") + runGeneratorWithResources(mapOf(Metadata.filePath to "bogus data".toByteArray())) + } + .hasMessageThat() + .contains("Invalid Privacy Sandbox tool metadata") } @Test fun sdkDescriptorWithIncompatibleVersion_throws() { - val sdkMetadata = ToolMetadata.newBuilder() - .setCodeGenerationVersion(999) - .build() + val sdkMetadata = ToolMetadata.newBuilder().setCodeGenerationVersion(999).build() assertThrows{ - runGeneratorWithResources( - mapOf(Metadata.filePath to sdkMetadata.toByteArray()) - ) - }.hasMessageThat().contains( - "SDK uses incompatible Privacy Sandbox tooling (version 999)" - ) + runGeneratorWithResources(mapOf(Metadata.filePath to sdkMetadata.toByteArray())) + } + .hasMessageThat() + .contains("SDK uses incompatible Privacy Sandbox tooling (version 999)") } @Test fun sdkDescriptorWithLowerVersion_isCompatible() { - val sdkMetadata = ToolMetadata.newBuilder() - .setCodeGenerationVersion(0) - .build() + val sdkMetadata = ToolMetadata.newBuilder().setCodeGenerationVersion(0).build() runGeneratorWithResources(mapOf(Metadata.filePath to sdkMetadata.toByteArray())) } private fun runGeneratorWithResources(resources: Map) { - val aidlCompilerPath = System.getProperty("aidl_compiler_path")?.let(::Path) - ?: throw IllegalArgumentException("aidl_compiler_path flag not set.") - val frameworkAidlPath = System.getProperty("framework_aidl_path")?.let(::Path) - ?: throw IllegalArgumentException("framework_aidl_path flag not set.") + val aidlCompilerPath = + System.getProperty("aidl_compiler_path")?.let(::Path) + ?: throw IllegalArgumentException("aidl_compiler_path flag not set.") + val frameworkAidlPath = + System.getProperty("framework_aidl_path")?.let(::Path) + ?: throw IllegalArgumentException("framework_aidl_path flag not set.") val descriptors = compileIntoInterfaceDescriptorsJar(validSources, resources) val generator = PrivacySandboxApiGenerator() val outputDir = Files.createTempDirectory("output").also { it.toFile().deleteOnExit() }
diff --git a/privacysandbox/tools/tools-apigenerator/src/test/java/androidx/privacysandbox/tools/apigenerator/parser/ApiStubParserTest.kt b/privacysandbox/tools/tools-apigenerator/src/test/java/androidx/privacysandbox/tools/apigenerator/parser/ApiStubParserTest.kt index a2ea583..b5f5e85 100644 --- a/privacysandbox/tools/tools-apigenerator/src/test/java/androidx/privacysandbox/tools/apigenerator/parser/ApiStubParserTest.kt +++ b/privacysandbox/tools/tools-apigenerator/src/test/java/androidx/privacysandbox/tools/apigenerator/parser/ApiStubParserTest.kt
@@ -40,9 +40,10 @@ class ApiStubParserTest { @Test fun annotatedInterface_isParsed() { - val source = Source.kotlin( - "com/mysdk/TestSandboxSdk.kt", - """ + val source = + Source.kotlin( + "com/mysdk/TestSandboxSdk.kt", + """ |package com.mysdk | |import androidx.privacysandbox.tools.PrivacySandboxCallback @@ -84,199 +85,203 @@ |interface CustomCallback { | fun onComplete(status: Int) |} - """.trimMargin(), - ) + """ + .trimMargin(), + ) - val expectedPayloadOption = AnnotatedEnumClass( - type = Type("com.mysdk", "PayloadOption"), - variants = listOf("SHAKEN", "STIRRED") - ) - val expectedPayloadType = AnnotatedDataClass( - type = Type("com.mysdk", "PayloadType"), - properties = listOf( - ValueProperty("size", Types.long), - ValueProperty("appId", Types.string), + val expectedPayloadOption = + AnnotatedEnumClass( + type = Type("com.mysdk", "PayloadOption"), + variants = listOf("SHAKEN", "STIRRED") ) - ) - val expectedPayloadRequest = AnnotatedDataClass( - type = Type("com.mysdk", "PayloadRequest"), - properties = listOf( - ValueProperty("type", expectedPayloadType.type), - ValueProperty("option", expectedPayloadOption.type) + val expectedPayloadType = + AnnotatedDataClass( + type = Type("com.mysdk", "PayloadType"), + properties = + listOf( + ValueProperty("size", Types.long), + ValueProperty("appId", Types.string), + ) ) - ) - val expectedPayloadResponse = AnnotatedDataClass( - type = Type("com.mysdk", "PayloadResponse"), - properties = listOf( - ValueProperty("url", Types.string), + val expectedPayloadRequest = + AnnotatedDataClass( + type = Type("com.mysdk", "PayloadRequest"), + properties = + listOf( + ValueProperty("type", expectedPayloadType.type), + ValueProperty("option", expectedPayloadOption.type) + ) ) - ) + val expectedPayloadResponse = + AnnotatedDataClass( + type = Type("com.mysdk", "PayloadResponse"), + properties = + listOf( + ValueProperty("url", Types.string), + ) + ) val expectedService = AnnotatedInterface( type = Type(packageName = "com.mysdk", simpleName = "MySdk"), - methods = listOf( - Method( - name = "doSomething", - parameters = listOf( - Parameter( - "magicNumber", - Types.int - ), - Parameter("awesomeString", Types.string.asNullable()) + methods = + listOf( + Method( + name = "doSomething", + parameters = + listOf( + Parameter("magicNumber", Types.int), + Parameter("awesomeString", Types.string.asNullable()) + ), + returnType = Types.unit, + isSuspend = false, ), - returnType = Types.unit, - isSuspend = false, - ), - Method( - name = "getInterface", - parameters = listOf(), - returnType = Type("com.mysdk", "MyInterface"), - isSuspend = true, - ), - Method( - name = "getPayload", - parameters = listOf( - Parameter( - "request", - expectedPayloadRequest.type - ) + Method( + name = "getInterface", + parameters = listOf(), + returnType = Type("com.mysdk", "MyInterface"), + isSuspend = true, ), - returnType = expectedPayloadResponse.type, - isSuspend = true, - ), - Method( - name = "getUiInterface", - parameters = listOf(), - returnType = Type("com.mysdk", "MyUiInterface"), - isSuspend = true, - ), - Method( - name = "processList", - parameters = listOf( - Parameter( - "list", - Types.list(Types.long) - ) + Method( + name = "getPayload", + parameters = listOf(Parameter("request", expectedPayloadRequest.type)), + returnType = expectedPayloadResponse.type, + isSuspend = true, ), - returnType = Types.list(Types.long), - isSuspend = true, - ), - ) - ) - val expectedInterfaces = listOf( - AnnotatedInterface( - type = Type(packageName = "com.mysdk", simpleName = "MyInterface"), - methods = listOf( - Method( - name = "getMorePayload", - parameters = listOf( - Parameter( - "request", - expectedPayloadRequest.type - ) + Method( + name = "getUiInterface", + parameters = listOf(), + returnType = Type("com.mysdk", "MyUiInterface"), + isSuspend = true, ), - returnType = expectedPayloadResponse.type, - isSuspend = true, + Method( + name = "processList", + parameters = listOf(Parameter("list", Types.list(Types.long))), + returnType = Types.list(Types.long), + isSuspend = true, + ), ) - ) - ), - AnnotatedInterface( - type = Type(packageName = "com.mysdk", simpleName = "MyUiInterface"), - superTypes = listOf(Types.sandboxedUiAdapter), - methods = listOf(), - ), - ) - val expectedCallback = AnnotatedInterface( - type = Type(packageName = "com.mysdk", simpleName = "CustomCallback"), - methods = listOf( - Method( - name = "onComplete", - parameters = listOf( - Parameter( - "status", - Types.int - ), - ), - returnType = Types.unit, - isSuspend = false, + ) + val expectedInterfaces = + listOf( + AnnotatedInterface( + type = Type(packageName = "com.mysdk", simpleName = "MyInterface"), + methods = + listOf( + Method( + name = "getMorePayload", + parameters = + listOf(Parameter("request", expectedPayloadRequest.type)), + returnType = expectedPayloadResponse.type, + isSuspend = true, + ) + ) + ), + AnnotatedInterface( + type = Type(packageName = "com.mysdk", simpleName = "MyUiInterface"), + superTypes = listOf(Types.sandboxedUiAdapter), + methods = listOf(), ), ) - ) + val expectedCallback = + AnnotatedInterface( + type = Type(packageName = "com.mysdk", simpleName = "CustomCallback"), + methods = + listOf( + Method( + name = "onComplete", + parameters = + listOf( + Parameter("status", Types.int), + ), + returnType = Types.unit, + isSuspend = false, + ), + ) + ) val actualApi = compileAndParseApi(source) assertThat(actualApi.services).containsExactly(expectedService) - assertThat(actualApi.values).containsExactly( - expectedPayloadType, - expectedPayloadRequest, - expectedPayloadResponse, - expectedPayloadOption, - ) + assertThat(actualApi.values) + .containsExactly( + expectedPayloadType, + expectedPayloadRequest, + expectedPayloadResponse, + expectedPayloadOption, + ) assertThat(actualApi.callbacks).containsExactly(expectedCallback) assertThat(actualApi.interfaces).containsExactlyElementsIn(expectedInterfaces) } @Test fun nonAnnotatedClasses_areSafelyIgnored() { - val interfaces = compileAndParseApi( - Source.kotlin( - "com/mysdk/TestSandboxSdk.kt", """ + val interfaces = + compileAndParseApi( + Source.kotlin( + "com/mysdk/TestSandboxSdk.kt", + """ package com.mysdk import androidx.privacysandbox.tools.PrivacySandboxService @PrivacySandboxService interface MySdk """ - ), Source.kotlin( - "com/mysdk/NonAnnotatedInterface.kt", """ + ), + Source.kotlin( + "com/mysdk/NonAnnotatedInterface.kt", + """ package com.mysdk interface NonAnnotatedInterface """ - ), Source.kotlin( - "com/mysdk/NonAnnotatedClass.kt", """ + ), + Source.kotlin( + "com/mysdk/NonAnnotatedClass.kt", + """ package com.mysdk class NonAnnotatedClass """ - ), Source.java( - "com/mysdk/NonAnnotatedJavaClass", """ + ), + Source.java( + "com/mysdk/NonAnnotatedJavaClass", + """ package com.mysdk; class NonAnnotatedJavaClass {} """ - ) - ).services + ) + ) + .services - assertThat(interfaces).containsExactly( - AnnotatedInterface( - Type( - packageName = "com.mysdk", - simpleName = "MySdk", + assertThat(interfaces) + .containsExactly( + AnnotatedInterface( + Type( + packageName = "com.mysdk", + simpleName = "MySdk", + ) ) ) - ) } @Test fun annotatedInterfaceWithEmptyPackageName_isHandledSafely() { - val source = Source.kotlin( - "TestSandboxSdk.kt", """ + val source = + Source.kotlin( + "TestSandboxSdk.kt", + """ import androidx.privacysandbox.tools.PrivacySandboxService @PrivacySandboxService interface MySdk """ - ) - - assertThat(compileAndParseApi(source).services).containsExactly( - AnnotatedInterface( - Type( - packageName = "", - simpleName = "MySdk" - ) ) - ) + + assertThat(compileAndParseApi(source).services) + .containsExactly(AnnotatedInterface(Type(packageName = "", simpleName = "MySdk"))) } @Test fun sandboxedUiAdapter_correctlyDetectedInService() { - val source = Source.kotlin( - "com/mysdk/MySdk.kt", """ + val source = + Source.kotlin( + "com/mysdk/MySdk.kt", + """ import androidx.privacysandbox.tools.PrivacySandboxService import androidx.privacysandbox.activity.core.SdkActivityLauncher @PrivacySandboxService @@ -284,15 +289,17 @@ fun useLauncher(launcher: SdkActivityLauncher) } """ - ) + ) assertThat(compileAndParseApi(source).containsSdkActivityLauncher()).isTrue() } @Test fun sandboxedUiAdapter_correctlyDetectedInInterface() { - val source = Source.kotlin( - "com/mysdk/MySdk.kt", """ + val source = + Source.kotlin( + "com/mysdk/MySdk.kt", + """ import androidx.privacysandbox.tools.PrivacySandboxService import androidx.privacysandbox.tools.PrivacySandboxInterface import androidx.privacysandbox.activity.core.SdkActivityLauncher @@ -304,15 +311,17 @@ fun useLauncher(launcher: SdkActivityLauncher) } """ - ) + ) assertThat(compileAndParseApi(source).containsSdkActivityLauncher()).isTrue() } @Test fun sandboxedUiAdapter_correctlyDetectedInCallback() { - val source = Source.kotlin( - "com/mysdk/MySdk.kt", """ + val source = + Source.kotlin( + "com/mysdk/MySdk.kt", + """ import androidx.privacysandbox.tools.PrivacySandboxService import androidx.privacysandbox.tools.PrivacySandboxCallback import androidx.privacysandbox.activity.core.SdkActivityLauncher @@ -324,15 +333,17 @@ fun useLauncher(launcher: SdkActivityLauncher) } """ - ) + ) assertThat(compileAndParseApi(source).containsSdkActivityLauncher()).isTrue() } @Test fun sandboxedUiAdapter_correctlyDetectedInValue() { - val source = Source.kotlin( - "com/mysdk/MySdk.kt", """ + val source = + Source.kotlin( + "com/mysdk/MySdk.kt", + """ import androidx.privacysandbox.tools.PrivacySandboxService import androidx.privacysandbox.tools.PrivacySandboxValue import androidx.privacysandbox.activity.core.SdkActivityLauncher @@ -342,15 +353,17 @@ @PrivacySandboxValue data class MyValue(val launcher: SdkActivityLauncher) """ - ) + ) assertThat(compileAndParseApi(source).containsSdkActivityLauncher()).isTrue() } @Test fun sandboxedUiAdapter_notDetectedWhenNotPresent() { - val source = Source.kotlin( - "com/mysdk/MySdk.kt", """ + val source = + Source.kotlin( + "com/mysdk/MySdk.kt", + """ import androidx.privacysandbox.tools.PrivacySandboxService // Deliberate unused import import androidx.privacysandbox.activity.core.SdkActivityLauncher @@ -359,52 +372,58 @@ fun doStuff(input: String) } """ - ) + ) assertThat(compileAndParseApi(source).containsSdkActivityLauncher()).isFalse() } @Test fun nonKotlinAnnotatedInterface_throws() { - val source = Source.java( - "com/mysdk/MySdk", """ + val source = + Source.java( + "com/mysdk/MySdk", + """ package com.mysdk; import androidx.privacysandbox.tools.PrivacySandboxService; @PrivacySandboxService interface MySdk {} """ - ) + ) - assertThrows{ - compileAndParseApi(source) - }.hasMessageThat().contains( - "Missing Kotlin metadata annotation in com/mysdk/MySdk. Is this a valid Kotlin class?" - ) + assertThrows{ compileAndParseApi(source) } + .hasMessageThat() + .contains( + "Missing Kotlin metadata annotation in com/mysdk/MySdk. Is this a valid Kotlin class?" + ) } @Test fun kotlinClassAnnotatedAsService_throws() { - val source = Source.kotlin( - "com/mysdk/TestSandboxSdk.kt", """ + val source = + Source.kotlin( + "com/mysdk/TestSandboxSdk.kt", + """ package com.mysdk import androidx.privacysandbox.tools.PrivacySandboxService @PrivacySandboxService class MySdk """ - ) + ) - assertThrows{ - compileAndParseApi(source) - }.hasMessageThat().contains( - "com.mysdk.MySdk is not a Kotlin interface but it's annotated with " + - "@PrivacySandboxService" - ) + assertThrows{ compileAndParseApi(source) } + .hasMessageThat() + .contains( + "com.mysdk.MySdk is not a Kotlin interface but it's annotated with " + + "@PrivacySandboxService" + ) } @Test fun nonDataClassAnnotatedAsValue_throws() { - val source = Source.kotlin( - "com/mysdk/TestSandboxSdk.kt", """ + val source = + Source.kotlin( + "com/mysdk/TestSandboxSdk.kt", + """ package com.mysdk import androidx.privacysandbox.tools.PrivacySandboxService import androidx.privacysandbox.tools.PrivacySandboxValue @@ -413,20 +432,22 @@ @PrivacySandboxValue class Value """ - ) + ) - assertThrows{ - compileAndParseApi(source) - }.hasMessageThat().contains( - "com.mysdk.Value is not a Kotlin data class or enum class but it's annotated with " + - "@PrivacySandboxValue" - ) + assertThrows{ compileAndParseApi(source) } + .hasMessageThat() + .contains( + "com.mysdk.Value is not a Kotlin data class or enum class but it's annotated with " + + "@PrivacySandboxValue" + ) } @Test fun interfaceAnnotatedAsValue_throws() { - val source = Source.kotlin( - "com/mysdk/TestSandboxSdk.kt", """ + val source = + Source.kotlin( + "com/mysdk/TestSandboxSdk.kt", + """ package com.mysdk import androidx.privacysandbox.tools.PrivacySandboxService import androidx.privacysandbox.tools.PrivacySandboxValue @@ -435,20 +456,22 @@ @PrivacySandboxValue interface Value """ - ) + ) - assertThrows{ - compileAndParseApi(source) - }.hasMessageThat().contains( - "com.mysdk.Value is not a Kotlin data class or enum class but it's annotated with " + - "@PrivacySandboxValue" - ) + assertThrows{ compileAndParseApi(source) } + .hasMessageThat() + .contains( + "com.mysdk.Value is not a Kotlin data class or enum class but it's annotated with " + + "@PrivacySandboxValue" + ) } @Test fun valueWithMutableProperties_throws() { - val source = Source.kotlin( - "com/mysdk/TestSandboxSdk.kt", """ + val source = + Source.kotlin( + "com/mysdk/TestSandboxSdk.kt", + """ package com.mysdk import androidx.privacysandbox.tools.PrivacySandboxService import androidx.privacysandbox.tools.PrivacySandboxValue @@ -457,20 +480,22 @@ @PrivacySandboxValue data class Value(var message: String) """ - ) + ) - assertThrows{ - compileAndParseApi(source) - }.hasMessageThat().contains( - "Error in com.mysdk.Value.message: mutable properties are not allowed in data " + - "classes annotated with @PrivacySandboxValue." - ) + assertThrows{ compileAndParseApi(source) } + .hasMessageThat() + .contains( + "Error in com.mysdk.Value.message: mutable properties are not allowed in data " + + "classes annotated with @PrivacySandboxValue." + ) } @Test fun annotatedKotlinInnerInterface_throws() { - val source = Source.kotlin( - "com/mysdk/OuterMySdk.kt", """ + val source = + Source.kotlin( + "com/mysdk/OuterMySdk.kt", + """ package com.mysdk import androidx.privacysandbox.tools.PrivacySandboxService interface OuterMySdk { @@ -478,36 +503,38 @@ interface InnerMySdk } """ - ) + ) - assertThrows{ - compileAndParseApi(source) - }.hasMessageThat().contains( - "Error in com.mysdk.OuterMySdk.InnerMySdk: Inner types are not supported in API " + - "definitions" - ) + assertThrows{ compileAndParseApi(source) } + .hasMessageThat() + .contains( + "Error in com.mysdk.OuterMySdk.InnerMySdk: Inner types are not supported in API " + + "definitions" + ) } @Test fun missingAnnotatedInterface_throws() { - val source = Source.kotlin( - "com/mysdk/TestSandboxSdk.kt", """ + val source = + Source.kotlin( + "com/mysdk/TestSandboxSdk.kt", + """ package com.mysdk interface MySdk """ - ) + ) - assertThrows{ - compileAndParseApi(source) - }.hasMessageThat().contains( - "Unable to find valid interfaces annotated with @PrivacySandboxService." - ) + assertThrows{ compileAndParseApi(source) } + .hasMessageThat() + .contains("Unable to find valid interfaces annotated with @PrivacySandboxService.") } @Test fun enumClassImplementingInterface_throws() { - val source = Source.kotlin( - "com/mysdk/TestSandboxSdk.kt", """ + val source = + Source.kotlin( + "com/mysdk/TestSandboxSdk.kt", + """ package com.mysdk import androidx.privacysandbox.tools.PrivacySandboxService import androidx.privacysandbox.tools.PrivacySandboxValue @@ -520,14 +547,14 @@ BAR, } """ - ) + ) - assertThrows{ - compileAndParseApi(source) - }.hasMessageThat().contains( - "Error in com.mysdk.MyEnum: values annotated with @PrivacySandboxValue " + - "may not inherit other types (MyCustomInterface)" - ) + assertThrows{ compileAndParseApi(source) } + .hasMessageThat() + .contains( + "Error in com.mysdk.MyEnum: values annotated with @PrivacySandboxValue " + + "may not inherit other types (MyCustomInterface)" + ) } private fun compileAndParseApi(vararg sources: Source): ParsedApi {
diff --git a/privacysandbox/tools/tools-apipackager/src/main/java/androidx/privacysandbox/tools/apipackager/AnnotationInspector.kt b/privacysandbox/tools/tools-apipackager/src/main/java/androidx/privacysandbox/tools/apipackager/AnnotationInspector.kt index 6b0bafd..b79d2c0 100644 --- a/privacysandbox/tools/tools-apipackager/src/main/java/androidx/privacysandbox/tools/apipackager/AnnotationInspector.kt +++ b/privacysandbox/tools/tools-apipackager/src/main/java/androidx/privacysandbox/tools/apipackager/AnnotationInspector.kt
@@ -30,13 +30,14 @@ import org.objectweb.asm.Type internal object AnnotationInspector { - private val privacySandboxAnnotations = setOf( - PrivacySandboxCallback::class, - PrivacySandboxInterface::class, - PrivacySandboxService::class, - PrivacySandboxValue::class, - GeneratedPublicApi::class, - ) + private val privacySandboxAnnotations = + setOf( + PrivacySandboxCallback::class, + PrivacySandboxInterface::class, + PrivacySandboxService::class, + PrivacySandboxValue::class, + GeneratedPublicApi::class, + ) fun hasPrivacySandboxAnnotation(classFile: Path): Boolean { val reader = ClassReader(classFile.readBytes())
diff --git a/privacysandbox/tools/tools-apipackager/src/main/java/androidx/privacysandbox/tools/apipackager/PrivacySandboxApiPackager.kt b/privacysandbox/tools/tools-apipackager/src/main/java/androidx/privacysandbox/tools/apipackager/PrivacySandboxApiPackager.kt index 8471190..8f967a8 100644 --- a/privacysandbox/tools/tools-apipackager/src/main/java/androidx/privacysandbox/tools/apipackager/PrivacySandboxApiPackager.kt +++ b/privacysandbox/tools/tools-apipackager/src/main/java/androidx/privacysandbox/tools/apipackager/PrivacySandboxApiPackager.kt
@@ -33,11 +33,11 @@ * Extracts API descriptors from SDKs annotated with Privacy Sandbox annotations. * * This function will output a file with SDK interface descriptors, which can later be used to - * generate the client-side sources for communicating with this SDK over IPC through the - * privacy sandbox. + * generate the client-side sources for communicating with this SDK over IPC through the privacy + * sandbox. * * @param sdkClasspath path to the root directory that contains the SDK's compiled classes. - * Non-class files will be safely ignored. + * Non-class files will be safely ignored. * @param sdkInterfaceDescriptorsOutput output path for SDK Interface descriptors file. */ fun packageSdkDescriptors( @@ -51,13 +51,16 @@ "$sdkInterfaceDescriptorsOutput already exists." } - val outputFile = sdkInterfaceDescriptorsOutput.toFile().also { - it.parentFile.mkdirs() - it.createNewFile() - } + val outputFile = + sdkInterfaceDescriptorsOutput.toFile().also { + it.parentFile.mkdirs() + it.createNewFile() + } ZipOutputStream(outputFile.outputStream()).use { zipOutputStream -> - sdkClasspath.toFile().walk() + sdkClasspath + .toFile() + .walk() .map { it.toPath() } .filter { shouldKeepFile(sdkClasspath, it) } .forEach { file ->
diff --git a/privacysandbox/tools/tools-apipackager/src/test/java/androidx/privacysandbox/tools/apipackager/PrivacySandboxApiPackagerTest.kt b/privacysandbox/tools/tools-apipackager/src/test/java/androidx/privacysandbox/tools/apipackager/PrivacySandboxApiPackagerTest.kt index ba20a08..2301a5b 100644 --- a/privacysandbox/tools/tools-apipackager/src/test/java/androidx/privacysandbox/tools/apipackager/PrivacySandboxApiPackagerTest.kt +++ b/privacysandbox/tools/tools-apipackager/src/test/java/androidx/privacysandbox/tools/apipackager/PrivacySandboxApiPackagerTest.kt
@@ -41,9 +41,11 @@ @Test fun validSdkClasspath_onlyAnnotatedClassesAreReturned() { - val packagedSdkClasspath = compileAndReturnUnzippedPackagedClasspath( - Source.kotlin( - "com/mysdk/TestSandboxSdk.kt", """ + val packagedSdkClasspath = + compileAndReturnUnzippedPackagedClasspath( + Source.kotlin( + "com/mysdk/TestSandboxSdk.kt", + """ |package com.mysdk | |import androidx.privacysandbox.tools.PrivacySandboxCallback @@ -64,27 +66,32 @@ |} | |data class DataClassThatShouldBeIgnored(val id: Int) - """.trimMargin() + """ + .trimMargin() + ) ) - ) - val relativeDescriptorPaths = packagedSdkClasspath - .walk() - .filter { it.isFile } - .map { packagedSdkClasspath.toPath().relativize(it.toPath()).toString() } - .toList() - assertThat(relativeDescriptorPaths).containsExactly( - "com/mysdk/MySdk.class", - "com/mysdk/MySdkCallback.class", - "com/mysdk/Value.class", - ) + val relativeDescriptorPaths = + packagedSdkClasspath + .walk() + .filter { it.isFile } + .map { packagedSdkClasspath.toPath().relativize(it.toPath()).toString() } + .toList() + assertThat(relativeDescriptorPaths) + .containsExactly( + "com/mysdk/MySdk.class", + "com/mysdk/MySdkCallback.class", + "com/mysdk/Value.class", + ) } @Test fun validSdkClasspath_packagedDescriptorsCanBeLinkedAgainst() { - val packagedSdkClasspath = compileAndReturnUnzippedPackagedClasspath( - Source.kotlin( - "com/mysdk/TestSandboxSdk.kt", """ + val packagedSdkClasspath = + compileAndReturnUnzippedPackagedClasspath( + Source.kotlin( + "com/mysdk/TestSandboxSdk.kt", + """ |package com.mysdk | |import androidx.privacysandbox.tools.PrivacySandboxCallback @@ -105,13 +112,15 @@ |object MySdkFactory { | fun wrapToMySdk(): MySdk = throw RuntimeException("Stub!") |} - """.trimMargin() + """ + .trimMargin() + ) ) - ) val appSource = Source.kotlin( - "com/exampleapp/App.kt", """ + "com/exampleapp/App.kt", + """ |package com.exampleapp | |import com.mysdk.MySdk @@ -124,39 +133,42 @@ | val sdkValue: Value, | val callback: MySdkCallback, |) - """.trimMargin() + """ + .trimMargin() ) assertThat(compileWithExtraClasspath(appSource, packagedSdkClasspath)).succeeds() } + @Test fun sdkClasspathWithMetadataFile_isKeptInDescriptor() { - val metadata = ToolMetadata.newBuilder() - .setCodeGenerationVersion(42) - .build() - val source = Source.kotlin( - "com/mysdk/Valid.kt", """ + val metadata = ToolMetadata.newBuilder().setCodeGenerationVersion(42).build() + val source = + Source.kotlin( + "com/mysdk/Valid.kt", + """ |package com.mysdk |interface Valid - """.trimMargin() - ) - val sdkClasspath = compileAll(listOf(source)) - .outputClasspath.first().toPath() + """ + .trimMargin() + ) + val sdkClasspath = compileAll(listOf(source)).outputClasspath.first().toPath() - val metadataPath = sdkClasspath.resolve(Metadata.filePath).also { - it.parent.createDirectories() - it.createFile() - } + val metadataPath = + sdkClasspath.resolve(Metadata.filePath).also { + it.parent.createDirectories() + it.createFile() + } metadata.writeTo(metadataPath.outputStream()) val sdkDescriptor = makeTestDirectory().resolve("sdk-descriptors.jar") PrivacySandboxApiPackager().packageSdkDescriptors(sdkClasspath, sdkDescriptor) val packagedMetadata = ZipInputStream(sdkDescriptor.inputStream()).use { input -> - generateSequence { input.nextEntry } - .filter { it.name == Metadata.filePath.toString() } - .map { ToolMetadata.parseFrom(input.readAllBytes()) } - .toList() - } + generateSequence { input.nextEntry } + .filter { it.name == Metadata.filePath.toString() } + .map { ToolMetadata.parseFrom(input.readAllBytes()) } + .toList() + } assertThat(packagedMetadata).containsExactly(metadata) } @@ -166,43 +178,39 @@ val invalidClasspathFile = makeTestDirectory().resolve("dir_that_does_not_exist") val validSdkDescriptor = makeTestDirectory().resolve("sdk-descriptors.jar") assertThrows{ - PrivacySandboxApiPackager().packageSdkDescriptors( - invalidClasspathFile, validSdkDescriptor - ) + PrivacySandboxApiPackager() + .packageSdkDescriptors(invalidClasspathFile, validSdkDescriptor) } } @Test fun sdkClasspathNotADirectory_throwException() { - val invalidClasspathFile = makeTestDirectory().resolve("invalid-file.txt").also { - it.createFile() - } + val invalidClasspathFile = + makeTestDirectory().resolve("invalid-file.txt").also { it.createFile() } val validSdkDescriptor = makeTestDirectory().resolve("sdk-descriptors.jar") assertThrows{ - PrivacySandboxApiPackager().packageSdkDescriptors( - invalidClasspathFile, validSdkDescriptor - ) + PrivacySandboxApiPackager() + .packageSdkDescriptors(invalidClasspathFile, validSdkDescriptor) } } @Test fun outputAlreadyExists_throwException() { - val source = Source.kotlin( - "com/mysdk/Valid.kt", """ + val source = + Source.kotlin( + "com/mysdk/Valid.kt", + """ |package com.mysdk |interface Valid - """.trimMargin() - ) - val sdkClasspath = compileAll(listOf(source)) - .outputClasspath.first().toPath() - val descriptorPathThatAlreadyExists = - makeTestDirectory().resolve("sdk-descriptors.jar").also { - it.createFile() - } - assertThrows{ - PrivacySandboxApiPackager().packageSdkDescriptors( - sdkClasspath, descriptorPathThatAlreadyExists + """ + .trimMargin() ) + val sdkClasspath = compileAll(listOf(source)).outputClasspath.first().toPath() + val descriptorPathThatAlreadyExists = + makeTestDirectory().resolve("sdk-descriptors.jar").also { it.createFile() } + assertThrows{ + PrivacySandboxApiPackager() + .packageSdkDescriptors(sdkClasspath, descriptorPathThatAlreadyExists) } } @@ -230,14 +238,13 @@ } private fun makeTestDirectory(): Path { - return Files.createTempDirectory("test") - .also { - it.toFile().deleteOnExit() - } + return Files.createTempDirectory("test").also { it.toFile().deleteOnExit() } } - private fun compileWithExtraClasspath(source: Source, extraClasspath: File): - TestCompilationResult { + private fun compileWithExtraClasspath( + source: Source, + extraClasspath: File + ): TestCompilationResult { return compileAll( listOf(source), extraClasspath = listOf(extraClasspath),
diff --git a/privacysandbox/tools/tools-core/src/main/java/androidx/privacysandbox/tools/core/Metadata.kt b/privacysandbox/tools/tools-core/src/main/java/androidx/privacysandbox/tools/core/Metadata.kt index 3fd042f..e4ed12c 100644 --- a/privacysandbox/tools/tools-core/src/main/java/androidx/privacysandbox/tools/core/Metadata.kt +++ b/privacysandbox/tools/tools-core/src/main/java/androidx/privacysandbox/tools/core/Metadata.kt
@@ -22,10 +22,7 @@ /** Privacy Sandbox Tool metadata constants. */ object Metadata { /** Tool metadata message. It's serialized and stored in every SDK API descriptor. */ - val toolMetadata: ToolMetadata = - ToolMetadata.newBuilder() - .setCodeGenerationVersion(3) - .build() + val toolMetadata: ToolMetadata = ToolMetadata.newBuilder().setCodeGenerationVersion(3).build() /** Relative path to metadata file in SDK API descriptor jar. */ val filePath = Path("META-INF/privacysandbox/tool-metadata.pb")
diff --git a/privacysandbox/tools/tools-core/src/main/java/androidx/privacysandbox/tools/core/generator/AidlCompiler.kt b/privacysandbox/tools/tools-core/src/main/java/androidx/privacysandbox/tools/core/generator/AidlCompiler.kt index a4f989d..f8a2ccf 100644 --- a/privacysandbox/tools/tools-core/src/main/java/androidx/privacysandbox/tools/core/generator/AidlCompiler.kt +++ b/privacysandbox/tools/tools-core/src/main/java/androidx/privacysandbox/tools/core/generator/AidlCompiler.kt
@@ -33,12 +33,13 @@ // TODO(b/269458005): Remove this fallback and make frameworkAidlPath non-nullable // (dependent on our callers always providing the argument) val bundleFile = Files.createTempFile("bundle", "aidl") - val preProcessedAidlPath = if (frameworkAidlPath != null) { - frameworkAidlPath - } else { - bundleFile.writeText("parcelable android.os.Bundle;") - bundleFile.toAbsolutePath() - } + val preProcessedAidlPath = + if (frameworkAidlPath != null) { + frameworkAidlPath + } else { + bundleFile.writeText("parcelable android.os.Bundle;") + bundleFile.toAbsolutePath() + } try { val command = @@ -72,7 +73,9 @@ private fun getProcessErrors(process: Process): String { try { process.errorStream.bufferedReader().use { outputReader -> - return outputReader.lines().toArray() + return outputReader + .lines() + .toArray() .joinToString(separator = "\n\t", prefix = "\n\t") } } catch (e: IOException) {
diff --git a/privacysandbox/tools/tools-core/src/main/java/androidx/privacysandbox/tools/core/generator/AidlGenerator.kt b/privacysandbox/tools/tools-core/src/main/java/androidx/privacysandbox/tools/core/generator/AidlGenerator.kt index 8afb3a1..27654bc 100644 --- a/privacysandbox/tools/tools-core/src/main/java/androidx/privacysandbox/tools/core/generator/AidlGenerator.kt +++ b/privacysandbox/tools/tools-core/src/main/java/androidx/privacysandbox/tools/core/generator/AidlGenerator.kt
@@ -39,7 +39,8 @@ import java.nio.file.Path import java.nio.file.Paths -class AidlGenerator private constructor( +class AidlGenerator +private constructor( private val aidlCompiler: AidlCompiler, private val api: ParsedApi, private val workingDir: Path, @@ -69,13 +70,14 @@ private fun generateAidlInterfaces(): List{ workingDir.toFile().ensureDirectory() - val aidlSources = generateAidlContent().map { - val aidlFile = getAidlFile(workingDir, it) - aidlFile.parentFile.mkdirs() - aidlFile.createNewFile() - aidlFile.writeText(it.getFileContent()) - GeneratedSource(it.type.packageName, it.type.simpleName, aidlFile) - } + val aidlSources = + generateAidlContent().map { + val aidlFile = getAidlFile(workingDir, it) + aidlFile.parentFile.mkdirs() + aidlFile.createNewFile() + aidlFile.writeText(it.getFileContent()) + GeneratedSource(it.type.packageName, it.type.simpleName, aidlFile) + } return aidlSources } @@ -83,9 +85,7 @@ aidlCompiler.compile(workingDir, aidlSources.map { it.file.toPath() }) val javaSources = aidlSources.map { it.copy(file = getJavaFileForAidlFile(it.file)) } javaSources.forEach { - check(it.file.exists()) { - "Missing AIDL compilation output ${it.file.absolutePath}" - } + check(it.file.exists()) { "Missing AIDL compilation output ${it.file.absolutePath}" } } return javaSources } @@ -96,19 +96,16 @@ val customCallbacks = api.callbacks.flatMap(::aidlInterface) val interfaces = api.interfaces.flatMap(::aidlInterface) val suspendFunctionUtilities = generateSuspendFunctionUtilities() - return suspendFunctionUtilities + - service + - values + - customCallbacks + - interfaces + return suspendFunctionUtilities + service + values + customCallbacks + interfaces } private fun aidlInterface(annotatedInterface: AnnotatedInterface): List{ - val interfaceFile = aidlInterface( - Type(annotatedInterface.type.packageName, annotatedInterface.aidlName()) - ) { - annotatedInterface.methods.forEach { addMethod(it) } - } + val interfaceFile = + aidlInterface( + Type(annotatedInterface.type.packageName, annotatedInterface.aidlName()) + ) { + annotatedInterface.methods.forEach { addMethod(it) } + } return buildList { if (annotatedInterface.inheritsSandboxedUiAdapter) { @@ -137,9 +134,7 @@ } private fun AidlMethodSpec.Builder.addParameter(parameter: Parameter) { - check(parameter.type != Types.unit) { - "Void cannot be a parameter type." - } + check(parameter.type != Types.unit) { "Void cannot be a parameter type." } val aidlType = getAidlTypeDeclaration(parameter.type) addParameter(parameter.name, aidlType) @@ -158,7 +153,8 @@ return annotatedInterfaces .flatMap(AnnotatedInterface::methods) .filter(Method::isSuspend) - .map { wrapWithListIfNeeded(it.returnType) }.toSet() + .map { wrapWithListIfNeeded(it.returnType) } + .toSet() .map { generateTransactionCallback(it) } } @@ -181,9 +177,8 @@ } } - private fun generateICancellationSignal() = aidlInterface(cancellationSignalType().innerType) { - addMethod("cancel") - } + private fun generateICancellationSignal() = + aidlInterface(cancellationSignalType().innerType) { addMethod("cancel") } private fun generateParcelableFailure(): AidlFileSpec { return aidlParcelable(throwableParcelType()) { @@ -223,7 +218,6 @@ when (value) { is AnnotatedEnumClass -> addProperty("variant_ordinal", getAidlTypeDeclaration(Types.int)) - is AnnotatedDataClass -> for (property in value.properties) { addProperty(property.name, getAidlTypeDeclaration(property.type)) @@ -231,11 +225,13 @@ } } - private fun getAidlFile(rootPath: Path, aidlSource: AidlFileSpec) = Paths.get( - rootPath.toString(), - *aidlSource.type.packageName.split(".").toTypedArray(), - aidlSource.type.simpleName + ".aidl" - ).toFile() + private fun getAidlFile(rootPath: Path, aidlSource: AidlFileSpec) = + Paths.get( + rootPath.toString(), + *aidlSource.type.packageName.split(".").toTypedArray(), + aidlSource.type.simpleName + ".aidl" + ) + .toFile() private fun getJavaFileForAidlFile(aidlFile: File): File { check(aidlFile.extension == "aidl") { @@ -245,17 +241,16 @@ } private fun packageName() = api.getOnlyService().type.packageName + private fun cancellationSignalType() = AidlTypeSpec(Type(packageName(), cancellationSignalName), kind = AidlTypeKind.INTERFACE) private fun throwableParcelType() = Type(packageName(), throwableParcelName) + private fun parcelableStackFrameType() = Type(packageName(), parcelableStackFrameName) + private val bundleType = Type("android.os", "Bundle") - private val bundleAidlType = - AidlTypeSpec( - bundleType, - AidlTypeKind.PARCELABLE - ) + private val bundleAidlType = AidlTypeSpec(bundleType, AidlTypeKind.PARCELABLE) private fun transactionCallback(type: Type) = AidlTypeSpec( @@ -265,8 +260,12 @@ private fun getAidlTypeDeclaration(rawType: Type): AidlTypeSpec { val type = wrapWithListIfNeeded(rawType) - api.valueMap[type]?.let { return it.aidlType() } - api.callbackMap[type]?.let { return it.aidlType() } + api.valueMap[type]?.let { + return it.aidlType() + } + api.callbackMap[type]?.let { + return it.aidlType() + } api.interfaceMap[type]?.let { if (it.inheritsSandboxedUiAdapter) { return AidlTypeSpec(it.uiAdapterAidlWrapper(), kind = AidlTypeKind.PARCELABLE) @@ -287,9 +286,8 @@ List::class.qualifiedName -> getAidlTypeDeclaration(type.typeParameters[0]).listSpec() Types.bundle.qualifiedName -> bundleAidlType Types.sdkActivityLauncher.qualifiedName -> bundleAidlType - else -> throw IllegalArgumentException( - "Unsupported type conversion ${type.qualifiedName}" - ) + else -> + throw IllegalArgumentException("Unsupported type conversion ${type.qualifiedName}") } } } @@ -297,12 +295,8 @@ data class GeneratedSource(val packageName: String, val interfaceName: String, val file: File) internal fun File.ensureDirectory() { - check(exists()) { - "$this doesn't exist" - } - check(isDirectory) { - "$this is not a directory" - } + check(exists()) { "$this doesn't exist" } + check(isDirectory) { "$this is not a directory" } } fun AnnotatedInterface.aidlName(): String = "I${type.simpleName}"
diff --git a/privacysandbox/tools/tools-core/src/main/java/androidx/privacysandbox/tools/core/generator/BinderCodeConverter.kt b/privacysandbox/tools/tools-core/src/main/java/androidx/privacysandbox/tools/core/generator/BinderCodeConverter.kt index 406e9c0..57678c7 100644 --- a/privacysandbox/tools/tools-core/src/main/java/androidx/privacysandbox/tools/core/generator/BinderCodeConverter.kt +++ b/privacysandbox/tools/tools-core/src/main/java/androidx/privacysandbox/tools/core/generator/BinderCodeConverter.kt
@@ -36,7 +36,7 @@ * model equivalent. * * @param type the type of the resulting expression. Can reference a primitive on annotated - * interface/value. + * interface/value. * @param expression the expression to be converted. * @return a [CodeBlock] containing the generated code to perform the conversion. */ @@ -79,10 +79,8 @@ "%L%L.toList()", expression, // Only convert the list elements if necessary. - if (convertToModelCodeBlock == CodeBlock.of("it")) - CodeBlock.of("") - else - CodeBlock.of(".map { %L }", convertToModelCodeBlock) + if (convertToModelCodeBlock == CodeBlock.of("it")) CodeBlock.of("") + else CodeBlock.of(".map { %L }", convertToModelCodeBlock) ) } if (type.qualifiedName == Types.sdkActivityLauncher.qualifiedName) { @@ -99,7 +97,7 @@ * binder equivalent. * * @param type the type of the given expression. Can reference a primitive on annotated - * interface/value. + * interface/value. * @param expression the expression to be converted. * @return a [CodeBlock] containing the generated code to perform the conversion. */ @@ -145,10 +143,8 @@ "%L%L.%L()", expression, // Only convert the list elements if necessary. - if (convertToBinderCodeBlock == CodeBlock.of("it")) - CodeBlock.of("") - else - CodeBlock.of(".map { %L }", convertToBinderCodeBlock), + if (convertToBinderCodeBlock == CodeBlock.of("it")) CodeBlock.of("") + else CodeBlock.of(".map { %L }", convertToBinderCodeBlock), toBinderList(type.typeParameters[0]) ) } @@ -189,27 +185,29 @@ annotatedInterface: AnnotatedInterface ): TypeName - private fun toBinderList(type: Type) = when (type) { - Types.boolean -> "toBooleanArray" - Types.int -> "toIntArray" - Types.long -> "toLongArray" - Types.short -> "toIntArray" - Types.float -> "toFloatArray" - Types.double -> "toDoubleArray" - Types.char -> "toCharArray" - else -> "toTypedArray" - } + private fun toBinderList(type: Type) = + when (type) { + Types.boolean -> "toBooleanArray" + Types.int -> "toIntArray" + Types.long -> "toLongArray" + Types.short -> "toIntArray" + Types.float -> "toFloatArray" + Types.double -> "toDoubleArray" + Types.char -> "toCharArray" + else -> "toTypedArray" + } - private fun createBinderList(type: Type) = when (type) { - Types.boolean -> "booleanArrayOf" - Types.int -> "intArrayOf" - Types.long -> "longArrayOf" - Types.short -> "intArrayOf" - Types.float -> "floatArrayOf" - Types.double -> "doubleArrayOf" - Types.char -> "charArrayOf" - else -> "arrayOf" - } + private fun createBinderList(type: Type) = + when (type) { + Types.boolean -> "booleanArrayOf" + Types.int -> "intArrayOf" + Types.long -> "longArrayOf" + Types.short -> "intArrayOf" + Types.float -> "floatArrayOf" + Types.double -> "doubleArrayOf" + Types.char -> "charArrayOf" + else -> "arrayOf" + } /** Convert the given model type declaration to its binder equivalent. */ fun convertToBinderType(type: Type): TypeName { @@ -234,8 +232,7 @@ } if (type.qualifiedName == List::class.qualifiedName) return convertToBinderListType(type.typeParameters[0]) - if (type.qualifiedName == Types.sdkActivityLauncher.qualifiedName) - return bundleClass + if (type.qualifiedName == Types.sdkActivityLauncher.qualifiedName) return bundleClass return type.poetTypeName() } @@ -248,7 +245,6 @@ Types.float -> ClassName("kotlin", "FloatArray") Types.double -> ClassName("kotlin", "DoubleArray") Types.char -> ClassName("kotlin", "CharArray") - else -> ClassName("kotlin", "Array") - .parameterizedBy(convertToBinderType(type)) + else -> ClassName("kotlin", "Array").parameterizedBy(convertToBinderType(type)) } }
diff --git a/privacysandbox/tools/tools-core/src/main/java/androidx/privacysandbox/tools/core/generator/ClientBinderCodeConverter.kt b/privacysandbox/tools/tools-core/src/main/java/androidx/privacysandbox/tools/core/generator/ClientBinderCodeConverter.kt index e95204a..06bb025 100644 --- a/privacysandbox/tools/tools-core/src/main/java/androidx/privacysandbox/tools/core/generator/ClientBinderCodeConverter.kt +++ b/privacysandbox/tools/tools-core/src/main/java/androidx/privacysandbox/tools/core/generator/ClientBinderCodeConverter.kt
@@ -58,10 +58,11 @@ "(%interface:L as %clientProxy:T).coreLibInfo, " + "%interface:L.remote)", hashMapOf( - "coreLibInfoConverter" to ClassName( - annotatedInterface.type.packageName, - annotatedInterface.coreLibInfoConverterName() - ), + "coreLibInfoConverter" to + ClassName( + annotatedInterface.type.packageName, + annotatedInterface.coreLibInfoConverterName() + ), "toParcelable" to toParcelableMethodName, "interface" to expression, "context" to contextPropertyName, @@ -71,7 +72,9 @@ } } return CodeBlock.of( - "(%L as %T).remote", expression, annotatedInterface.clientProxyNameSpec() + "(%L as %T).remote", + expression, + annotatedInterface.clientProxyNameSpec() ) }
diff --git a/privacysandbox/tools/tools-core/src/main/java/androidx/privacysandbox/tools/core/generator/ClientProxyTypeGenerator.kt b/privacysandbox/tools/tools-core/src/main/java/androidx/privacysandbox/tools/core/generator/ClientProxyTypeGenerator.kt index 04c8db3..54d5210 100644 --- a/privacysandbox/tools/tools-core/src/main/java/androidx/privacysandbox/tools/core/generator/ClientProxyTypeGenerator.kt +++ b/privacysandbox/tools/tools-core/src/main/java/androidx/privacysandbox/tools/core/generator/ClientProxyTypeGenerator.kt
@@ -49,7 +49,7 @@ * * This allows a client to call remote methods on a server using a binder named 'remote'. * - * If [target] is [GenerationTarget.SERVER] (ie. this will run on the SDK-side) includes a + * If [target] is [GenerationTarget.SERVER] (ie. this will run on the SDK-side) includes a * Context that will be the SDK context. */ fun generate(annotatedInterface: AnnotatedInterface, target: GenerationTarget): FileSpec { @@ -57,42 +57,51 @@ val remoteBinderClassName = annotatedInterface.aidlType().innerType.poetTypeName() val inheritsUiAdapter = annotatedInterface.superTypes.contains(Types.sandboxedUiAdapter) - val classSpec = TypeSpec.classBuilder(className).build { - addSuperinterface(annotatedInterface.type.poetTypeName()) + val classSpec = + TypeSpec.classBuilder(className).build { + addSuperinterface(annotatedInterface.type.poetTypeName()) - primaryConstructor(buildList { - add( - PropertySpec.builder("remote", remoteBinderClassName) - .addModifiers(KModifier.PUBLIC).build() - ) - if (target == SERVER) { - add( - PropertySpec.builder(contextPropertyName, contextClass) - .addModifiers(KModifier.PUBLIC).build() - ) - } - if (inheritsUiAdapter) add( - PropertySpec.builder("coreLibInfo", SpecNames.bundleClass) - .addModifiers(KModifier.PUBLIC).build() - ) - }) - - addFunctions(annotatedInterface.methods.map(::toFunSpec)) - - if (inheritsUiAdapter) { - addProperty( - PropertySpec.builder( - sandboxedUiAdapterPropertyName, Types.sandboxedUiAdapter.poetTypeName() - ).addModifiers(KModifier.PUBLIC) - .initializer( - "%T.createFromCoreLibInfo(coreLibInfo)", - sandboxedUiAdapterFactoryClass + primaryConstructor( + buildList { + add( + PropertySpec.builder("remote", remoteBinderClassName) + .addModifiers(KModifier.PUBLIC) + .build() ) - .build() + if (target == SERVER) { + add( + PropertySpec.builder(contextPropertyName, contextClass) + .addModifiers(KModifier.PUBLIC) + .build() + ) + } + if (inheritsUiAdapter) + add( + PropertySpec.builder("coreLibInfo", SpecNames.bundleClass) + .addModifiers(KModifier.PUBLIC) + .build() + ) + } ) - addFunction(generateOpenSession()) + + addFunctions(annotatedInterface.methods.map(::toFunSpec)) + + if (inheritsUiAdapter) { + addProperty( + PropertySpec.builder( + sandboxedUiAdapterPropertyName, + Types.sandboxedUiAdapter.poetTypeName() + ) + .addModifiers(KModifier.PUBLIC) + .initializer( + "%T.createFromCoreLibInfo(coreLibInfo)", + sandboxedUiAdapterFactoryClass + ) + .build() + ) + addFunction(generateOpenSession()) + } } - } return FileSpec.builder(annotatedInterface.type.packageName, className).build { addCommonSettings() @@ -135,64 +144,69 @@ addCode(generateRemoteCall(method)) } - private fun generateOpenSession() = FunSpec.builder("openSession").build { - addModifiers(KModifier.PUBLIC, KModifier.OVERRIDE) - addParameters( - listOf( - ParameterSpec(contextPropertyName, contextClass), - ParameterSpec("windowInputToken", ClassName("android.os", "IBinder")), - ParameterSpec("initialWidth", Types.int.poetClassName()), - ParameterSpec("initialHeight", Types.int.poetClassName()), - ParameterSpec("isZOrderOnTop", Types.boolean.poetClassName()), - ParameterSpec("clientExecutor", ClassName("java.util.concurrent", "Executor")), - ParameterSpec( - "client", ClassName( - "androidx.privacysandbox.ui.core", "SandboxedUiAdapter.SessionClient" - ) - ), - ) - ) - addStatement( - "$sandboxedUiAdapterPropertyName.openSession(%N, windowInputToken, initialWidth, " + - "initialHeight, isZOrderOnTop, clientExecutor, client)", - contextPropertyName, - ) - } - - private fun generateTransactionCallbackObject(method: Method) = CodeBlock.builder().build { - val transactionCallbackClassName = ClassName( - basePackageName, - wrapWithListIfNeeded(method.returnType).transactionCallbackName(), - "Stub" - ) - - addControlFlow("val transactionCallback = object: %T()", transactionCallbackClassName) { - addControlFlow( - "override fun onCancellable(cancellationSignal: %T)", - cancellationSignalClassName - ) { - addControlFlow("if (it.isCancelled)") { - addStatement("cancellationSignal.cancel()") - } - addStatement("mCancellationSignal = cancellationSignal") - } - - add(generateTransactionCallbackOnSuccess(method)) - - addControlFlow( - "override fun onFailure(throwableParcel: %T)", - ClassName(basePackageName, throwableParcelName) - ) { - addStatement( - "it.%M(%M(throwableParcel))", - resumeWithExceptionMethod, - ThrowableParcelConverterFileGenerator.fromThrowableParcelNameSpec( - basePackageName - ) + private fun generateOpenSession() = + FunSpec.builder("openSession").build { + addModifiers(KModifier.PUBLIC, KModifier.OVERRIDE) + addParameters( + listOf( + ParameterSpec(contextPropertyName, contextClass), + ParameterSpec("windowInputToken", ClassName("android.os", "IBinder")), + ParameterSpec("initialWidth", Types.int.poetClassName()), + ParameterSpec("initialHeight", Types.int.poetClassName()), + ParameterSpec("isZOrderOnTop", Types.boolean.poetClassName()), + ParameterSpec("clientExecutor", ClassName("java.util.concurrent", "Executor")), + ParameterSpec( + "client", + ClassName( + "androidx.privacysandbox.ui.core", + "SandboxedUiAdapter.SessionClient" + ) + ), ) + ) + addStatement( + "$sandboxedUiAdapterPropertyName.openSession(%N, windowInputToken, initialWidth, " + + "initialHeight, isZOrderOnTop, clientExecutor, client)", + contextPropertyName, + ) + } + + private fun generateTransactionCallbackObject(method: Method) = + CodeBlock.builder().build { + val transactionCallbackClassName = + ClassName( + basePackageName, + wrapWithListIfNeeded(method.returnType).transactionCallbackName(), + "Stub" + ) + + addControlFlow("val transactionCallback = object: %T()", transactionCallbackClassName) { + addControlFlow( + "override fun onCancellable(cancellationSignal: %T)", + cancellationSignalClassName + ) { + addControlFlow("if (it.isCancelled)") { + addStatement("cancellationSignal.cancel()") + } + addStatement("mCancellationSignal = cancellationSignal") + } + + add(generateTransactionCallbackOnSuccess(method)) + + addControlFlow( + "override fun onFailure(throwableParcel: %T)", + ClassName(basePackageName, throwableParcelName) + ) { + addStatement( + "it.%M(%M(throwableParcel))", + resumeWithExceptionMethod, + ThrowableParcelConverterFileGenerator.fromThrowableParcelNameSpec( + basePackageName + ) + ) + } } } - } private fun generateTransactionCallbackOnSuccess(method: Method): CodeBlock { if (method.returnsUnit) { @@ -219,16 +233,18 @@ private fun generateRemoteCall( method: Method, extraParameters: List= emptyList(), - ) = CodeBlock.builder().build { - val parameters = - method.parameters.map { binderCodeConverter.convertToBinderCode(it.type, it.name) } + - extraParameters - addStatement { - add("remote.${method.name}(") - add(parameters.joinToCode()) - add(")") + ) = + CodeBlock.builder().build { + val parameters = + method.parameters.map { + binderCodeConverter.convertToBinderCode(it.type, it.name) + } + extraParameters + addStatement { + add("remote.${method.name}(") + add(parameters.joinToCode()) + add(")") + } } - } private val Method.returnsUnit: Boolean get() {
diff --git a/privacysandbox/tools/tools-core/src/main/java/androidx/privacysandbox/tools/core/generator/CoreLibInfoAndBinderWrapperConverterGenerator.kt b/privacysandbox/tools/tools-core/src/main/java/androidx/privacysandbox/tools/core/generator/CoreLibInfoAndBinderWrapperConverterGenerator.kt index 7473dc3..f6cafd6f 100644 --- a/privacysandbox/tools/tools-core/src/main/java/androidx/privacysandbox/tools/core/generator/CoreLibInfoAndBinderWrapperConverterGenerator.kt +++ b/privacysandbox/tools/tools-core/src/main/java/androidx/privacysandbox/tools/core/generator/CoreLibInfoAndBinderWrapperConverterGenerator.kt
@@ -25,26 +25,32 @@ object CoreLibInfoAndBinderWrapperConverterGenerator { fun generate(annotatedInterface: AnnotatedInterface) = FileSpec.builder( - annotatedInterface.type.packageName, - annotatedInterface.coreLibInfoConverterName() - ).build { - addCommonSettings() - addType(generateConverter(annotatedInterface)) - } + annotatedInterface.type.packageName, + annotatedInterface.coreLibInfoConverterName() + ) + .build { + addCommonSettings() + addType(generateConverter(annotatedInterface)) + } private fun generateConverter(annotatedInterface: AnnotatedInterface) = TypeSpec.objectBuilder(annotatedInterface.coreLibInfoConverterName()).build { - addFunction(FunSpec.builder("toParcelable").build { - addParameter("coreLibInfo", bundleClass) - addParameter("interface", annotatedInterface.aidlType().innerType.poetTypeName()) - returns(annotatedInterface.uiAdapterAidlWrapper().poetTypeName()) - addStatement( - "val parcelable = %T()", - annotatedInterface.uiAdapterAidlWrapper().poetTypeName() - ) - addStatement("parcelable.coreLibInfo = coreLibInfo") - addStatement("parcelable.binder = %N", "interface") - addStatement("return parcelable") - }) + addFunction( + FunSpec.builder("toParcelable").build { + addParameter("coreLibInfo", bundleClass) + addParameter( + "interface", + annotatedInterface.aidlType().innerType.poetTypeName() + ) + returns(annotatedInterface.uiAdapterAidlWrapper().poetTypeName()) + addStatement( + "val parcelable = %T()", + annotatedInterface.uiAdapterAidlWrapper().poetTypeName() + ) + addStatement("parcelable.coreLibInfo = coreLibInfo") + addStatement("parcelable.binder = %N", "interface") + addStatement("return parcelable") + } + ) } }
diff --git a/privacysandbox/tools/tools-core/src/main/java/androidx/privacysandbox/tools/core/generator/KotlinPoetSpecs.kt b/privacysandbox/tools/tools-core/src/main/java/androidx/privacysandbox/tools/core/generator/KotlinPoetSpecs.kt index f5a716d..93c764f 100644 --- a/privacysandbox/tools/tools-core/src/main/java/androidx/privacysandbox/tools/core/generator/KotlinPoetSpecs.kt +++ b/privacysandbox/tools/tools-core/src/main/java/androidx/privacysandbox/tools/core/generator/KotlinPoetSpecs.kt
@@ -40,20 +40,16 @@ /** [TypeName] equivalent to this type. */ fun Type.poetTypeName(): TypeName { val typeName = - if (typeParameters.isEmpty()) - poetClassName() - else - poetClassName().parameterizedBy(typeParameters.map { it.poetTypeName() }) - if (isNullable) - return typeName.copy(nullable = true) + if (typeParameters.isEmpty()) poetClassName() + else poetClassName().parameterizedBy(typeParameters.map { it.poetTypeName() }) + if (isNullable) return typeName.copy(nullable = true) return typeName } /** [ClassName] equivalent to this type. */ fun Type.poetClassName() = ClassName(packageName, simpleName) -fun AnnotatedValue.converterNameSpec() = - ClassName(type.packageName, "${type.simpleName}Converter") +fun AnnotatedValue.converterNameSpec() = ClassName(type.packageName, "${type.simpleName}Converter") fun AnnotatedValue.parcelableNameSpec() = ClassName(type.packageName, "Parcelable${type.simpleName}") @@ -76,11 +72,7 @@ properties: List, vararg modifiers: KModifier, ) { - val propertiesWithInitializer = - properties.map { - it.toBuilder().initializer(it.name) - .build() - } + val propertiesWithInitializer = properties.map { it.toBuilder().initializer(it.name).build() } primaryConstructor( FunSpec.constructorBuilder().build { addParameters(propertiesWithInitializer.map { ParameterSpec(it.name, it.type) })
diff --git a/privacysandbox/tools/tools-core/src/main/java/androidx/privacysandbox/tools/core/generator/PrivacySandboxCancellationExceptionFileGenerator.kt b/privacysandbox/tools/tools-core/src/main/java/androidx/privacysandbox/tools/core/generator/PrivacySandboxCancellationExceptionFileGenerator.kt index a53dbe9..cb3fee4 100644 --- a/privacysandbox/tools/tools-core/src/main/java/androidx/privacysandbox/tools/core/generator/PrivacySandboxCancellationExceptionFileGenerator.kt +++ b/privacysandbox/tools/tools-core/src/main/java/androidx/privacysandbox/tools/core/generator/PrivacySandboxCancellationExceptionFileGenerator.kt
@@ -28,27 +28,29 @@ private val privacySandboxCancellationExceptionName = "PrivacySandboxCancellationException" fun generate(): FileSpec { - val classSpec = TypeSpec.classBuilder(privacySandboxCancellationExceptionName).build { - superclass(CancellationException::class) - addModifiers(KModifier.PUBLIC) - primaryConstructor( - listOf( - PropertySpec.builder( - "message", - String::class.asTypeName().copy(nullable = true), - ).addModifiers(KModifier.PUBLIC, KModifier.OVERRIDE).build(), - PropertySpec.builder( - "cause", - Throwable::class.asTypeName().copy(nullable = true), - ).addModifiers(KModifier.PUBLIC, KModifier.OVERRIDE).build() + val classSpec = + TypeSpec.classBuilder(privacySandboxCancellationExceptionName).build { + superclass(CancellationException::class) + addModifiers(KModifier.PUBLIC) + primaryConstructor( + listOf( + PropertySpec.builder( + "message", + String::class.asTypeName().copy(nullable = true), + ) + .addModifiers(KModifier.PUBLIC, KModifier.OVERRIDE) + .build(), + PropertySpec.builder( + "cause", + Throwable::class.asTypeName().copy(nullable = true), + ) + .addModifiers(KModifier.PUBLIC, KModifier.OVERRIDE) + .build() + ) ) - ) - } + } - return FileSpec.builder( - basePackageName, - privacySandboxCancellationExceptionName - ).build { + return FileSpec.builder(basePackageName, privacySandboxCancellationExceptionName).build { addCommonSettings() addType(classSpec) }
diff --git a/privacysandbox/tools/tools-core/src/main/java/androidx/privacysandbox/tools/core/generator/PrivacySandboxExceptionFileGenerator.kt b/privacysandbox/tools/tools-core/src/main/java/androidx/privacysandbox/tools/core/generator/PrivacySandboxExceptionFileGenerator.kt index c93a34f..52da6d9 100644 --- a/privacysandbox/tools/tools-core/src/main/java/androidx/privacysandbox/tools/core/generator/PrivacySandboxExceptionFileGenerator.kt +++ b/privacysandbox/tools/tools-core/src/main/java/androidx/privacysandbox/tools/core/generator/PrivacySandboxExceptionFileGenerator.kt
@@ -28,27 +28,29 @@ } fun generate(): FileSpec { - val classSpec = TypeSpec.classBuilder(privacySandboxExceptionName).build { - superclass(RuntimeException::class) - addModifiers(KModifier.PUBLIC) - primaryConstructor( - listOf( - PropertySpec.builder( - "message", - String::class.asTypeName().copy(nullable = true), - ).addModifiers(KModifier.PUBLIC, KModifier.OVERRIDE).build(), - PropertySpec.builder( - "cause", - Throwable::class.asTypeName().copy(nullable = true), - ).addModifiers(KModifier.PUBLIC, KModifier.OVERRIDE).build() + val classSpec = + TypeSpec.classBuilder(privacySandboxExceptionName).build { + superclass(RuntimeException::class) + addModifiers(KModifier.PUBLIC) + primaryConstructor( + listOf( + PropertySpec.builder( + "message", + String::class.asTypeName().copy(nullable = true), + ) + .addModifiers(KModifier.PUBLIC, KModifier.OVERRIDE) + .build(), + PropertySpec.builder( + "cause", + Throwable::class.asTypeName().copy(nullable = true), + ) + .addModifiers(KModifier.PUBLIC, KModifier.OVERRIDE) + .build() + ) ) - ) - } + } - return FileSpec.builder( - basePackageName, - privacySandboxExceptionName - ).build { + return FileSpec.builder(basePackageName, privacySandboxExceptionName).build { addCommonSettings() addType(classSpec) }
diff --git a/privacysandbox/tools/tools-core/src/main/java/androidx/privacysandbox/tools/core/generator/SdkActivityLauncherProxyGenerator.kt b/privacysandbox/tools/tools-core/src/main/java/androidx/privacysandbox/tools/core/generator/SdkActivityLauncherProxyGenerator.kt index fa465ff..430a9e7 100644 --- a/privacysandbox/tools/tools-core/src/main/java/androidx/privacysandbox/tools/core/generator/SdkActivityLauncherProxyGenerator.kt +++ b/privacysandbox/tools/tools-core/src/main/java/androidx/privacysandbox/tools/core/generator/SdkActivityLauncherProxyGenerator.kt
@@ -37,27 +37,27 @@ companion object { const val proxyClassName = "SdkActivityLauncherProxy" const val converterClassName = "SdkActivityLauncherConverter" - val iSdkActivityLauncher = ClassName( - "androidx.privacysandbox.activity.core", - "ISdkActivityLauncher" - ) + val iSdkActivityLauncher = + ClassName("androidx.privacysandbox.activity.core", "ISdkActivityLauncher") } fun generate(): FileSpec { - val classSpec = TypeSpec.classBuilder(proxyClassName).build { - addSuperinterface(Types.sdkActivityLauncher.poetClassName()) - addModifiers(KModifier.PUBLIC) - primaryConstructor( - listOf( - PropertySpec.builder("remote", iSdkActivityLauncher).build(), - PropertySpec.builder( - "launcherInfo", - SpecNames.bundleClass, - ).build(), - ), - ) - addFunction(launchSdkActivityFunSpec()) - } + val classSpec = + TypeSpec.classBuilder(proxyClassName).build { + addSuperinterface(Types.sdkActivityLauncher.poetClassName()) + addModifiers(KModifier.PUBLIC) + primaryConstructor( + listOf( + PropertySpec.builder("remote", iSdkActivityLauncher).build(), + PropertySpec.builder( + "launcherInfo", + SpecNames.bundleClass, + ) + .build(), + ), + ) + addFunction(launchSdkActivityFunSpec()) + } return FileSpec.builder(basePackageName, proxyClassName).build { addCommonSettings() @@ -66,84 +66,90 @@ } } - private fun launchSdkActivityFunSpec() = FunSpec.builder("launchSdkActivity").build { - val transactionCallbackName = ClassName( - "androidx.privacysandbox.activity.core", - "ISdkActivityLauncherCallback", - "Stub" - ) - val tokenParameterName = "sdkActivityHandlerToken" + private fun launchSdkActivityFunSpec() = + FunSpec.builder("launchSdkActivity").build { + val transactionCallbackName = + ClassName( + "androidx.privacysandbox.activity.core", + "ISdkActivityLauncherCallback", + "Stub" + ) + val tokenParameterName = "sdkActivityHandlerToken" - addModifiers(KModifier.PUBLIC) - addModifiers(KModifier.OVERRIDE) - addModifiers(KModifier.SUSPEND) - addParameter(tokenParameterName, iBinderClass) - returns(Boolean::class) - addCode { - addControlFlow("return %M", suspendCancellableCoroutineMethod) { - addStatement("remote.launchSdkActivity(") - indent() - addStatement("%L,", tokenParameterName) - addControlFlow("object: %T()", transactionCallbackName) { - addControlFlow( - "override fun onLaunchAccepted(%L: %T?)", - tokenParameterName, - iBinderClass, - ) { - addStatement("it.%M(true)", resumeMethod) + addModifiers(KModifier.PUBLIC) + addModifiers(KModifier.OVERRIDE) + addModifiers(KModifier.SUSPEND) + addParameter(tokenParameterName, iBinderClass) + returns(Boolean::class) + addCode { + addControlFlow("return %M", suspendCancellableCoroutineMethod) { + addStatement("remote.launchSdkActivity(") + indent() + addStatement("%L,", tokenParameterName) + addControlFlow("object: %T()", transactionCallbackName) { + addControlFlow( + "override fun onLaunchAccepted(%L: %T?)", + tokenParameterName, + iBinderClass, + ) { + addStatement("it.%M(true)", resumeMethod) + } + addControlFlow( + "override fun onLaunchRejected(%L: %T?)", + tokenParameterName, + iBinderClass, + ) { + addStatement("it.%M(true)", resumeMethod) + } + addControlFlow("override fun onLaunchError(message: String?)") { + addStatement( + "it.%M(RuntimeException(message))", + resumeWithExceptionMethod + ) + } } - addControlFlow( - "override fun onLaunchRejected(%L: %T?)", - tokenParameterName, - iBinderClass, - ) { - addStatement("it.%M(true)", resumeMethod) - } - addControlFlow("override fun onLaunchError(message: String?)") { - addStatement("it.%M(RuntimeException(message))", resumeWithExceptionMethod) - } + unindent() + addStatement(")") } - unindent() - addStatement(")") } } - } private fun converterObjectSpec() = TypeSpec.objectBuilder("SdkActivityLauncherConverter").build { val proxyPoetClassName = ClassName(basePackageName, proxyClassName) - addFunction(FunSpec.builder("getLocalOrProxyLauncher").build { - addParameter("launcherInfo", SpecNames.bundleClass) - returns(Types.sdkActivityLauncher.poetTypeName()) - addStatement( - """val remote = launcherInfo.getBinder("sdkActivityLauncherBinderKey")""" - ) - addStatement( - """requireNotNull(remote) { "Invalid SdkActivityLauncher info bundle." }""" - ) - addStatement( - "val binder = %T.Stub.asInterface(remote)", - iSdkActivityLauncher, - ) - addStatement("return SdkActivityLauncherProxy(binder, launcherInfo)") - }) - - addFunction(FunSpec.builder("toBinder").build { - addParameter("launcher", Types.sdkActivityLauncher.poetClassName()) - returns(SpecNames.bundleClass) - addCode { - addControlFlow("if (launcher is %T)", proxyPoetClassName) { - addStatement("return launcher.launcherInfo") - } - } - addStatement( - "return launcher.%M()", - MemberName( - "androidx.privacysandbox.activity.client", - "toLauncherInfo" + addFunction( + FunSpec.builder("getLocalOrProxyLauncher").build { + addParameter("launcherInfo", SpecNames.bundleClass) + returns(Types.sdkActivityLauncher.poetTypeName()) + addStatement( + """val remote = launcherInfo.getBinder("sdkActivityLauncherBinderKey")""" ) - ) - }) + addStatement( + """requireNotNull(remote) { "Invalid SdkActivityLauncher info bundle." }""" + ) + addStatement( + "val binder = %T.Stub.asInterface(remote)", + iSdkActivityLauncher, + ) + addStatement("return SdkActivityLauncherProxy(binder, launcherInfo)") + } + ) + + addFunction( + FunSpec.builder("toBinder").build { + addParameter("launcher", Types.sdkActivityLauncher.poetClassName()) + returns(SpecNames.bundleClass) + addCode { + addControlFlow("if (launcher is %T)", proxyPoetClassName) { + addStatement("return launcher.launcherInfo") + } + } + addStatement( + "return launcher.%M()", + MemberName("androidx.privacysandbox.activity.client", "toLauncherInfo") + ) + } + ) } }
diff --git a/privacysandbox/tools/tools-core/src/main/java/androidx/privacysandbox/tools/core/generator/SdkActivityLauncherWrapperGenerator.kt b/privacysandbox/tools/tools-core/src/main/java/androidx/privacysandbox/tools/core/generator/SdkActivityLauncherWrapperGenerator.kt index e096a86..e5c0613 100644 --- a/privacysandbox/tools/tools-core/src/main/java/androidx/privacysandbox/tools/core/generator/SdkActivityLauncherWrapperGenerator.kt +++ b/privacysandbox/tools/tools-core/src/main/java/androidx/privacysandbox/tools/core/generator/SdkActivityLauncherWrapperGenerator.kt
@@ -35,26 +35,33 @@ } fun generate(): FileSpec { - val classSpec = TypeSpec.classBuilder(className).build { - addSuperinterface(Types.sdkActivityLauncher.poetClassName(), CodeBlock.of("delegate")) - addModifiers(KModifier.PUBLIC) - primaryConstructor( - listOf( - PropertySpec.builder( - "delegate", - Types.sdkActivityLauncher.poetTypeName(), - ).addModifiers(KModifier.PRIVATE).build(), - PropertySpec.builder( - "launcherInfo", - SpecNames.bundleClass, - ).build(), - ), - KModifier.PRIVATE, - ) + val classSpec = + TypeSpec.classBuilder(className).build { + addSuperinterface( + Types.sdkActivityLauncher.poetClassName(), + CodeBlock.of("delegate") + ) + addModifiers(KModifier.PUBLIC) + primaryConstructor( + listOf( + PropertySpec.builder( + "delegate", + Types.sdkActivityLauncher.poetTypeName(), + ) + .addModifiers(KModifier.PRIVATE) + .build(), + PropertySpec.builder( + "launcherInfo", + SpecNames.bundleClass, + ) + .build(), + ), + KModifier.PRIVATE, + ) - addFunction(fromLauncherInfo()) - addType(companionObject()) - } + addFunction(fromLauncherInfo()) + addType(companionObject()) + } return FileSpec.builder(basePackageName, className).build { addCommonSettings() @@ -62,33 +69,38 @@ } } - private fun fromLauncherInfo() = FunSpec.constructorBuilder() - .addParameter("launcherInfo", SpecNames.bundleClass) - .callThisConstructor( - CodeBlock.of( - "%T.fromLauncherInfo(launcherInfo)", - ClassName( - "androidx.privacysandbox.activity.provider", - "SdkActivityLauncherFactory" + private fun fromLauncherInfo() = + FunSpec.constructorBuilder() + .addParameter("launcherInfo", SpecNames.bundleClass) + .callThisConstructor( + CodeBlock.of( + "%T.fromLauncherInfo(launcherInfo)", + ClassName( + "androidx.privacysandbox.activity.provider", + "SdkActivityLauncherFactory" + ), ), - ), - CodeBlock.of("launcherInfo"), - ).build() + CodeBlock.of("launcherInfo"), + ) + .build() - private fun companionObject() = TypeSpec.companionObjectBuilder().addFunction( - FunSpec.builder("getLauncherInfo").build { - addParameter("launcher", Types.sdkActivityLauncher.poetClassName()) - returns(SpecNames.bundleClass) - addCode { - addControlFlow("if (launcher is %N)", className) { - addStatement("return launcher.launcherInfo") + private fun companionObject() = + TypeSpec.companionObjectBuilder() + .addFunction( + FunSpec.builder("getLauncherInfo").build { + addParameter("launcher", Types.sdkActivityLauncher.poetClassName()) + returns(SpecNames.bundleClass) + addCode { + addControlFlow("if (launcher is %N)", className) { + addStatement("return launcher.launcherInfo") + } + addStatement( + "throw·IllegalStateException(%S)", + "Invalid SdkActivityLauncher instance cannot be bundled. " + + "SdkActivityLaunchers may only be created by apps." + ) + } } - addStatement( - "throw·IllegalStateException(%S)", - "Invalid SdkActivityLauncher instance cannot be bundled. " + - "SdkActivityLaunchers may only be created by apps." - ) - } - } - ).build() + ) + .build() }
diff --git a/privacysandbox/tools/tools-core/src/main/java/androidx/privacysandbox/tools/core/generator/ServerBinderCodeConverter.kt b/privacysandbox/tools/tools-core/src/main/java/androidx/privacysandbox/tools/core/generator/ServerBinderCodeConverter.kt index f31c8ab..d0cb3e6 100644 --- a/privacysandbox/tools/tools-core/src/main/java/androidx/privacysandbox/tools/core/generator/ServerBinderCodeConverter.kt +++ b/privacysandbox/tools/tools-core/src/main/java/androidx/privacysandbox/tools/core/generator/ServerBinderCodeConverter.kt
@@ -30,10 +30,8 @@ class ServerBinderCodeConverter(private val api: ParsedApi) : BinderCodeConverter(api) { private val basePackageName = api.getOnlyService().type.packageName - private val activityLauncherWrapperClass = ClassName( - basePackageName, - SdkActivityLauncherWrapperGenerator.className - ) + private val activityLauncherWrapperClass = + ClassName(basePackageName, SdkActivityLauncherWrapperGenerator.className) override fun convertToInterfaceModelCode( annotatedInterface: AnnotatedInterface, @@ -41,11 +39,15 @@ ): CodeBlock { if (annotatedInterface.inheritsSandboxedUiAdapter) { return CodeBlock.of( - "(%L.binder as %T).delegate", expression, annotatedInterface.stubDelegateNameSpec() + "(%L.binder as %T).delegate", + expression, + annotatedInterface.stubDelegateNameSpec() ) } return CodeBlock.of( - "(%L as %T).delegate", expression, annotatedInterface.stubDelegateNameSpec() + "(%L as %T).delegate", + expression, + annotatedInterface.stubDelegateNameSpec() ) } @@ -61,10 +63,11 @@ "%stubDelegate:T(%interface:L, %context:N)" + ")", hashMapOf( - "coreLibInfoConverter" to ClassName( - annotatedInterface.type.packageName, - annotatedInterface.coreLibInfoConverterName() - ), + "coreLibInfoConverter" to + ClassName( + annotatedInterface.type.packageName, + annotatedInterface.coreLibInfoConverterName() + ), "toParcelable" to toParcelableMethodName, "interface" to expression, "toCoreLibInfo" to toCoreLibInfoMethod,
diff --git a/privacysandbox/tools/tools-core/src/main/java/androidx/privacysandbox/tools/core/generator/ServiceFactoryFileGenerator.kt b/privacysandbox/tools/tools-core/src/main/java/androidx/privacysandbox/tools/core/generator/ServiceFactoryFileGenerator.kt index 7b569a2..469810c 100644 --- a/privacysandbox/tools/tools-core/src/main/java/androidx/privacysandbox/tools/core/generator/ServiceFactoryFileGenerator.kt +++ b/privacysandbox/tools/tools-core/src/main/java/androidx/privacysandbox/tools/core/generator/ServiceFactoryFileGenerator.kt
@@ -47,14 +47,16 @@ returns(ClassName(service.type.packageName, service.type.simpleName)) if (generateStubs) { addAnnotation( - AnnotationSpec.builder(Suppress::class).addMember("%S", "UNUSED_PARAMETER") + AnnotationSpec.builder(Suppress::class) + .addMember("%S", "UNUSED_PARAMETER") .build() ) addStatement("throw RuntimeException(%S)", "Stub!") } else { addStatement( "return %T(%T.Stub.asInterface(binder))", - service.clientProxyNameSpec(), service.aidlInterfaceNameSpec() + service.clientProxyNameSpec(), + service.aidlInterfaceNameSpec() ) } }
diff --git a/privacysandbox/tools/tools-core/src/main/java/androidx/privacysandbox/tools/core/generator/StubDelegatesGenerator.kt b/privacysandbox/tools/tools-core/src/main/java/androidx/privacysandbox/tools/core/generator/StubDelegatesGenerator.kt index 7082174..38d387f 100644 --- a/privacysandbox/tools/tools-core/src/main/java/androidx/privacysandbox/tools/core/generator/StubDelegatesGenerator.kt +++ b/privacysandbox/tools/tools-core/src/main/java/androidx/privacysandbox/tools/core/generator/StubDelegatesGenerator.kt
@@ -51,44 +51,49 @@ * * This allows a server-side interface to be called by a remote ClientProxy. * - * If [target] is [GenerationTarget.SERVER] (ie. this will run on the SDK-side) includes a + * If [target] is [GenerationTarget.SERVER] (ie. this will run on the SDK-side) includes a * Context that will be the SDK context. */ fun generate(annotatedInterface: AnnotatedInterface, target: GenerationTarget): FileSpec { val className = annotatedInterface.stubDelegateNameSpec().simpleName - val aidlBaseClassName = ClassName( - annotatedInterface.type.packageName, annotatedInterface.aidlName(), "Stub" - ) + val aidlBaseClassName = + ClassName(annotatedInterface.type.packageName, annotatedInterface.aidlName(), "Stub") - val classSpec = TypeSpec.classBuilder(className).build { - superclass(aidlBaseClassName) + val classSpec = + TypeSpec.classBuilder(className).build { + superclass(aidlBaseClassName) - primaryConstructor( - buildList { - add( - PropertySpec.builder( - "delegate", - annotatedInterface.type.poetTypeName(), - ).addModifiers(KModifier.PUBLIC).build() - ) - if (target == SERVER) { + primaryConstructor( + buildList { add( - PropertySpec.builder(contextPropertyName, contextClass) - .addModifiers(KModifier.PUBLIC).build() + PropertySpec.builder( + "delegate", + annotatedInterface.type.poetTypeName(), + ) + .addModifiers(KModifier.PUBLIC) + .build() ) - } - }, - KModifier.INTERNAL, - ) + if (target == SERVER) { + add( + PropertySpec.builder(contextPropertyName, contextClass) + .addModifiers(KModifier.PUBLIC) + .build() + ) + } + }, + KModifier.INTERNAL, + ) - val coroutineProperty = - PropertySpec.builder(coroutineScopePropertyName, coroutineScopeClass) - .addModifiers(KModifier.PRIVATE) - .initializer(CodeBlock.of("%T(%T)", coroutineScopeClass, dispatchersMainClass)) - .build() - addProperty(coroutineProperty) - addFunctions(annotatedInterface.methods.map(::toFunSpec)) - } + val coroutineProperty = + PropertySpec.builder(coroutineScopePropertyName, coroutineScopeClass) + .addModifiers(KModifier.PRIVATE) + .initializer( + CodeBlock.of("%T(%T)", coroutineScopeClass, dispatchersMainClass) + ) + .build() + addProperty(coroutineProperty) + addFunctions(annotatedInterface.methods.map(::toFunSpec)) + } return FileSpec.builder(annotatedInterface.type.packageName, className).build { addType(classSpec) @@ -105,9 +110,7 @@ addModifiers(KModifier.PUBLIC, KModifier.OVERRIDE) addParameters(getParameters(method)) addCode { - addControlFlow( - "val job = %L.%M", coroutineScopePropertyName, launchMethod - ) { + addControlFlow("val job = %L.%M", coroutineScopePropertyName, launchMethod) { addControlFlow("try") { addStatement { if (method.returnType != Types.unit) { @@ -120,9 +123,7 @@ } else { addStatement( "transactionCallback.onSuccess(%L)", - binderCodeConverter.convertToBinderCode( - method.returnType, "result" - ) + binderCodeConverter.convertToBinderCode(method.returnType, "result") ) } } @@ -144,37 +145,48 @@ } } - private fun toNonSuspendFunSpec(method: Method) = FunSpec.builder(method.name).build { - addModifiers(KModifier.PUBLIC, KModifier.OVERRIDE) - addParameters(getParameters(method)) - addCode(CodeBlock.builder().build { - addControlFlow("%L.%M", coroutineScopePropertyName, launchMethod) { - addStatement { add(getDelegateCallBlock(method)) } - } - }) - } + private fun toNonSuspendFunSpec(method: Method) = + FunSpec.builder(method.name).build { + addModifiers(KModifier.PUBLIC, KModifier.OVERRIDE) + addParameters(getParameters(method)) + addCode( + CodeBlock.builder().build { + addControlFlow("%L.%M", coroutineScopePropertyName, launchMethod) { + addStatement { add(getDelegateCallBlock(method)) } + } + } + ) + } private fun getParameters(method: Method) = buildList { - addAll(method.parameters.map { parameter -> - ParameterSpec( - parameter.name, - binderCodeConverter.convertToBinderType(parameter.type) - ) - }) - if (method.isSuspend) add( - ParameterSpec( - "transactionCallback", ClassName( - basePackageName, - wrapWithListIfNeeded(method.returnType).transactionCallbackName() + addAll( + method.parameters.map { parameter -> + ParameterSpec( + parameter.name, + binderCodeConverter.convertToBinderType(parameter.type) + ) + } + ) + if (method.isSuspend) + add( + ParameterSpec( + "transactionCallback", + ClassName( + basePackageName, + wrapWithListIfNeeded(method.returnType).transactionCallbackName() + ) ) ) - ) } - private fun getDelegateCallBlock(method: Method) = CodeBlock.builder().build { - add("delegate.${method.name}(") - add(method.parameters.map { binderCodeConverter.convertToModelCode(it.type, it.name) } - .joinToCode()) - add(")") - } + private fun getDelegateCallBlock(method: Method) = + CodeBlock.builder().build { + add("delegate.${method.name}(") + add( + method.parameters + .map { binderCodeConverter.convertToModelCode(it.type, it.name) } + .joinToCode() + ) + add(")") + } }
diff --git a/privacysandbox/tools/tools-core/src/main/java/androidx/privacysandbox/tools/core/generator/ThrowableParcelConverterFileGenerator.kt b/privacysandbox/tools/tools-core/src/main/java/androidx/privacysandbox/tools/core/generator/ThrowableParcelConverterFileGenerator.kt index df55a6e..3e55f5b 100644 --- a/privacysandbox/tools/tools-core/src/main/java/androidx/privacysandbox/tools/core/generator/ThrowableParcelConverterFileGenerator.kt +++ b/privacysandbox/tools/tools-core/src/main/java/androidx/privacysandbox/tools/core/generator/ThrowableParcelConverterFileGenerator.kt
@@ -31,14 +31,12 @@ ) { companion object { const val converterName = "${throwableParcelName}Converter" - fun toThrowableParcelNameSpec(packageName: String) = MemberName(ClassName( - packageName, - converterName - ), "toThrowableParcel") - fun fromThrowableParcelNameSpec(packageName: String) = MemberName(ClassName( - packageName, - converterName - ), "fromThrowableParcel") + + fun toThrowableParcelNameSpec(packageName: String) = + MemberName(ClassName(packageName, converterName), "toThrowableParcel") + + fun fromThrowableParcelNameSpec(packageName: String) = + MemberName(ClassName(packageName, converterName), "fromThrowableParcel") } private val throwableParcelNameSpec = ClassName(basePackageName, throwableParcelName) @@ -47,10 +45,7 @@ private val fromThrowableParcelNameSpec = fromThrowableParcelNameSpec(basePackageName) fun generate() = - FileSpec.builder( - basePackageName, - converterName - ).build { + FileSpec.builder(basePackageName, converterName).build { addCommonSettings() addType(generateConverter()) } @@ -88,7 +83,8 @@ }.toTypedArray() parcel.isCancellationException = throwable is %T return parcel - """.trimIndent(), + """ + .trimIndent(), throwableParcelNameSpec, parcelableStackFrameNameSpec, cancellationExceptionClass, @@ -127,7 +123,8 @@ ) }.toTypedArray() return exception - """.trimIndent(), + """ + .trimIndent(), stackTraceElementClass, ) }
diff --git a/privacysandbox/tools/tools-core/src/main/java/androidx/privacysandbox/tools/core/generator/TransportCancellationGenerator.kt b/privacysandbox/tools/tools-core/src/main/java/androidx/privacysandbox/tools/core/generator/TransportCancellationGenerator.kt index cf8251b..c1562a3 100644 --- a/privacysandbox/tools/tools-core/src/main/java/androidx/privacysandbox/tools/core/generator/TransportCancellationGenerator.kt +++ b/privacysandbox/tools/tools-core/src/main/java/androidx/privacysandbox/tools/core/generator/TransportCancellationGenerator.kt
@@ -37,31 +37,37 @@ val cancellationSignalStubName = ClassName(packageName, AidlGenerator.cancellationSignalName, "Stub") - val classSpec = TypeSpec.classBuilder(className).build { - superclass(cancellationSignalStubName) - addModifiers(KModifier.INTERNAL) - primaryConstructor( - listOf( - PropertySpec.builder( - "onCancel", - LambdaTypeName.get(returnType = Unit::class.asTypeName()), - ).addModifiers(KModifier.PRIVATE).build() - ), KModifier.INTERNAL - ) - addProperty( - PropertySpec.builder( - "hasCancelled", atomicBooleanClass, KModifier.PRIVATE - ).initializer("%T(false)", atomicBooleanClass).build() - ) - addFunction(FunSpec.builder("cancel").build { - addModifiers(KModifier.PUBLIC, KModifier.OVERRIDE) - addCode { - addControlFlow("if (hasCancelled.compareAndSet(false, true))") { - addStatement("onCancel()") + val classSpec = + TypeSpec.classBuilder(className).build { + superclass(cancellationSignalStubName) + addModifiers(KModifier.INTERNAL) + primaryConstructor( + listOf( + PropertySpec.builder( + "onCancel", + LambdaTypeName.get(returnType = Unit::class.asTypeName()), + ) + .addModifiers(KModifier.PRIVATE) + .build() + ), + KModifier.INTERNAL + ) + addProperty( + PropertySpec.builder("hasCancelled", atomicBooleanClass, KModifier.PRIVATE) + .initializer("%T(false)", atomicBooleanClass) + .build() + ) + addFunction( + FunSpec.builder("cancel").build { + addModifiers(KModifier.PUBLIC, KModifier.OVERRIDE) + addCode { + addControlFlow("if (hasCancelled.compareAndSet(false, true))") { + addStatement("onCancel()") + } + } } - } - }) - } + ) + } return FileSpec.builder(packageName, className).addType(classSpec).build() }
diff --git a/privacysandbox/tools/tools-core/src/main/java/androidx/privacysandbox/tools/core/generator/ValueConverterFileGenerator.kt b/privacysandbox/tools/tools-core/src/main/java/androidx/privacysandbox/tools/core/generator/ValueConverterFileGenerator.kt index 1277ce6..e3214f9 100644 --- a/privacysandbox/tools/tools-core/src/main/java/androidx/privacysandbox/tools/core/generator/ValueConverterFileGenerator.kt +++ b/privacysandbox/tools/tools-core/src/main/java/androidx/privacysandbox/tools/core/generator/ValueConverterFileGenerator.kt
@@ -47,12 +47,13 @@ fun generate(value: AnnotatedValue) = FileSpec.builder( - value.converterNameSpec().packageName, - value.converterNameSpec().simpleName - ).build { - addCommonSettings() - addType(generateConverter(value)) - } + value.converterNameSpec().packageName, + value.converterNameSpec().simpleName + ) + .build { + addCommonSettings() + addType(generateConverter(value)) + } private fun generateConverter(value: AnnotatedValue): TypeSpec { if (target == SERVER) { @@ -60,20 +61,19 @@ primaryConstructor( listOf( PropertySpec.builder(contextPropertyName, contextClass) - .addModifiers(KModifier.PUBLIC).build() + .addModifiers(KModifier.PUBLIC) + .build() ) ) addFunction(generateFromParcelable(value)) addFunction(generateToParcelable(value)) - if (value is AnnotatedEnumClass) - addProperty(generateEnumValuesProperty(value)) + if (value is AnnotatedEnumClass) addProperty(generateEnumValuesProperty(value)) } } return TypeSpec.objectBuilder(value.converterNameSpec()).build() { addFunction(generateFromParcelable(value)) addFunction(generateToParcelable(value)) - if (value is AnnotatedEnumClass) - addProperty(generateEnumValuesProperty(value)) + if (value is AnnotatedEnumClass) addProperty(generateEnumValuesProperty(value)) } } @@ -84,9 +84,9 @@ addStatement("val parcelable = %T()", value.parcelableNameSpec()) when (value) { is AnnotatedDataClass -> - value.properties.map(::generateToParcelablePropertyConversion) + value.properties + .map(::generateToParcelablePropertyConversion) .forEach(::addCode) - is AnnotatedEnumClass -> addStatement("parcelable.variant_ordinal = annotatedValue.ordinal") } @@ -119,7 +119,6 @@ } addStatement("return annotatedValue") } - is AnnotatedEnumClass -> FunSpec.builder(fromParcelableMethodName).build { addParameter("parcelable", value.parcelableNameSpec()) @@ -135,21 +134,13 @@ CodeBlock.builder().build { add( "${property.name} = %L", - binderConverter.convertToModelCode( - property.type, "parcelable.${property.name}" - ) + binderConverter.convertToModelCode(property.type, "parcelable.${property.name}") ) } private fun generateEnumValuesProperty(value: AnnotatedEnumClass) = - PropertySpec.builder( - "enumValues", - Types.list(value.type).poetTypeName() - ) + PropertySpec.builder("enumValues", Types.list(value.type).poetTypeName()) .addModifiers(KModifier.PRIVATE) - .initializer( - CodeBlock.of( - "%T.values().toList()", value.type.poetClassName() - ) - ).build() + .initializer(CodeBlock.of("%T.values().toList()", value.type.poetClassName())) + .build() }
diff --git a/privacysandbox/tools/tools-core/src/main/java/androidx/privacysandbox/tools/core/generator/ValueFileGenerator.kt b/privacysandbox/tools/tools-core/src/main/java/androidx/privacysandbox/tools/core/generator/ValueFileGenerator.kt index 62ed768..523b668b 100644 --- a/privacysandbox/tools/tools-core/src/main/java/androidx/privacysandbox/tools/core/generator/ValueFileGenerator.kt +++ b/privacysandbox/tools/tools-core/src/main/java/androidx/privacysandbox/tools/core/generator/ValueFileGenerator.kt
@@ -24,9 +24,7 @@ import com.squareup.kotlinpoet.PropertySpec import com.squareup.kotlinpoet.TypeSpec -/** - * Generates a file that defines a previously declared SDK value. - */ +/** Generates a file that defines a previously declared SDK value. */ class ValueFileGenerator { fun generate(value: AnnotatedValue) = FileSpec.builder(value.type.packageName, value.type.simpleName).build { @@ -39,13 +37,14 @@ is AnnotatedDataClass -> TypeSpec.classBuilder(value.type.poetClassName()).build { addModifiers(KModifier.DATA) - primaryConstructor(value.properties.map { - PropertySpec.builder(it.name, it.type.poetTypeName()) - .mutable(false) - .build() - }) + primaryConstructor( + value.properties.map { + PropertySpec.builder(it.name, it.type.poetTypeName()) + .mutable(false) + .build() + } + ) } - is AnnotatedEnumClass -> TypeSpec.enumBuilder(value.type.poetClassName()).build { value.variants.forEach(::addEnumConstant)
diff --git a/privacysandbox/tools/tools-core/src/main/java/androidx/privacysandbox/tools/core/generator/poet/AidlFileSpec.kt b/privacysandbox/tools/tools-core/src/main/java/androidx/privacysandbox/tools/core/generator/poet/AidlFileSpec.kt index ed51fbb..96b3939 100644 --- a/privacysandbox/tools/tools-core/src/main/java/androidx/privacysandbox/tools/core/generator/poet/AidlFileSpec.kt +++ b/privacysandbox/tools/tools-core/src/main/java/androidx/privacysandbox/tools/core/generator/poet/AidlFileSpec.kt
@@ -25,15 +25,20 @@ val typesToImport: Setval innerContent: String - fun getFileContent(): String = buildList { - add("package ${type.packageName};") + fun getFileContent(): String = + buildList { + add("package ${type.packageName};") - if (typesToImport.isNotEmpty()) { - add(typesToImport.map { - "import ${it.qualifiedName};" - }.sorted().joinToString(separator = "\n")) - } + if (typesToImport.isNotEmpty()) { + add( + typesToImport + .map { "import ${it.qualifiedName};" } + .sorted() + .joinToString(separator = "\n") + ) + } - add(innerContent) - }.joinToString(separator = "\n\n") + add(innerContent) + } + .joinToString(separator = "\n\n") }
diff --git a/privacysandbox/tools/tools-core/src/main/java/androidx/privacysandbox/tools/core/generator/poet/AidlInterfaceSpec.kt b/privacysandbox/tools/tools-core/src/main/java/androidx/privacysandbox/tools/core/generator/poet/AidlInterfaceSpec.kt index 133c51a..3e1d139 100644 --- a/privacysandbox/tools/tools-core/src/main/java/androidx/privacysandbox/tools/core/generator/poet/AidlInterfaceSpec.kt +++ b/privacysandbox/tools/tools-core/src/main/java/androidx/privacysandbox/tools/core/generator/poet/AidlInterfaceSpec.kt
@@ -25,20 +25,21 @@ val methods: List, ) : AidlFileSpec { companion object { - fun aidlInterface( - type: Type, - block: Builder.() -> Unit = {} - ): AidlInterfaceSpec { + fun aidlInterface(type: Type, block: Builder.() -> Unit = {}): AidlInterfaceSpec { return Builder(type).also(block).build() } } override val typesToImport: Setget() { - return methods.flatMap { method -> - method.parameters.map { it.type } - .filter { it.requiresImport && it.innerType != type }.map { it.innerType } - }.toSet() + return methods + .flatMap { method -> + method.parameters + .map { it.type } + .filter { it.requiresImport && it.innerType != type } + .map { it.innerType } + } + .toSet() } override val innerContent: String @@ -48,7 +49,8 @@ |oneway interface ${type.simpleName} { | $body |} - """.trimMargin() + """ + .trimMargin() } class Builder(val type: Type) {
diff --git a/privacysandbox/tools/tools-core/src/main/java/androidx/privacysandbox/tools/core/generator/poet/AidlMethodSpec.kt b/privacysandbox/tools/tools-core/src/main/java/androidx/privacysandbox/tools/core/generator/poet/AidlMethodSpec.kt index 5dc0dda..e27ed93 100644 --- a/privacysandbox/tools/tools-core/src/main/java/androidx/privacysandbox/tools/core/generator/poet/AidlMethodSpec.kt +++ b/privacysandbox/tools/tools-core/src/main/java/androidx/privacysandbox/tools/core/generator/poet/AidlMethodSpec.kt
@@ -30,11 +30,10 @@ val parameters: List, val transactionId: Int, ) { - constructor(name: String, parameters: List) : this( - name, - parameters, - aidlTransactionId(name, parameters) - ) + constructor( + name: String, + parameters: List+ ) : this(name, parameters, aidlTransactionId(name, parameters)) override fun toString(): String { val params = parameters.joinToString(", ") @@ -67,10 +66,14 @@ // This method must remain backwards-compatible to ensure SDK compatibility. internal fun aidlTransactionId(name: String, parameters: List ): Int { - val hash = Hashing.farmHashFingerprint64().hashString( - signature(name, parameters), - Charsets.UTF_8, - ).asLong().toULong() + val hash = + Hashing.farmHashFingerprint64() + .hashString( + signature(name, parameters), + Charsets.UTF_8, + ) + .asLong() + .toULong() val maxValue = AIDL_MAX_TRANSACTION_ID - RESERVED_ID_COUNT - JAVA_MAX_METHOD_COUNT + 1UL // toInt is safe because $maxValue is well under 2^32 (in fact, under 2^24) @@ -84,5 +87,4 @@ } // This method must remain backwards-compatible to ensure SDK compatibility. -private fun AidlTypeSpec.signature(): String = - innerType.qualifiedName + (if (isList) "[]" else "") +private fun AidlTypeSpec.signature(): String = innerType.qualifiedName + (if (isList) "[]" else "")
diff --git a/privacysandbox/tools/tools-core/src/main/java/androidx/privacysandbox/tools/core/generator/poet/AidlParcelableSpec.kt b/privacysandbox/tools/tools-core/src/main/java/androidx/privacysandbox/tools/core/generator/poet/AidlParcelableSpec.kt index 3fff06c..c8c4d97 100644 --- a/privacysandbox/tools/tools-core/src/main/java/androidx/privacysandbox/tools/core/generator/poet/AidlParcelableSpec.kt +++ b/privacysandbox/tools/tools-core/src/main/java/androidx/privacysandbox/tools/core/generator/poet/AidlParcelableSpec.kt
@@ -24,17 +24,16 @@ val properties: List, ) : AidlFileSpec { companion object { - fun aidlParcelable( - type: Type, - block: Builder.() -> Unit = {} - ): AidlParcelableSpec { + fun aidlParcelable(type: Type, block: Builder.() -> Unit = {}): AidlParcelableSpec { return Builder(type).also(block).build() } } override val typesToImport: Setget() { - return properties.map { it.type }.filter { it.requiresImport && it.innerType != type } + return properties + .map { it.type } + .filter { it.requiresImport && it.innerType != type } .map { it.innerType } .toSet() } @@ -46,7 +45,8 @@ |parcelable ${type.simpleName} { | $body |} - """.trimMargin() + """ + .trimMargin() } class Builder(val type: Type) {
diff --git a/privacysandbox/tools/tools-core/src/main/java/androidx/privacysandbox/tools/core/model/Models.kt b/privacysandbox/tools/tools-core/src/main/java/androidx/privacysandbox/tools/core/model/Models.kt index 767b03d..33b7d97 100644 --- a/privacysandbox/tools/tools-core/src/main/java/androidx/privacysandbox/tools/core/model/Models.kt +++ b/privacysandbox/tools/tools-core/src/main/java/androidx/privacysandbox/tools/core/model/Models.kt
@@ -25,9 +25,7 @@ fun ParsedApi.hasSuspendFunctions(): Boolean { val annotatedInterfaces = services + interfaces + callbacks - return annotatedInterfaces - .flatMap(AnnotatedInterface::methods) - .any(Method::isSuspend) + return annotatedInterfaces.flatMap(AnnotatedInterface::methods).any(Method::isSuspend) } fun ParsedApi.containsSdkActivityLauncher(): Boolean { @@ -38,11 +36,12 @@ } private fun AnnotatedInterface.containsSdkActivityLauncher(): Boolean { - val isInReturns = methods - .any { it.returnType.qualifiedName == Types.sdkActivityLauncher.qualifiedName } - val isInParams = methods - .flatMap { it.parameters } - .any { it.type.qualifiedName == Types.sdkActivityLauncher.qualifiedName } + val isInReturns = + methods.any { it.returnType.qualifiedName == Types.sdkActivityLauncher.qualifiedName } + val isInParams = + methods + .flatMap { it.parameters } + .any { it.type.qualifiedName == Types.sdkActivityLauncher.qualifiedName } return isInReturns || isInParams } @@ -70,26 +69,26 @@ val bundle = Type("android.os", "Bundle") val sandboxedUiAdapter = Type(packageName = "androidx.privacysandbox.ui.core", simpleName = "SandboxedUiAdapter") - val sdkActivityLauncher = Type( - packageName = "androidx.privacysandbox.activity.core", - simpleName = "SdkActivityLauncher" - ) + val sdkActivityLauncher = + Type( + packageName = "androidx.privacysandbox.activity.core", + simpleName = "SdkActivityLauncher" + ) - fun list(elementType: Type) = Type( - packageName = "kotlin.collections", - simpleName = "List", - typeParameters = listOf(elementType) - ) + fun list(elementType: Type) = + Type( + packageName = "kotlin.collections", + simpleName = "List", + typeParameters = listOf(elementType) + ) fun Type.asNullable(): Type { - if (isNullable) - return this + if (isNullable) return this return copy(isNullable = true) } fun Type.asNonNull(): Type { - if (isNullable) - return copy(isNullable = false) + if (isNullable) return copy(isNullable = false) return this } }
diff --git a/privacysandbox/tools/tools-core/src/main/java/androidx/privacysandbox/tools/core/model/Type.kt b/privacysandbox/tools/tools-core/src/main/java/androidx/privacysandbox/tools/core/model/Type.kt index 70bf1b0..29af572 100644 --- a/privacysandbox/tools/tools-core/src/main/java/androidx/privacysandbox/tools/core/model/Type.kt +++ b/privacysandbox/tools/tools-core/src/main/java/androidx/privacysandbox/tools/core/model/Type.kt
@@ -17,16 +17,16 @@ package androidx.privacysandbox.tools.core.model data class Type( - val packageName: String, - val simpleName: String, - val typeParameters: List= emptyList(), - val isNullable: Boolean = false + val packageName: String, + val simpleName: String, + val typeParameters: List= emptyList(), + val isNullable: Boolean = false ) { - val qualifiedName: String - get() { - if (packageName.isEmpty()) { - return simpleName - } - return "$packageName.$simpleName" - } + val qualifiedName: String + get() { + if (packageName.isEmpty()) { + return simpleName + } + return "$packageName.$simpleName" + } }
diff --git a/privacysandbox/tools/tools-core/src/main/java/androidx/privacysandbox/tools/core/validator/ModelValidator.kt b/privacysandbox/tools/tools-core/src/main/java/androidx/privacysandbox/tools/core/validator/ModelValidator.kt index ebf7efb..2276f03 100644 --- a/privacysandbox/tools/tools-core/src/main/java/androidx/privacysandbox/tools/core/validator/ModelValidator.kt +++ b/privacysandbox/tools/tools-core/src/main/java/androidx/privacysandbox/tools/core/validator/ModelValidator.kt
@@ -184,25 +184,42 @@ } private fun isValidInterfaceParameterType(type: Type) = - isValue(type) || isInterface(type) || isPrimitive(type) || isList(type) || - isCallback(type) || isBundledType(type) + isValue(type) || + isInterface(type) || + isPrimitive(type) || + isList(type) || + isCallback(type) || + isBundledType(type) private fun isValidInterfaceReturnType(type: Type) = - isValue(type) || isInterface(type) || isPrimitive(type) || isList(type) || + isValue(type) || + isInterface(type) || + isPrimitive(type) || + isList(type) || isBundledType(type) private fun isValidValuePropertyType(type: Type) = - isValue(type) || isInterface(type) || isPrimitive(type) || isList(type) || + isValue(type) || + isInterface(type) || + isPrimitive(type) || + isList(type) || isBundledType(type) private fun isValidCallbackParameterType(type: Type) = - isValue(type) || isInterface(type) || isPrimitive(type) || isList(type) || + isValue(type) || + isInterface(type) || + isPrimitive(type) || + isList(type) || isBundledType(type) private fun isValue(type: Type) = values.contains(type.asNonNull()) + private fun isInterface(type: Type) = interfaces.contains(type.asNonNull()) + private fun isCallback(type: Type) = callbacks.contains(type.asNonNull()) + private fun isPrimitive(type: Type) = Types.primitiveTypes.contains(type.asNonNull()) + private fun isList(type: Type): Boolean { if (type.qualifiedName == "kotlin.collections.List") { require(type.typeParameters.size == 1) {
diff --git a/privacysandbox/tools/tools-core/src/test/java/androidx/privacysandbox/tools/core/generator/AidlCallbackGeneratorTest.kt b/privacysandbox/tools/tools-core/src/test/java/androidx/privacysandbox/tools/core/generator/AidlCallbackGeneratorTest.kt index c371493..f51597d 100644 --- a/privacysandbox/tools/tools-core/src/test/java/androidx/privacysandbox/tools/core/generator/AidlCallbackGeneratorTest.kt +++ b/privacysandbox/tools/tools-core/src/test/java/androidx/privacysandbox/tools/core/generator/AidlCallbackGeneratorTest.kt
@@ -34,39 +34,48 @@ @Test fun generate() { - val api = ParsedApi( - services = setOf( - AnnotatedInterface( - type = Type(packageName = "com.mysdk", simpleName = "MySdk"), - methods = listOf( - Method( - name = "doStuff", - parameters = listOf( - Parameter( - "callback", Type("com.mysdk", "MyCallback") + val api = + ParsedApi( + services = + setOf( + AnnotatedInterface( + type = Type(packageName = "com.mysdk", simpleName = "MySdk"), + methods = + listOf( + Method( + name = "doStuff", + parameters = + listOf( + Parameter( + "callback", + Type("com.mysdk", "MyCallback") + ) + ), + returnType = Types.unit, + isSuspend = false, + ), ) - ), - returnType = Types.unit, - isSuspend = false, - ), - ) - ) - ), callbacks = setOf( - AnnotatedInterface( - type = Type(packageName = "com.mysdk", simpleName = "MyCallback"), - methods = listOf( - Method( - name = "onComplete", - parameters = listOf( - Parameter("result", Types.boolean), - ), - returnType = Types.unit, - isSuspend = false, + ) + ), + callbacks = + setOf( + AnnotatedInterface( + type = Type(packageName = "com.mysdk", simpleName = "MyCallback"), + methods = + listOf( + Method( + name = "onComplete", + parameters = + listOf( + Parameter("result", Types.boolean), + ), + returnType = Types.unit, + isSuspend = false, + ) + ) ) ) - ) ) - ) val (aidlGeneratedSources, javaGeneratedSources) = AidlTestHelper.runGenerator(api) Truth.assertThat(javaGeneratedSources.map { it.packageName to it.interfaceName })
diff --git a/privacysandbox/tools/tools-core/src/test/java/androidx/privacysandbox/tools/core/generator/AidlInterfaceGeneratorTest.kt b/privacysandbox/tools/tools-core/src/test/java/androidx/privacysandbox/tools/core/generator/AidlInterfaceGeneratorTest.kt index e3d1714..6260417 100644 --- a/privacysandbox/tools/tools-core/src/test/java/androidx/privacysandbox/tools/core/generator/AidlInterfaceGeneratorTest.kt +++ b/privacysandbox/tools/tools-core/src/test/java/androidx/privacysandbox/tools/core/generator/AidlInterfaceGeneratorTest.kt
@@ -33,58 +33,75 @@ class AidlInterfaceGeneratorTest { @Test fun generate() { - val api = ParsedApi( - services = setOf( - AnnotatedInterface( - type = Type(packageName = "com.mysdk", simpleName = "MySdk"), - methods = listOf( - Method( - name = "methodWithInterfaceParam", - parameters = listOf( - Parameter("myInterface", Type("com.mysdk", "MyInterface")) - ), - returnType = Types.unit, - isSuspend = false, - ), - Method( - name = "suspendMethodWithInterfaceReturn", - parameters = listOf(), - returnType = Type("com.mysdk", "MyInterface"), - isSuspend = true, + val api = + ParsedApi( + services = + setOf( + AnnotatedInterface( + type = Type(packageName = "com.mysdk", simpleName = "MySdk"), + methods = + listOf( + Method( + name = "methodWithInterfaceParam", + parameters = + listOf( + Parameter( + "myInterface", + Type("com.mysdk", "MyInterface") + ) + ), + returnType = Types.unit, + isSuspend = false, + ), + Method( + name = "suspendMethodWithInterfaceReturn", + parameters = listOf(), + returnType = Type("com.mysdk", "MyInterface"), + isSuspend = true, + ) + ) + ) + ), + interfaces = + setOf( + AnnotatedInterface( + type = Type(packageName = "com.mysdk", simpleName = "MyInterface"), + methods = + listOf( + Method( + name = "methodWithInterfaceParam", + parameters = + listOf( + Parameter( + "myInterface", + Type("com.mysdk", "MyInterface") + ) + ), + returnType = Types.unit, + isSuspend = false, + ), + Method( + name = "suspendMethodWithInterfaceReturn", + parameters = listOf(), + returnType = Type("com.mysdk", "MyInterface"), + isSuspend = true, + ), + Method( + name = "methodWithActivityLauncherParam", + parameters = + listOf( + Parameter( + "activityLauncher", + Types.sdkActivityLauncher + ) + ), + returnType = Types.unit, + isSuspend = false, + ), + ) ) ) - ) - ), - interfaces = setOf( - AnnotatedInterface( - type = Type(packageName = "com.mysdk", simpleName = "MyInterface"), - methods = listOf( - Method( - name = "methodWithInterfaceParam", - parameters = listOf( - Parameter("myInterface", Type("com.mysdk", "MyInterface")) - ), - returnType = Types.unit, - isSuspend = false, - ), - Method( - name = "suspendMethodWithInterfaceReturn", - parameters = listOf(), - returnType = Type("com.mysdk", "MyInterface"), - isSuspend = true, - ), - Method( - name = "methodWithActivityLauncherParam", - parameters = listOf( - Parameter("activityLauncher", Types.sdkActivityLauncher) - ), - returnType = Types.unit, - isSuspend = false, - ), - ) - ) ) - ) val (aidlGeneratedSources, javaGeneratedSources) = AidlTestHelper.runGenerator(api) assertThat(javaGeneratedSources.map { it.packageName to it.interfaceName })
diff --git a/privacysandbox/tools/tools-core/src/test/java/androidx/privacysandbox/tools/core/generator/AidlInterfaceSpecTest.kt b/privacysandbox/tools/tools-core/src/test/java/androidx/privacysandbox/tools/core/generator/AidlInterfaceSpecTest.kt index 731b89e..b7ed648 100644 --- a/privacysandbox/tools/tools-core/src/test/java/androidx/privacysandbox/tools/core/generator/AidlInterfaceSpecTest.kt +++ b/privacysandbox/tools/tools-core/src/test/java/androidx/privacysandbox/tools/core/generator/AidlInterfaceSpecTest.kt
@@ -34,9 +34,7 @@ val interfaceBuilder = AidlInterfaceSpec.Builder(Type("com.mysdk", "MySdk")) interfaceBuilder.addMethod(methodA) - val thrown = assertThrows{ - interfaceBuilder.addMethod(methodB) - } + val thrown = assertThrows{ interfaceBuilder.addMethod(methodB) } thrown.hasMessageThat().contains("'methodA'") thrown.hasMessageThat().contains("'methodB'") thrown.hasMessageThat().contains("'MySdk'")
diff --git a/privacysandbox/tools/tools-core/src/test/java/androidx/privacysandbox/tools/core/generator/AidlMethodSpecTest.kt b/privacysandbox/tools/tools-core/src/test/java/androidx/privacysandbox/tools/core/generator/AidlMethodSpecTest.kt index 57bd6bd..51e3345 100644 --- a/privacysandbox/tools/tools-core/src/test/java/androidx/privacysandbox/tools/core/generator/AidlMethodSpecTest.kt +++ b/privacysandbox/tools/tools-core/src/test/java/androidx/privacysandbox/tools/core/generator/AidlMethodSpecTest.kt
@@ -33,27 +33,31 @@ @Test fun automaticallyCreatesTransactionId() { val name = "methodName" - val parameters = listOf( - AidlParameterSpec( - "foo", AidlTypeSpec( - Type("", "boolean"), - AidlTypeKind.PRIMITIVE, - isList = true, - ) - ), - AidlParameterSpec( - "bar", - AidlTypeSpec( - Type("com.mysdk", "IListStringTransactionCallback"), - AidlTypeKind.INTERFACE - ) - ), - ) + val parameters = + listOf( + AidlParameterSpec( + "foo", + AidlTypeSpec( + Type("", "boolean"), + AidlTypeKind.PRIMITIVE, + isList = true, + ) + ), + AidlParameterSpec( + "bar", + AidlTypeSpec( + Type("com.mysdk", "IListStringTransactionCallback"), + AidlTypeKind.INTERFACE + ) + ), + ) val method = AidlMethodSpec(name, parameters) val expectedSignature = "methodName(boolean[],com.mysdk.IListStringTransactionCallback)" val expectedHash = - Hashing.farmHashFingerprint64().hashString(expectedSignature, Charsets.UTF_8).asLong() + Hashing.farmHashFingerprint64() + .hashString(expectedSignature, Charsets.UTF_8) + .asLong() .toULong() val expectedTransactionId = expectedHash % (0xffff9bUL - 100UL - 65535UL)
diff --git a/privacysandbox/tools/tools-core/src/test/java/androidx/privacysandbox/tools/core/generator/AidlServiceGeneratorTest.kt b/privacysandbox/tools/tools-core/src/test/java/androidx/privacysandbox/tools/core/generator/AidlServiceGeneratorTest.kt index b437088..e7b7985 100644 --- a/privacysandbox/tools/tools-core/src/test/java/androidx/privacysandbox/tools/core/generator/AidlServiceGeneratorTest.kt +++ b/privacysandbox/tools/tools-core/src/test/java/androidx/privacysandbox/tools/core/generator/AidlServiceGeneratorTest.kt
@@ -34,53 +34,58 @@ class AidlServiceGeneratorTest { @Test fun generate() { - val api = ParsedApi( - services = setOf( - AnnotatedInterface( - type = Type(packageName = "com.mysdk", simpleName = "MySdk"), - methods = listOf( - Method( - name = "suspendMethodWithReturnValue", - parameters = listOf( - Parameter("a", Types.boolean), - Parameter("b", Types.int), - Parameter("c", Types.long), - Parameter("d", Types.float), - Parameter("e", Types.double), - Parameter("f", Types.char), - Parameter("g", Types.int) - ), - returnType = Types.string, - isSuspend = true, - ), - Method( - name = "suspendMethodWithoutReturnValue", - parameters = listOf(), - returnType = Types.unit, - isSuspend = true, - ), - Method( - name = "suspendMethodWithLists", - parameters = listOf(Parameter("l", Types.list(Types.int))), - returnType = Types.list(Types.string), - isSuspend = true, - ), - Method( - name = "suspendMethodWithNullables", - parameters = listOf(Parameter("maybeInt", Types.int.asNullable())), - returnType = Types.string.asNullable(), - isSuspend = true, - ), - Method( - name = "methodWithoutReturnValue", - parameters = listOf(), - returnType = Types.unit, - isSuspend = false, - ), + val api = + ParsedApi( + services = + setOf( + AnnotatedInterface( + type = Type(packageName = "com.mysdk", simpleName = "MySdk"), + methods = + listOf( + Method( + name = "suspendMethodWithReturnValue", + parameters = + listOf( + Parameter("a", Types.boolean), + Parameter("b", Types.int), + Parameter("c", Types.long), + Parameter("d", Types.float), + Parameter("e", Types.double), + Parameter("f", Types.char), + Parameter("g", Types.int) + ), + returnType = Types.string, + isSuspend = true, + ), + Method( + name = "suspendMethodWithoutReturnValue", + parameters = listOf(), + returnType = Types.unit, + isSuspend = true, + ), + Method( + name = "suspendMethodWithLists", + parameters = listOf(Parameter("l", Types.list(Types.int))), + returnType = Types.list(Types.string), + isSuspend = true, + ), + Method( + name = "suspendMethodWithNullables", + parameters = + listOf(Parameter("maybeInt", Types.int.asNullable())), + returnType = Types.string.asNullable(), + isSuspend = true, + ), + Method( + name = "methodWithoutReturnValue", + parameters = listOf(), + returnType = Types.unit, + isSuspend = false, + ), + ) + ) ) - ) ) - ) val (aidlGeneratedSources, javaGeneratedSources) = AidlTestHelper.runGenerator(api) assertThat(javaGeneratedSources.map { it.packageName to it.interfaceName })
diff --git a/privacysandbox/tools/tools-core/src/test/java/androidx/privacysandbox/tools/core/generator/AidlTestHelper.kt b/privacysandbox/tools/tools-core/src/test/java/androidx/privacysandbox/tools/core/generator/AidlTestHelper.kt index 6c47c92..92876e2 100644 --- a/privacysandbox/tools/tools-core/src/test/java/androidx/privacysandbox/tools/core/generator/AidlTestHelper.kt +++ b/privacysandbox/tools/tools-core/src/test/java/androidx/privacysandbox/tools/core/generator/AidlTestHelper.kt
@@ -27,34 +27,46 @@ internal object AidlTestHelper { fun runGenerator(api: ParsedApi): AidlGenerationOutput { ModelValidator.validate(api).also { - assertWithMessage("Tried to generate AIDL code for invalid interface:\n" + - it.errors.joinToString("\n") - ).that(it.isSuccess).isTrue() + assertWithMessage( + "Tried to generate AIDL code for invalid interface:\n" + + it.errors.joinToString("\n") + ) + .that(it.isSuccess) + .isTrue() } val tmpDir = Files.createTempDirectory("aidlGenerationTest") - val aidlCompilerPath = System.getProperty("aidl_compiler_path")?.let(::Path) - ?: throw IllegalArgumentException("aidl_compiler_path flag not set.") + val aidlCompilerPath = + System.getProperty("aidl_compiler_path")?.let(::Path) + ?: throw IllegalArgumentException("aidl_compiler_path flag not set.") // TODO(b/269458005): Make this a required argument once the fallback is not needed val frameworkAidlPath = System.getProperty("framework_aidl_path")?.let(::Path) val aidlCompiler = AidlCompiler(aidlCompilerPath, frameworkAidlPath) val javaGeneratedSources = AidlGenerator.generate(aidlCompiler, api, tmpDir) assertCompiles( - javaGeneratedSources.map { - Source.java( - "${it.packageName.replace('.', '/')}/${it.interfaceName}", - it.file.readText() - ) - }.toList() + javaGeneratedSources + .map { + Source.java( + "${it.packageName.replace('.', '/')}/${it.interfaceName}", + it.file.readText() + ) + } + .toList() ) - val aidlGeneratedSources = tmpDir.toFile().walk().filter { it.extension == "aidl" } - .map { AidlSource(tmpDir.relativize(it.toPath()).toString(), it.readText()) }.toList() + val aidlGeneratedSources = + tmpDir + .toFile() + .walk() + .filter { it.extension == "aidl" } + .map { AidlSource(tmpDir.relativize(it.toPath()).toString(), it.readText()) } + .toList() return AidlGenerationOutput(aidlGeneratedSources, javaGeneratedSources) } } data class AidlSource(val relativePath: String, val content: String) + data class AidlGenerationOutput( val aidlSources: List, val javaSources: List,
diff --git a/privacysandbox/tools/tools-core/src/test/java/androidx/privacysandbox/tools/core/generator/AidlValueGeneratorTest.kt b/privacysandbox/tools/tools-core/src/test/java/androidx/privacysandbox/tools/core/generator/AidlValueGeneratorTest.kt index b3e0805..a84f5f4 100644 --- a/privacysandbox/tools/tools-core/src/test/java/androidx/privacysandbox/tools/core/generator/AidlValueGeneratorTest.kt +++ b/privacysandbox/tools/tools-core/src/test/java/androidx/privacysandbox/tools/core/generator/AidlValueGeneratorTest.kt
@@ -37,82 +37,96 @@ class AidlValueGeneratorTest { @Test fun generate() { - val innerEnum = AnnotatedEnumClass( - Type(packageName = "com.mysdk", simpleName = "InnerEnum"), - listOf("ONE, TWO, THREE") - ) - val innerValue = AnnotatedDataClass( - Type(packageName = "com.mysdk", simpleName = "InnerValue"), - listOf( - ValueProperty("intProperty", Types.int), - ValueProperty("booleanProperty", Types.boolean), - ValueProperty("longProperty", Types.long), - ValueProperty("maybeFloatProperty", Types.float.asNullable()), - ValueProperty("enumProperty", innerEnum.type), - ValueProperty("bundleProperty", Types.bundle), - ValueProperty("maybeBundleProperty", Types.bundle.asNullable()) + val innerEnum = + AnnotatedEnumClass( + Type(packageName = "com.mysdk", simpleName = "InnerEnum"), + listOf("ONE, TWO, THREE") ) - ) - val outerValue = AnnotatedDataClass( - Type(packageName = "com.mysdk", simpleName = "OuterValue"), - listOf( - ValueProperty("innerValue", innerValue.type), - ValueProperty("innerValueList", Types.list(innerValue.type)), - ValueProperty("maybeInnerValue", innerValue.type.asNullable()), - ) - ) - - val api = ParsedApi( - services = setOf( - AnnotatedInterface( - type = Type(packageName = "com.mysdk", simpleName = "MySdk"), - methods = listOf( - Method( - name = "suspendMethodThatReturnsValue", - parameters = listOf(), - returnType = outerValue.type, - isSuspend = true, - ), - Method( - name = "suspendMethodReceivingValue", - parameters = listOf( - Parameter("inputValue", outerValue.type) - ), - returnType = Types.unit, - isSuspend = true, - ), - Method( - name = "suspendMethodWithListsOfValues", - parameters = listOf( - Parameter("inputValues", Types.list(outerValue.type)) - ), - returnType = Types.list(outerValue.type), - isSuspend = true, - ), - Method( - name = "suspendMethodWithNullableValues", - parameters = listOf( - Parameter("maybeValue", outerValue.type.asNullable()) - ), - returnType = outerValue.type.asNullable(), - isSuspend = true, - ), - Method( - name = "methodReceivingValue", - parameters = listOf( - Parameter( - name = "value", - type = outerValue.type, - ), - ), - returnType = Types.unit, - isSuspend = false, - ) - ) + val innerValue = + AnnotatedDataClass( + Type(packageName = "com.mysdk", simpleName = "InnerValue"), + listOf( + ValueProperty("intProperty", Types.int), + ValueProperty("booleanProperty", Types.boolean), + ValueProperty("longProperty", Types.long), + ValueProperty("maybeFloatProperty", Types.float.asNullable()), + ValueProperty("enumProperty", innerEnum.type), + ValueProperty("bundleProperty", Types.bundle), + ValueProperty("maybeBundleProperty", Types.bundle.asNullable()) ) - ), - values = setOf(innerEnum, innerValue, outerValue) - ) + ) + val outerValue = + AnnotatedDataClass( + Type(packageName = "com.mysdk", simpleName = "OuterValue"), + listOf( + ValueProperty("innerValue", innerValue.type), + ValueProperty("innerValueList", Types.list(innerValue.type)), + ValueProperty("maybeInnerValue", innerValue.type.asNullable()), + ) + ) + + val api = + ParsedApi( + services = + setOf( + AnnotatedInterface( + type = Type(packageName = "com.mysdk", simpleName = "MySdk"), + methods = + listOf( + Method( + name = "suspendMethodThatReturnsValue", + parameters = listOf(), + returnType = outerValue.type, + isSuspend = true, + ), + Method( + name = "suspendMethodReceivingValue", + parameters = + listOf(Parameter("inputValue", outerValue.type)), + returnType = Types.unit, + isSuspend = true, + ), + Method( + name = "suspendMethodWithListsOfValues", + parameters = + listOf( + Parameter( + "inputValues", + Types.list(outerValue.type) + ) + ), + returnType = Types.list(outerValue.type), + isSuspend = true, + ), + Method( + name = "suspendMethodWithNullableValues", + parameters = + listOf( + Parameter( + "maybeValue", + outerValue.type.asNullable() + ) + ), + returnType = outerValue.type.asNullable(), + isSuspend = true, + ), + Method( + name = "methodReceivingValue", + parameters = + listOf( + Parameter( + name = "value", + type = outerValue.type, + ), + ), + returnType = Types.unit, + isSuspend = false, + ) + ) + ) + ), + values = setOf(innerEnum, innerValue, outerValue) + ) val (aidlGeneratedSources, javaGeneratedSources) = AidlTestHelper.runGenerator(api) assertThat(javaGeneratedSources.map { it.packageName to it.interfaceName })
diff --git a/privacysandbox/tools/tools-core/src/test/java/androidx/privacysandbox/tools/core/generator/ClientBinderCodeConverterTest.kt b/privacysandbox/tools/tools-core/src/test/java/androidx/privacysandbox/tools/core/generator/ClientBinderCodeConverterTest.kt index cb70d87..dd57659 100644 --- a/privacysandbox/tools/tools-core/src/test/java/androidx/privacysandbox/tools/core/generator/ClientBinderCodeConverterTest.kt +++ b/privacysandbox/tools/tools-core/src/test/java/androidx/privacysandbox/tools/core/generator/ClientBinderCodeConverterTest.kt
@@ -28,51 +28,60 @@ @RunWith(JUnit4::class) class ClientBinderCodeConverterTest { - private val converter = ClientBinderCodeConverter( - ParsedApi( - services = setOf( - AnnotatedInterface( - type = Type(packageName = "com.mysdk", simpleName = "MySdk"), - ) - ), - values = setOf( - AnnotatedDataClass( - type = Type(packageName = "com.mysdk", simpleName = "Value"), - properties = listOf() - ) - ), - callbacks = setOf( - AnnotatedInterface( - type = Type(packageName = "com.mysdk", simpleName = "Callback"), - ) - ), + private val converter = + ClientBinderCodeConverter( + ParsedApi( + services = + setOf( + AnnotatedInterface( + type = Type(packageName = "com.mysdk", simpleName = "MySdk"), + ) + ), + values = + setOf( + AnnotatedDataClass( + type = Type(packageName = "com.mysdk", simpleName = "Value"), + properties = listOf() + ) + ), + callbacks = + setOf( + AnnotatedInterface( + type = Type(packageName = "com.mysdk", simpleName = "Callback"), + ) + ), + ) ) - ) @Test fun convertToModelCode_primitive() { - assertThat( - converter.convertToModelCode( - Types.int, expression = "5" - ).toString() - ).isEqualTo("5") + assertThat(converter.convertToModelCode(Types.int, expression = "5").toString()) + .isEqualTo("5") } @Test fun convertToModelCode_value() { assertThat( - converter.convertToModelCode( - Type(packageName = "com.mysdk", simpleName = "Value"), expression = "value" - ).toString() - ).isEqualTo("com.mysdk.ValueConverter.fromParcelable(value)") + converter + .convertToModelCode( + Type(packageName = "com.mysdk", simpleName = "Value"), + expression = "value" + ) + .toString() + ) + .isEqualTo("com.mysdk.ValueConverter.fromParcelable(value)") } @Test fun convertToModelCode_callback() { assertThat( - converter.convertToModelCode( - Type(packageName = "com.mysdk", simpleName = "Callback"), expression = "callback" - ).toString() - ).isEqualTo("com.mysdk.CallbackClientProxy(callback, context)") + converter + .convertToModelCode( + Type(packageName = "com.mysdk", simpleName = "Callback"), + expression = "callback" + ) + .toString() + ) + .isEqualTo("com.mysdk.CallbackClientProxy(callback, context)") } }
diff --git a/privacysandbox/tools/tools-core/src/test/java/androidx/privacysandbox/tools/core/generator/ServerBinderCodeConverterTest.kt b/privacysandbox/tools/tools-core/src/test/java/androidx/privacysandbox/tools/core/generator/ServerBinderCodeConverterTest.kt index af76007..9a3ef99 100644 --- a/privacysandbox/tools/tools-core/src/test/java/androidx/privacysandbox/tools/core/generator/ServerBinderCodeConverterTest.kt +++ b/privacysandbox/tools/tools-core/src/test/java/androidx/privacysandbox/tools/core/generator/ServerBinderCodeConverterTest.kt
@@ -28,51 +28,60 @@ @RunWith(JUnit4::class) class ServerBinderCodeConverterTest { - private val converter = ServerBinderCodeConverter( - ParsedApi( - services = setOf( - AnnotatedInterface( - type = Type(packageName = "com.mysdk", simpleName = "MySdk"), - ) - ), - values = setOf( - AnnotatedDataClass( - type = Type(packageName = "com.mysdk", simpleName = "Value"), - properties = listOf() - ) - ), - callbacks = setOf( - AnnotatedInterface( - type = Type(packageName = "com.mysdk", simpleName = "Callback"), - ) - ), + private val converter = + ServerBinderCodeConverter( + ParsedApi( + services = + setOf( + AnnotatedInterface( + type = Type(packageName = "com.mysdk", simpleName = "MySdk"), + ) + ), + values = + setOf( + AnnotatedDataClass( + type = Type(packageName = "com.mysdk", simpleName = "Value"), + properties = listOf() + ) + ), + callbacks = + setOf( + AnnotatedInterface( + type = Type(packageName = "com.mysdk", simpleName = "Callback"), + ) + ), + ) ) - ) @Test fun convertToBinderCode_primitive() { - assertThat( - converter.convertToBinderCode( - Types.int, expression = "5" - ).toString() - ).isEqualTo("5") + assertThat(converter.convertToBinderCode(Types.int, expression = "5").toString()) + .isEqualTo("5") } @Test fun convertToBinderCode_value() { assertThat( - converter.convertToBinderCode( - Type(packageName = "com.mysdk", simpleName = "Value"), expression = "value" - ).toString() - ).isEqualTo("com.mysdk.ValueConverter(context).toParcelable(value)") + converter + .convertToBinderCode( + Type(packageName = "com.mysdk", simpleName = "Value"), + expression = "value" + ) + .toString() + ) + .isEqualTo("com.mysdk.ValueConverter(context).toParcelable(value)") } @Test fun convertToBinderCode_callback() { assertThat( - converter.convertToBinderCode( - Type(packageName = "com.mysdk", simpleName = "Callback"), expression = "callback" - ).toString() - ).isEqualTo("com.mysdk.CallbackStubDelegate(callback)") + converter + .convertToBinderCode( + Type(packageName = "com.mysdk", simpleName = "Callback"), + expression = "callback" + ) + .toString() + ) + .isEqualTo("com.mysdk.CallbackStubDelegate(callback)") } }
diff --git a/privacysandbox/tools/tools-core/src/test/java/androidx/privacysandbox/tools/core/validator/ModelValidatorTest.kt b/privacysandbox/tools/tools-core/src/test/java/androidx/privacysandbox/tools/core/validator/ModelValidatorTest.kt index 38116ce..41bc1e2 100644 --- a/privacysandbox/tools/tools-core/src/test/java/androidx/privacysandbox/tools/core/validator/ModelValidatorTest.kt +++ b/privacysandbox/tools/tools-core/src/test/java/androidx/privacysandbox/tools/core/validator/ModelValidatorTest.kt
@@ -35,454 +35,531 @@ class ModelValidatorTest { @Test fun validModel_ok() { - val api = ParsedApi( - services = setOf( - AnnotatedInterface( - type = Type(packageName = "com.mysdk", simpleName = "MySdk"), - methods = listOf( - Method( - name = "doStuff", - parameters = listOf( - Parameter( - name = "x", - type = Types.int - ), - Parameter( - name = "nullableY", - type = Types.int.asNullable() - ), - Parameter( - name = "foo", - type = Type(packageName = "com.mysdk", simpleName = "Foo") - ), - Parameter( - name = "callback", - type = Type( - packageName = "com.mysdk", - simpleName = "MySdkCallback" + val api = + ParsedApi( + services = + setOf( + AnnotatedInterface( + type = Type(packageName = "com.mysdk", simpleName = "MySdk"), + methods = + listOf( + Method( + name = "doStuff", + parameters = + listOf( + Parameter(name = "x", type = Types.int), + Parameter( + name = "nullableY", + type = Types.int.asNullable() + ), + Parameter( + name = "foo", + type = + Type( + packageName = "com.mysdk", + simpleName = "Foo" + ) + ), + Parameter( + name = "callback", + type = + Type( + packageName = "com.mysdk", + simpleName = "MySdkCallback" + ) + ), + Parameter( + name = "myInterface", + type = + Type( + packageName = "com.mysdk", + simpleName = "MyInterface" + ) + ), + ), + returnType = Types.string, + isSuspend = true, + ), + Method( + name = "fireAndForget", + parameters = listOf(), + returnType = Types.unit, + isSuspend = false, ) - ), - Parameter( - name = "myInterface", - type = Type( - packageName = "com.mysdk", - simpleName = "MyInterface" - ) - ), - ), - returnType = Types.string, - isSuspend = true, - ), - Method( - name = "fireAndForget", - parameters = listOf(), - returnType = Types.unit, - isSuspend = false, - ) - ) - ) - ), - values = setOf( - AnnotatedDataClass( - type = Type(packageName = "com.mysdk", simpleName = "Foo"), - properties = listOf( - ValueProperty( - name = "bar", - type = Type(packageName = "com.mysdk", simpleName = "Bar"), + ) ) ), - ), - AnnotatedDataClass( - type = Type(packageName = "com.mysdk", simpleName = "Bar"), - properties = emptyList(), - ) - ), - callbacks = setOf( - AnnotatedInterface( - type = Type(packageName = "com.mysdk", simpleName = "MySdkCallback"), - methods = listOf( - Method( - name = "onComplete", - parameters = listOf( - Parameter( - name = "result", - type = Types.int - ), - ), - returnType = Types.unit, - isSuspend = false, - ), - ) - ) - ), - interfaces = setOf( - AnnotatedInterface( - type = Type(packageName = "com.mysdk", simpleName = "MyInterface"), - methods = listOf( - Method( - name = "doStuff", - parameters = listOf( - Parameter( - name = "x", - type = Types.int - ), - Parameter( - name = "foo", - type = Type(packageName = "com.mysdk", simpleName = "Foo") - ), - Parameter( - name = "callback", - type = Type( - packageName = "com.mysdk", - simpleName = "MySdkCallback" + values = + setOf( + AnnotatedDataClass( + type = Type(packageName = "com.mysdk", simpleName = "Foo"), + properties = + listOf( + ValueProperty( + name = "bar", + type = Type(packageName = "com.mysdk", simpleName = "Bar"), ) ), - ), - returnType = Types.string, - isSuspend = true, ), - Method( - name = "fireAndForget", - parameters = listOf(), - returnType = Types.unit, - isSuspend = false, + AnnotatedDataClass( + type = Type(packageName = "com.mysdk", simpleName = "Bar"), + properties = emptyList(), ) - ) - ) - ), - ) + ), + callbacks = + setOf( + AnnotatedInterface( + type = Type(packageName = "com.mysdk", simpleName = "MySdkCallback"), + methods = + listOf( + Method( + name = "onComplete", + parameters = + listOf( + Parameter(name = "result", type = Types.int), + ), + returnType = Types.unit, + isSuspend = false, + ), + ) + ) + ), + interfaces = + setOf( + AnnotatedInterface( + type = Type(packageName = "com.mysdk", simpleName = "MyInterface"), + methods = + listOf( + Method( + name = "doStuff", + parameters = + listOf( + Parameter(name = "x", type = Types.int), + Parameter( + name = "foo", + type = + Type( + packageName = "com.mysdk", + simpleName = "Foo" + ) + ), + Parameter( + name = "callback", + type = + Type( + packageName = "com.mysdk", + simpleName = "MySdkCallback" + ) + ), + ), + returnType = Types.string, + isSuspend = true, + ), + Method( + name = "fireAndForget", + parameters = listOf(), + returnType = Types.unit, + isSuspend = false, + ) + ) + ) + ), + ) assertThat(ModelValidator.validate(api).isSuccess).isTrue() } @Test fun multipleServices_throws() { - val api = ParsedApi( - services = setOf( - AnnotatedInterface(type = Type(packageName = "com.mysdk", simpleName = "MySdk")), - AnnotatedInterface(type = Type(packageName = "com.mysdk", simpleName = "MySdk2")), + val api = + ParsedApi( + services = + setOf( + AnnotatedInterface( + type = Type(packageName = "com.mysdk", simpleName = "MySdk") + ), + AnnotatedInterface( + type = Type(packageName = "com.mysdk", simpleName = "MySdk2") + ), + ) ) - ) val validationResult = ModelValidator.validate(api) assertThat(validationResult.isFailure).isTrue() - assertThat(validationResult.errors).containsExactly( - "Multiple services are not supported. Found: com.mysdk.MySdk, com.mysdk.MySdk2." - ) + assertThat(validationResult.errors) + .containsExactly( + "Multiple services are not supported. Found: com.mysdk.MySdk, com.mysdk.MySdk2." + ) } @Test fun serviceExtendsUiAdapter_throws() { - val api = ParsedApi( - services = setOf( - AnnotatedInterface( - type = Type(packageName = "com.mysdk", simpleName = "MySdk"), - superTypes = listOf(Types.sandboxedUiAdapter), - ), + val api = + ParsedApi( + services = + setOf( + AnnotatedInterface( + type = Type(packageName = "com.mysdk", simpleName = "MySdk"), + superTypes = listOf(Types.sandboxedUiAdapter), + ), + ) ) - ) val validationResult = ModelValidator.validate(api) assertThat(validationResult.isFailure).isTrue() - assertThat(validationResult.errors).containsExactly( - "Interfaces annotated with @PrivacySandboxService may not extend any other " + - "interface. To define a SandboxedUiAdapter, use @PrivacySandboxInterface and " + - "return it from this service." - ) + assertThat(validationResult.errors) + .containsExactly( + "Interfaces annotated with @PrivacySandboxService may not extend any other " + + "interface. To define a SandboxedUiAdapter, use @PrivacySandboxInterface and " + + "return it from this service." + ) } @Test fun nonSuspendFunctionReturningValue_throws() { - val api = ParsedApi( - services = setOf( - AnnotatedInterface( - type = Type(packageName = "com.mysdk", simpleName = "MySdk"), - methods = listOf( - Method( - name = "returnSomethingNow", - parameters = listOf(), - returnType = Types.string, - isSuspend = false, - ), - Method( - name = "returnSomethingElseNow", - parameters = listOf(), - returnType = Types.int, - isSuspend = false, - ), - Method( - name = "returnNothingNow", - parameters = listOf(), - returnType = Types.unit, - isSuspend = false, - ), - Method( - name = "returnSomethingLater", - parameters = listOf(), - returnType = Types.string, - isSuspend = true, + val api = + ParsedApi( + services = + setOf( + AnnotatedInterface( + type = Type(packageName = "com.mysdk", simpleName = "MySdk"), + methods = + listOf( + Method( + name = "returnSomethingNow", + parameters = listOf(), + returnType = Types.string, + isSuspend = false, + ), + Method( + name = "returnSomethingElseNow", + parameters = listOf(), + returnType = Types.int, + isSuspend = false, + ), + Method( + name = "returnNothingNow", + parameters = listOf(), + returnType = Types.unit, + isSuspend = false, + ), + Method( + name = "returnSomethingLater", + parameters = listOf(), + returnType = Types.string, + isSuspend = true, + ), + ), ), ), - ), - ), - interfaces = setOf( - AnnotatedInterface( - type = Type(packageName = "com.mysdk", simpleName = "MySdkInterface"), - methods = listOf( - Method( - name = "returnSomethingInInterface", - parameters = listOf(), - returnType = Types.string, - isSuspend = false, + interfaces = + setOf( + AnnotatedInterface( + type = Type(packageName = "com.mysdk", simpleName = "MySdkInterface"), + methods = + listOf( + Method( + name = "returnSomethingInInterface", + parameters = listOf(), + returnType = Types.string, + isSuspend = false, + ) + ) + ) + ), + callbacks = + setOf( + AnnotatedInterface( + type = Type(packageName = "com.mysdk", simpleName = "MySdkCallback"), + methods = + listOf( + Method( + name = "returnSomethingInCallback", + parameters = listOf(), + returnType = Types.string, + isSuspend = false, + ) + ) ) ) - ) - ), - callbacks = setOf( - AnnotatedInterface( - type = Type(packageName = "com.mysdk", simpleName = "MySdkCallback"), - methods = listOf( - Method( - name = "returnSomethingInCallback", - parameters = listOf(), - returnType = Types.string, - isSuspend = false, - ) - ) - ) ) - ) val validationResult = ModelValidator.validate(api) assertThat(validationResult.isFailure).isTrue() - assertThat(validationResult.errors).containsExactly( - "Error in com.mysdk.MySdk.returnSomethingNow: functions with return values " + - "should be suspending functions.", - "Error in com.mysdk.MySdk.returnSomethingElseNow: functions with return values " + - "should be suspending functions.", - "Error in com.mysdk.MySdkInterface.returnSomethingInInterface: " + - "functions with return values should be suspending functions.", - "Error in com.mysdk.MySdkCallback.returnSomethingInCallback: " + - "functions with return values should be suspending functions." - ) + assertThat(validationResult.errors) + .containsExactly( + "Error in com.mysdk.MySdk.returnSomethingNow: functions with return values " + + "should be suspending functions.", + "Error in com.mysdk.MySdk.returnSomethingElseNow: functions with return values " + + "should be suspending functions.", + "Error in com.mysdk.MySdkInterface.returnSomethingInInterface: " + + "functions with return values should be suspending functions.", + "Error in com.mysdk.MySdkCallback.returnSomethingInCallback: " + + "functions with return values should be suspending functions." + ) } @Test fun invalidParameterOrReturnType_throws() { - val api = ParsedApi( - services = setOf( - AnnotatedInterface( - type = Type(packageName = "com.mysdk", simpleName = "MySdk"), - methods = listOf( - Method( - name = "returnFoo", - parameters = listOf(), - returnType = Type(packageName = "com.mysdk", simpleName = "Foo"), - isSuspend = true, + val api = + ParsedApi( + services = + setOf( + AnnotatedInterface( + type = Type(packageName = "com.mysdk", simpleName = "MySdk"), + methods = + listOf( + Method( + name = "returnFoo", + parameters = listOf(), + returnType = + Type(packageName = "com.mysdk", simpleName = "Foo"), + isSuspend = true, + ), + Method( + name = "receiveFoo", + parameters = + listOf( + Parameter( + name = "foo", + type = + Type( + packageName = "com.mysdk", + simpleName = "Foo" + ) + ) + ), + returnType = Types.unit, + isSuspend = true, + ), + ), ), - Method( - name = "receiveFoo", - parameters = listOf( - Parameter( - name = "foo", - type = Type(packageName = "com.mysdk", simpleName = "Foo") - ) - ), - returnType = Types.unit, - isSuspend = true, - ), - ), - ), + ) ) - ) val validationResult = ModelValidator.validate(api) assertThat(validationResult.isFailure).isTrue() - assertThat(validationResult.errors).containsExactly( - "Error in com.mysdk.MySdk.returnFoo: only primitives, lists, data/enum classes " + - "annotated with @PrivacySandboxValue, interfaces annotated with " + - "@PrivacySandboxInterface, and SdkActivityLaunchers are supported as return types.", - "Error in com.mysdk.MySdk.receiveFoo: only primitives, lists, data/enum classes " + - "annotated with @PrivacySandboxValue, interfaces annotated with " + - "@PrivacySandboxCallback or @PrivacySandboxInterface, and SdkActivityLaunchers " + - "are supported as parameter types." - ) + assertThat(validationResult.errors) + .containsExactly( + "Error in com.mysdk.MySdk.returnFoo: only primitives, lists, data/enum classes " + + "annotated with @PrivacySandboxValue, interfaces annotated with " + + "@PrivacySandboxInterface, and SdkActivityLaunchers are supported as return types.", + "Error in com.mysdk.MySdk.receiveFoo: only primitives, lists, data/enum classes " + + "annotated with @PrivacySandboxValue, interfaces annotated with " + + "@PrivacySandboxCallback or @PrivacySandboxInterface, and SdkActivityLaunchers " + + "are supported as parameter types." + ) } @Test fun nestedList_throws() { - val api = ParsedApi( - services = setOf( - AnnotatedInterface( - type = Type(packageName = "com.mysdk", simpleName = "MySdk"), - methods = listOf( - Method( - name = "processNestedList", - parameters = listOf( - Parameter( - name = "foo", - type = Types.list(Types.list(Types.int)) - ) - ), - returnType = Types.unit, - isSuspend = true, + val api = + ParsedApi( + services = + setOf( + AnnotatedInterface( + type = Type(packageName = "com.mysdk", simpleName = "MySdk"), + methods = + listOf( + Method( + name = "processNestedList", + parameters = + listOf( + Parameter( + name = "foo", + type = Types.list(Types.list(Types.int)) + ) + ), + returnType = Types.unit, + isSuspend = true, + ), + ), ), - ), - ), + ) ) - ) val validationResult = ModelValidator.validate(api) assertThat(validationResult.isFailure).isTrue() - assertThat(validationResult.errors).containsExactly( - "Invalid type parameter in list, found kotlin.collections.List." - ) + assertThat(validationResult.errors) + .containsExactly("Invalid type parameter in list, found kotlin.collections.List.") } @Test fun listWithNullable_throws() { - val api = ParsedApi( - services = setOf( - AnnotatedInterface( - type = Type(packageName = "com.mysdk", simpleName = "MySdk"), - methods = listOf( - Method( - name = "processNestedList", - parameters = listOf( - Parameter( - name = "foo", - type = Types.list(Types.int.asNullable()) - ) - ), - returnType = Types.unit, - isSuspend = true, + val api = + ParsedApi( + services = + setOf( + AnnotatedInterface( + type = Type(packageName = "com.mysdk", simpleName = "MySdk"), + methods = + listOf( + Method( + name = "processNestedList", + parameters = + listOf( + Parameter( + name = "foo", + type = Types.list(Types.int.asNullable()) + ) + ), + returnType = Types.unit, + isSuspend = true, + ), + ), ), - ), - ), + ) ) - ) val validationResult = ModelValidator.validate(api) assertThat(validationResult.isFailure).isTrue() - assertThat(validationResult.errors).containsExactly( - "Nullable type parameters are not supported in lists, found kotlin.Int" - ) + assertThat(validationResult.errors) + .containsExactly( + "Nullable type parameters are not supported in lists, found kotlin.Int" + ) } @Test fun valueWithIllegalProperty_throws() { - val api = ParsedApi( - services = setOf( - AnnotatedInterface(type = Type(packageName = "com.mysdk", simpleName = "MySdk")), - ), - values = setOf( - AnnotatedDataClass( - type = Type(packageName = "com.mysdk", simpleName = "Foo"), - properties = listOf( - ValueProperty("bar", Type("com.mysdk", "Bar")) + val api = + ParsedApi( + services = + setOf( + AnnotatedInterface( + type = Type(packageName = "com.mysdk", simpleName = "MySdk") + ), + ), + values = + setOf( + AnnotatedDataClass( + type = Type(packageName = "com.mysdk", simpleName = "Foo"), + properties = listOf(ValueProperty("bar", Type("com.mysdk", "Bar"))) + ) ) - ) ) - ) val validationResult = ModelValidator.validate(api) assertThat(validationResult.isFailure).isTrue() - assertThat(validationResult.errors).containsExactly( - "Error in com.mysdk.Foo.bar: only primitives, lists, data/enum classes annotated " + - "with @PrivacySandboxValue, interfaces annotated with @PrivacySandboxInterface, " + - "and SdkActivityLaunchers are supported as properties." - ) + assertThat(validationResult.errors) + .containsExactly( + "Error in com.mysdk.Foo.bar: only primitives, lists, data/enum classes annotated " + + "with @PrivacySandboxValue, interfaces annotated with @PrivacySandboxInterface, " + + "and SdkActivityLaunchers are supported as properties." + ) } @Test fun callbackReceivingCallbacks_throws() { - val api = ParsedApi( - services = setOf( - AnnotatedInterface(type = Type(packageName = "com.mysdk", simpleName = "MySdk")), - ), - callbacks = setOf( - AnnotatedInterface( - type = Type(packageName = "com.mysdk", simpleName = "MySdkCallback"), - methods = listOf( - Method( - name = "foo", - parameters = listOf( - Parameter("otherCallback", Type("com.mysdk", "MySdkCallback")) - ), - returnType = Types.unit, - isSuspend = false, + val api = + ParsedApi( + services = + setOf( + AnnotatedInterface( + type = Type(packageName = "com.mysdk", simpleName = "MySdk") ), + ), + callbacks = + setOf( + AnnotatedInterface( + type = Type(packageName = "com.mysdk", simpleName = "MySdkCallback"), + methods = + listOf( + Method( + name = "foo", + parameters = + listOf( + Parameter( + "otherCallback", + Type("com.mysdk", "MySdkCallback") + ) + ), + returnType = Types.unit, + isSuspend = false, + ), + ) + ) ) - ) ) - ) val validationResult = ModelValidator.validate(api) assertThat(validationResult.isFailure).isTrue() - assertThat(validationResult.errors).containsExactly( - "Error in com.mysdk.MySdkCallback.foo: only primitives, lists, data/enum classes " + - "annotated with @PrivacySandboxValue, interfaces annotated with " + - "@PrivacySandboxInterface, and SdkActivityLaunchers are supported as callback " + - "parameter types." - ) + assertThat(validationResult.errors) + .containsExactly( + "Error in com.mysdk.MySdkCallback.foo: only primitives, lists, data/enum classes " + + "annotated with @PrivacySandboxValue, interfaces annotated with " + + "@PrivacySandboxInterface, and SdkActivityLaunchers are supported as callback " + + "parameter types." + ) } @Test fun propertyWithKeywordName_throws() { - val api = ParsedApi( - services = setOf( - AnnotatedInterface(type = Type(packageName = "com.mysdk", simpleName = "MySdk")), - ), - values = setOf( - AnnotatedDataClass( - type = Type(packageName = "com.mysdk", simpleName = "Foo"), - properties = listOf( - ValueProperty("import", Types.int) + val api = + ParsedApi( + services = + setOf( + AnnotatedInterface( + type = Type(packageName = "com.mysdk", simpleName = "MySdk") + ), + ), + values = + setOf( + AnnotatedDataClass( + type = Type(packageName = "com.mysdk", simpleName = "Foo"), + properties = listOf(ValueProperty("import", Types.int)) + ) ) - ) ) - ) val validationResult = ModelValidator.validate(api) assertThat(validationResult.isFailure).isTrue() - assertThat(validationResult.errors).containsExactly( - "Error in com.mysdk.Foo.import: property name must not be a Java keyword." - ) + assertThat(validationResult.errors) + .containsExactly( + "Error in com.mysdk.Foo.import: property name must not be a Java keyword." + ) } @Test fun enumConstantWithKeywordName_throws() { - val api = ParsedApi( - services = setOf( - AnnotatedInterface(type = Type(packageName = "com.mysdk", simpleName = "MySdk")), - ), - values = setOf( - AnnotatedEnumClass( - type = Type(packageName = "com.mysdk", simpleName = "Foo"), - variants = listOf( - "boolean" + val api = + ParsedApi( + services = + setOf( + AnnotatedInterface( + type = Type(packageName = "com.mysdk", simpleName = "MySdk") + ), + ), + values = + setOf( + AnnotatedEnumClass( + type = Type(packageName = "com.mysdk", simpleName = "Foo"), + variants = listOf("boolean") + ) ) - ) ) - ) val validationResult = ModelValidator.validate(api) assertThat(validationResult.isFailure).isTrue() - assertThat(validationResult.errors).containsExactly( - "Error in com.mysdk.Foo.boolean: enum constant name must not be a Java keyword." - ) + assertThat(validationResult.errors) + .containsExactly( + "Error in com.mysdk.Foo.boolean: enum constant name must not be a Java keyword." + ) } @Test fun methodWithKeywordName_throws() { - val api = ParsedApi( - services = setOf( - AnnotatedInterface( - type = Type(packageName = "com.mysdk", simpleName = "MySdk"), - methods = listOf( - Method( - name = "char", - parameters = listOf(), - returnType = Types.unit, - isSuspend = false, - ) - ) - ), - ), - ) + val api = + ParsedApi( + services = + setOf( + AnnotatedInterface( + type = Type(packageName = "com.mysdk", simpleName = "MySdk"), + methods = + listOf( + Method( + name = "char", + parameters = listOf(), + returnType = Types.unit, + isSuspend = false, + ) + ) + ), + ), + ) val validationResult = ModelValidator.validate(api) assertThat(validationResult.isFailure).isTrue() - assertThat(validationResult.errors).containsExactly( - "Error in com.mysdk.MySdk.char: method name must not be a Java keyword." - ) + assertThat(validationResult.errors) + .containsExactly( + "Error in com.mysdk.MySdk.char: method name must not be a Java keyword." + ) } }
diff --git a/privacysandbox/tools/tools-testing/src/main/java/androidx/privacysandbox/tools/testing/AbstractDiffTest.kt b/privacysandbox/tools/tools-testing/src/main/java/androidx/privacysandbox/tools/testing/AbstractDiffTest.kt index 7c71899..1c59d9d 100644 --- a/privacysandbox/tools/tools-testing/src/main/java/androidx/privacysandbox/tools/testing/AbstractDiffTest.kt +++ b/privacysandbox/tools/tools-testing/src/main/java/androidx/privacysandbox/tools/testing/AbstractDiffTest.kt
@@ -36,8 +36,9 @@ /** * Generates the sources and stores them in the given [outputDirectory]. + * * @param inputSources List of input sources read from the test-data directory with - * [subdirectoryName]. + * [subdirectoryName]. */ abstract fun generateSources( inputSources: List, @@ -59,8 +60,7 @@ @Test fun generatedSourcesHaveExpectedContents() { val expectedSourcesPath = "src/test/test-data/$subdirectoryName/output" - val expectedKotlinSources = - loadSourcesFromDirectory(File(expectedSourcesPath)) + val expectedKotlinSources = loadSourcesFromDirectory(File(expectedSourcesPath)) val expectedRelativePaths = expectedKotlinSources.map(Source::relativePath) + relativePathsToExpectedAidlClasses @@ -70,21 +70,27 @@ val actualRelativePathMap = generatedSources.associateBy(Source::relativePath) for (expectedKotlinSource in expectedKotlinSources) { val outputFilePath = "$outputDir/${expectedKotlinSource.relativePath}" - val goldenPath = System.getProperty("user.dir") + "/" + expectedSourcesPath + "/" + - expectedKotlinSource.relativePath + val goldenPath = + System.getProperty("user.dir") + + "/" + + expectedSourcesPath + + "/" + + expectedKotlinSource.relativePath Truth.assertWithMessage( - "Contents of generated file ${expectedKotlinSource.relativePath} don't " + - "match golden.\n" + - "Approval command:\n" + - "cp $outputFilePath $goldenPath" - ).that(actualRelativePathMap[expectedKotlinSource.relativePath]?.contents) + "Contents of generated file ${expectedKotlinSource.relativePath} don't " + + "match golden.\n" + + "Approval command:\n" + + "cp $outputFilePath $goldenPath" + ) + .that(actualRelativePathMap[expectedKotlinSource.relativePath]?.contents) .isEqualTo(expectedKotlinSource.contents) } } private val outputDir: Path by lazy { requireNotNull(System.getProperty("test_output_dir")) { - "test_output_dir not set for diff test." - }.let { Path(it).resolve(subdirectoryName) } + "test_output_dir not set for diff test." + } + .let { Path(it).resolve(subdirectoryName) } } }
diff --git a/privacysandbox/tools/tools-testing/src/main/java/androidx/privacysandbox/tools/testing/CompilationTestHelper.kt b/privacysandbox/tools/tools-testing/src/main/java/androidx/privacysandbox/tools/testing/CompilationTestHelper.kt index 777c33f..51bcaed 100644 --- a/privacysandbox/tools/tools-testing/src/main/java/androidx/privacysandbox/tools/testing/CompilationTestHelper.kt +++ b/privacysandbox/tools/tools-testing/src/main/java/androidx/privacysandbox/tools/testing/CompilationTestHelper.kt
@@ -73,20 +73,19 @@ val actualRelativePathMap = actualKotlinSources.associateBy(Source::relativePath) for (expectedKotlinSource in expectedKotlinSources) { assertWithMessage( - "Contents of generated file ${expectedKotlinSource.relativePath} don't " + - "match golden." - ).that(actualRelativePathMap[expectedKotlinSource.relativePath]?.contents) + "Contents of generated file ${expectedKotlinSource.relativePath} don't " + + "match golden." + ) + .that(actualRelativePathMap[expectedKotlinSource.relativePath]?.contents) .isEqualTo(expectedKotlinSource.contents) } } class CompilationResultSubject(private val result: TestCompilationResult) { fun succeeds() { - assertWithMessage( - "Unexpected errors:\n${getFullErrorMessages().joinToString("\n")}" - ).that( - result.success && getRawErrorMessages().isEmpty() - ).isTrue() + assertWithMessage("Unexpected errors:\n${getFullErrorMessages().joinToString("\n")}") + .that(result.success && getRawErrorMessages().isEmpty()) + .isTrue() } fun hasAllExpectedGeneratedSourceFilesAndContent( @@ -125,13 +124,14 @@ private fun getShortErrorMessages() = result.diagnostics[Diagnostic.Kind.ERROR]?.map(DiagnosticMessage::msg) - private fun getFullErrorMessages() = - getRawErrorMessages().map { it.toFormattedMessage() } + private fun getFullErrorMessages() = getRawErrorMessages().map { it.toFormattedMessage() } - private fun DiagnosticMessage.toFormattedMessage() = """ + private fun DiagnosticMessage.toFormattedMessage() = + """ |$kind: $msg |${location?.toFormattedLocation()}$ - """.trimMargin() + """ + .trimMargin() private fun DiagnosticLocation.toFormattedLocation(): String { if (source == null) return "Location information missing" @@ -139,7 +139,8 @@ |Location: ${source!!.relativePath}:$line |File: |${contentsHighlightingLine(source!!.contents, line)} - """.trimMargin() + """ + .trimMargin() } private fun contentsHighlightingLine(contents: String, line: Int): String {
diff --git a/privacysandbox/tools/tools-testing/src/main/java/androidx/privacysandbox/tools/testing/TestDataHelper.kt b/privacysandbox/tools/tools-testing/src/main/java/androidx/privacysandbox/tools/testing/TestDataHelper.kt index c75b770..9433e81 100644 --- a/privacysandbox/tools/tools-testing/src/main/java/androidx/privacysandbox/tools/testing/TestDataHelper.kt +++ b/privacysandbox/tools/tools-testing/src/main/java/androidx/privacysandbox/tools/testing/TestDataHelper.kt
@@ -23,18 +23,24 @@ fun loadSourcesFromDirectory(directory: File): List{ check(directory.exists()) { "${directory.path} doesn't exist." } check(directory.isDirectory) { "${directory.path} is not a directory." } - return directory.walk().filter { it.isFile }.map { - val relativePath = directory.toPath().relativize(it.toPath()).toString() - val qualifiedName = relativePath.removeSuffix(".${it.extension}").replace('/', '.') - Source.load(file = it, qName = qualifiedName, relativePath = relativePath) - }.toList() + return directory + .walk() + .filter { it.isFile } + .map { + val relativePath = directory.toPath().relativize(it.toPath()).toString() + val qualifiedName = relativePath.removeSuffix(".${it.extension}").replace('/', '.') + Source.load(file = it, qName = qualifiedName, relativePath = relativePath) + } + .toList() } /** Load files in the given directory as pairs. */ fun loadFilesFromDirectory(directory: File): List> { check(directory.exists()) { "${directory.path} doesn't exist." } check(directory.isDirectory) { "${directory.path} is not a directory." } - return directory.walk().filter { it.isFile }.map { - directory.toPath().relativize(it.toPath()).toString() to it.readText() - }.toList() + return directory + .walk() + .filter { it.isFile } + .map { directory.toPath().relativize(it.toPath()).toString() to it.readText() } + .toList() }
diff --git a/privacysandbox/tools/tools-testing/src/main/java/androidx/privacysandbox/tools/testing/TestEnvironment.kt b/privacysandbox/tools/tools-testing/src/main/java/androidx/privacysandbox/tools/testing/TestEnvironment.kt index 6fc122f..27d704a 100644 --- a/privacysandbox/tools/tools-testing/src/main/java/androidx/privacysandbox/tools/testing/TestEnvironment.kt +++ b/privacysandbox/tools/tools-testing/src/main/java/androidx/privacysandbox/tools/testing/TestEnvironment.kt
@@ -19,11 +19,15 @@ import kotlin.io.path.Path object TestEnvironment { - val aidlCompilerPath = requireNotNull(System.getProperty("aidl_compiler_path")) { - "aidl_compiler_path flag not set" - }.let(::Path) + val aidlCompilerPath = + requireNotNull(System.getProperty("aidl_compiler_path")) { + "aidl_compiler_path flag not set" + } + .let(::Path) - val frameworkAidlPath = requireNotNull(System.getProperty("framework_aidl_path")) { - "framework_aidl_path flag not set." - }.let(::Path) + val frameworkAidlPath = + requireNotNull(System.getProperty("framework_aidl_path")) { + "framework_aidl_path flag not set." + } + .let(::Path) }
diff --git a/privacysandbox/tools/tools/src/main/java/androidx/privacysandbox/tools/PrivacySandboxInterface.kt b/privacysandbox/tools/tools/src/main/java/androidx/privacysandbox/tools/PrivacySandboxInterface.kt index 618796a..829a1a6 100644 --- a/privacysandbox/tools/tools/src/main/java/androidx/privacysandbox/tools/PrivacySandboxInterface.kt +++ b/privacysandbox/tools/tools/src/main/java/androidx/privacysandbox/tools/PrivacySandboxInterface.kt
@@ -24,10 +24,10 @@ * Functions in a [PrivacySandboxInterface] annotated interface must obey the following rules: * - Functions with return values must suspend * - Parameter types may be primitives, [PrivacySandboxValue], [PrivacySandboxCallback], - * [PrivacySandboxInterface], or lists of primitives or [PrivacySandboxValue]. Nullable types - * are allowed. - * - Return types may be primitives, [PrivacySandboxValue], [PrivacySandboxInterface], or lists - * of primitives or [PrivacySandboxValue]. Nullable types are allowed. + * [PrivacySandboxInterface], or lists of primitives or [PrivacySandboxValue]. Nullable types are + * allowed. + * - Return types may be primitives, [PrivacySandboxValue], [PrivacySandboxInterface], or lists of + * primitives or [PrivacySandboxValue]. Nullable types are allowed. * * Suspend functions operate as follows: * - The main thread is used by default
diff --git a/privacysandbox/tools/tools/src/main/java/androidx/privacysandbox/tools/PrivacySandboxService.kt b/privacysandbox/tools/tools/src/main/java/androidx/privacysandbox/tools/PrivacySandboxService.kt index c458af4..c5f4857 100644 --- a/privacysandbox/tools/tools/src/main/java/androidx/privacysandbox/tools/PrivacySandboxService.kt +++ b/privacysandbox/tools/tools/src/main/java/androidx/privacysandbox/tools/PrivacySandboxService.kt
@@ -16,11 +16,12 @@ package androidx.privacysandbox.tools -/** Entry point for an SDK service running in the Privacy Sandbox. +/** + * Entry point for an SDK service running in the Privacy Sandbox. * * There must be exactly one interface annotated with @PrivacySandboxService in your SDK module. - * This will be the first point of communication once the app has successfully loaded your SDK - * in the Privacy Sandbox. + * This will be the first point of communication once the app has successfully loaded your SDK in + * the Privacy Sandbox. * * On the SDK side, the tools will generate a class called `AbstractSandboxedSdkProviderCompat`, * containing an abstract factory method to create this service. This must be implemented by SDK
diff --git a/privacysandbox/tools/tools/src/main/java/androidx/privacysandbox/tools/internal/GeneratedPublicApi.kt b/privacysandbox/tools/tools/src/main/java/androidx/privacysandbox/tools/internal/GeneratedPublicApi.kt index 407b429..baa56ef 100644 --- a/privacysandbox/tools/tools/src/main/java/androidx/privacysandbox/tools/internal/GeneratedPublicApi.kt +++ b/privacysandbox/tools/tools/src/main/java/androidx/privacysandbox/tools/internal/GeneratedPublicApi.kt
@@ -19,8 +19,8 @@ import androidx.annotation.RestrictTo /** - * Indicates that a class was generated by the API Compiler and is part of the public facing - * SDK API. + * Indicates that a class was generated by the API Compiler and is part of the public facing SDK + * API. * * The API Packager will include these classes in the API descriptors. *
diff --git a/privacysandbox/ui/integration-tests/sdkproviderutils/src/main/java/androidx/privacysandbox/ui/integration/sdkproviderutils/TestAdapters.kt b/privacysandbox/ui/integration-tests/sdkproviderutils/src/main/java/androidx/privacysandbox/ui/integration/sdkproviderutils/TestAdapters.kt index a15c30f..5aa2efa 100644 --- a/privacysandbox/ui/integration-tests/sdkproviderutils/src/main/java/androidx/privacysandbox/ui/integration/sdkproviderutils/TestAdapters.kt +++ b/privacysandbox/ui/integration-tests/sdkproviderutils/src/main/java/androidx/privacysandbox/ui/integration/sdkproviderutils/TestAdapters.kt
@@ -70,14 +70,15 @@ ) { sessionClientExecutor = clientExecutor sessionClient = client - Handler(Looper.getMainLooper()).post(Runnable lambda@{ - Log.d(TAG, "Session requested") - val adView: View = buildAdView(context) ?: return@lambda - adView.layoutParams = ViewGroup.LayoutParams(initialWidth, initialHeight) - clientExecutor.execute { - client.onSessionOpened(BannerAdSession(adView)) - } - }) + Handler(Looper.getMainLooper()) + .post( + Runnable lambda@{ + Log.d(TAG, "Session requested") + val adView: View = buildAdView(context) ?: return@lambda + adView.layoutParams = ViewGroup.LayoutParams(initialWidth, initialHeight) + clientExecutor.execute { client.onSessionOpened(BannerAdSession(adView)) } + } + ) } private inner class BannerAdSession(private val adView: View) : SandboxedUiAdapter.Session { @@ -107,15 +108,16 @@ inner class WebViewBannerAd() : BannerAd() { private fun isAirplaneModeOn(): Boolean { return Settings.Global.getInt( - sdkContext.contentResolver, Settings.Global.AIRPLANE_MODE_ON, 0) != 0 + sdkContext.contentResolver, + Settings.Global.AIRPLANE_MODE_ON, + 0 + ) != 0 } override fun buildAdView(sessionContext: Context): View? { if (isAirplaneModeOn()) { sessionClientExecutor.execute { - sessionClient.onSessionError( - Throwable("Cannot load WebView in airplane mode.") - ) + sessionClient.onSessionError(Throwable("Cannot load WebView in airplane mode.")) } return null } @@ -129,10 +131,11 @@ inner class LocalViewBannerAd() : BannerAd() { override fun buildAdView(sessionContext: Context): View { val webView = WebView(sessionContext) - val assetLoader = WebViewAssetLoader.Builder() - .addPathHandler("/assets/", WebViewAssetLoader.AssetsPathHandler(sdkContext)) - .addPathHandler("/res/", WebViewAssetLoader.ResourcesPathHandler(sdkContext)) - .build() + val assetLoader = + WebViewAssetLoader.Builder() + .addPathHandler("/assets/", WebViewAssetLoader.AssetsPathHandler(sdkContext)) + .addPathHandler("/res/", WebViewAssetLoader.ResourcesPathHandler(sdkContext)) + .build() webView.webViewClient = LocalContentWebViewClient(assetLoader) customizeWebViewSettings(webView.settings) webView.loadUrl(LOCAL_WEB_VIEW_URL) @@ -146,8 +149,7 @@ private val text: String ) : View(context) { - private val viewColor = Color - .rgb((0..255).random(), (0..255).random(), (0..255).random()) + private val viewColor = Color.rgb((0..255).random(), (0..255).random(), (0..255).random()) @SuppressLint("BanThreadSleep") override fun onDraw(canvas: Canvas) { @@ -176,20 +178,17 @@ private inner class LocalContentWebViewClient(private val assetLoader: WebViewAssetLoader) : WebViewClientCompat() { - override fun shouldInterceptRequest( - view: WebView, - request: WebResourceRequest - ): WebResourceResponse? { - return assetLoader.shouldInterceptRequest(request.url) - } + override fun shouldInterceptRequest( + view: WebView, + request: WebResourceRequest + ): WebResourceResponse? { + return assetLoader.shouldInterceptRequest(request.url) + } - @Deprecated("Deprecated in Java") - override fun shouldInterceptRequest( - view: WebView, - url: String - ): WebResourceResponse? { - return assetLoader.shouldInterceptRequest(Uri.parse(url)) - } + @Deprecated("Deprecated in Java") + override fun shouldInterceptRequest(view: WebView, url: String): WebResourceResponse? { + return assetLoader.shouldInterceptRequest(Uri.parse(url)) + } } private fun customizeWebViewSettings(settings: WebSettings) { @@ -211,6 +210,6 @@ private const val TAG = "TestSandboxSdk" private const val GOOGLE_URL = "https://www.google.com/" private const val LOCAL_WEB_VIEW_URL = - "https://appassets.androidplatform.net/assets/www/webview-test.html" + "https://appassets.androidplatform.net/assets/www/webview-test.html" } }
diff --git a/privacysandbox/ui/integration-tests/testapp/src/main/java/androidx/privacysandbox/ui/integration/testapp/AppOwnedMediateeSdkApi.kt b/privacysandbox/ui/integration-tests/testapp/src/main/java/androidx/privacysandbox/ui/integration/testapp/AppOwnedMediateeSdkApi.kt index 431d9a8..79119bb 100644 --- a/privacysandbox/ui/integration-tests/testapp/src/main/java/androidx/privacysandbox/ui/integration/testapp/AppOwnedMediateeSdkApi.kt +++ b/privacysandbox/ui/integration-tests/testapp/src/main/java/androidx/privacysandbox/ui/integration/testapp/AppOwnedMediateeSdkApi.kt
@@ -22,8 +22,7 @@ import androidx.privacysandbox.ui.integration.testaidl.IAppOwnedMediateeSdkApi import androidx.privacysandbox.ui.provider.toCoreLibInfo -class AppOwnedMediateeSdkApi(val sdkContext: Context) : - IAppOwnedMediateeSdkApi.Stub() { +class AppOwnedMediateeSdkApi(val sdkContext: Context) : IAppOwnedMediateeSdkApi.Stub() { private val mTestAdapters = TestAdapters(sdkContext) override fun loadTestAdWithWaitInsideOnDraw(text: String): Bundle {
diff --git a/privacysandbox/ui/integration-tests/testapp/src/main/java/androidx/privacysandbox/ui/integration/testapp/BaseFragment.kt b/privacysandbox/ui/integration-tests/testapp/src/main/java/androidx/privacysandbox/ui/integration/testapp/BaseFragment.kt index ff3d7a4c..b0c0c3e 100644 --- a/privacysandbox/ui/integration-tests/testapp/src/main/java/androidx/privacysandbox/ui/integration/testapp/BaseFragment.kt +++ b/privacysandbox/ui/integration-tests/testapp/src/main/java/androidx/privacysandbox/ui/integration/testapp/BaseFragment.kt
@@ -34,9 +34,9 @@ /** * Base fragment to be used for testing different manual flows. * - * Create a new subclass of this for each independent flow you wish to test. There will only be - * one active fragment in the app's main activity at any time. Use [getSdkApi] to get a handle - * to the SDK. + * Create a new subclass of this for each independent flow you wish to test. There will only be one + * active fragment in the app's main activity at any time. Use [getSdkApi] to get a handle to the + * SDK. */ abstract class BaseFragment : Fragment() { private lateinit var sdkApi: ISdkApi @@ -58,9 +58,7 @@ } } - /** - * Returns a handle to the already loaded SDK. - */ + /** Returns a handle to the already loaded SDK. */ fun getSdkApi(): ISdkApi { return sdkApi } @@ -80,10 +78,10 @@ } /** - * Called when the app's drawer layout state changes. When called, change the Z-order of - * any [SandboxedSdkView] owned by the fragment to ensure that the remote UI is not drawn over - * the drawer. If the drawer is open, move all remote views to Z-below, otherwise move them - * to Z-above. + * Called when the app's drawer layout state changes. When called, change the Z-order of any + * [SandboxedSdkView] owned by the fragment to ensure that the remote UI is not drawn over the + * drawer. If the drawer is open, move all remote views to Z-below, otherwise move them to + * Z-above. */ abstract fun handleDrawerStateChange(isDrawerOpen: Boolean)
diff --git a/privacysandbox/ui/integration-tests/testapp/src/main/java/androidx/privacysandbox/ui/integration/testapp/MainActivity.kt b/privacysandbox/ui/integration-tests/testapp/src/main/java/androidx/privacysandbox/ui/integration/testapp/MainActivity.kt index d9ea292..c596b92 100644 --- a/privacysandbox/ui/integration-tests/testapp/src/main/java/androidx/privacysandbox/ui/integration/testapp/MainActivity.kt +++ b/privacysandbox/ui/integration-tests/testapp/src/main/java/androidx/privacysandbox/ui/integration/testapp/MainActivity.kt
@@ -70,8 +70,11 @@ initializeDrawer() } catch (e: LoadSdkCompatException) { Log.i( - TAG, "loadSdk failed with errorCode: " + e.loadSdkErrorCode + - " and errorMsg: " + e.message + TAG, + "loadSdk failed with errorCode: " + + e.loadSdkErrorCode + + " and errorMsg: " + + e.message ) } } @@ -90,27 +93,27 @@ } private fun initializeDrawer() { - drawerLayout.addDrawerListener(object : DrawerListener { - override fun onDrawerSlide(drawerView: View, slideOffset: Float) { - } + drawerLayout.addDrawerListener( + object : DrawerListener { + override fun onDrawerSlide(drawerView: View, slideOffset: Float) {} - override fun onDrawerOpened(drawerView: View) { - // we handle this in the button onClick instead - } + override fun onDrawerOpened(drawerView: View) { + // we handle this in the button onClick instead + } - override fun onDrawerClosed(drawerView: View) { - currentFragment.handleDrawerStateChange(false) - } + override fun onDrawerClosed(drawerView: View) { + currentFragment.handleDrawerStateChange(false) + } - override fun onDrawerStateChanged(newState: Int) { + override fun onDrawerStateChanged(newState: Int) {} } - }) + ) navigationView.setNavigationItemSelectedListener { val itemId = it.itemId when (itemId) { R.id.item_main -> switchContentFragment(MainFragment(), it.title) - R.id.item_pooling_container -> switchContentFragment(PoolingContainerFragment(), - it.title) + R.id.item_pooling_container -> + switchContentFragment(PoolingContainerFragment(), it.title) R.id.item_sandbox_death -> switchContentFragment(SandboxDeathFragment(), it.title) else -> { Log.e(TAG, "Invalid fragment option") @@ -122,23 +125,19 @@ private fun switchContentFragment(fragment: BaseFragment, title: CharSequence?): Boolean { drawerLayout.closeDrawers() - supportFragmentManager.beginTransaction() - .replace(R.id.content_fragment_container, fragment).commit() + supportFragmentManager + .beginTransaction() + .replace(R.id.content_fragment_container, fragment) + .commit() currentFragment = fragment - title?.let { - runOnUiThread { - setTitle(it) - } - } + title?.let { runOnUiThread { setTitle(it) } } return true } companion object { private const val TAG = "TestSandboxClient" - /** - * Name of the SDK to be loaded. - */ + /** Name of the SDK to be loaded. */ private const val SDK_NAME = "androidx.privacysandbox.ui.integration.testsdkprovider" private const val MEDIATEE_SDK_NAME = "androidx.privacysandbox.ui.integration.mediateesdkprovider"
diff --git a/privacysandbox/ui/integration-tests/testapp/src/main/java/androidx/privacysandbox/ui/integration/testapp/MainFragment.kt b/privacysandbox/ui/integration-tests/testapp/src/main/java/androidx/privacysandbox/ui/integration/testapp/MainFragment.kt index fb5e0b9..1e2e5d5 100644 --- a/privacysandbox/ui/integration-tests/testapp/src/main/java/androidx/privacysandbox/ui/integration/testapp/MainFragment.kt +++ b/privacysandbox/ui/integration-tests/testapp/src/main/java/androidx/privacysandbox/ui/integration/testapp/MainFragment.kt
@@ -80,13 +80,14 @@ // Supply the mediation_option array to the mediationDropDownMenu spinner. ArrayAdapter.createFromResource( - this.requireContext(), - R.array.mediation_dropdown_menu_array, - android.R.layout.simple_spinner_item - ).also { adapter -> - adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item) - mediationDropDownMenu.adapter = adapter - } + this.requireContext(), + R.array.mediation_dropdown_menu_array, + android.R.layout.simple_spinner_item + ) + .also { adapter -> + adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item) + mediationDropDownMenu.adapter = adapter + } loadWebViewBannerAd() loadBottomBannerAd() @@ -96,45 +97,43 @@ private fun loadWebViewBannerAd() { webViewBannerView.addStateChangedListener() webViewBannerView.setAdapter( - SandboxedUiAdapterFactory.createFromCoreLibInfo( - sdkApi.loadLocalWebViewAd() - )) + SandboxedUiAdapterFactory.createFromCoreLibInfo(sdkApi.loadLocalWebViewAd()) + ) localWebViewToggle.setOnCheckedChangeListener { _: View, isChecked: Boolean -> if (isChecked) { webViewBannerView.setAdapter( - SandboxedUiAdapterFactory.createFromCoreLibInfo( - sdkApi.loadLocalWebViewAd() - )) + SandboxedUiAdapterFactory.createFromCoreLibInfo(sdkApi.loadLocalWebViewAd()) + ) } else { webViewBannerView.setAdapter( - SandboxedUiAdapterFactory.createFromCoreLibInfo( - sdkApi.loadWebViewAd() - )) + SandboxedUiAdapterFactory.createFromCoreLibInfo(sdkApi.loadWebViewAd()) + ) } } } private fun loadBottomBannerAd() { bottomBannerView.addStateChangedListener() - bottomBannerView.layoutParams = inflatedView.findViewById( - R.id.bottom_banner_container).layoutParams + bottomBannerView.layoutParams = + inflatedView.findViewById(R.id.bottom_banner_container).layoutParams requireActivity().runOnUiThread { - inflatedView.findViewById( - R.id.bottom_banner_container).addView(bottomBannerView) + inflatedView + .findViewById(R.id.bottom_banner_container) + .addView(bottomBannerView) } bottomBannerView.setAdapter( - SandboxedUiAdapterFactory.createFromCoreLibInfo( - sdkApi.loadTestAd(/*text=*/ "Hey!") - )) + SandboxedUiAdapterFactory.createFromCoreLibInfo(sdkApi.loadTestAd(/* text= */ "Hey!")) + ) } private fun loadResizableBannerAd() { resizableBannerView.addStateChangedListener() resizableBannerView.setAdapter( SandboxedUiAdapterFactory.createFromCoreLibInfo( - sdkApi.loadTestAdWithWaitInsideOnDraw(/*text=*/ "Resizable View") - )) + sdkApi.loadTestAdWithWaitInsideOnDraw(/* text= */ "Resizable View") + ) + ) var count = 1 newAdButton.setOnClickListener { @@ -143,19 +142,21 @@ val selectedMediationOptionId = mediationDropDownMenu.selectedItemId val mediationEnabled = selectedMediationOptionId == MediationOption.RUNTIME_RUNTIME.ordinal.toLong() || - selectedMediationOptionId == MediationOption.RUNTIME_APP.ordinal.toLong() + selectedMediationOptionId == MediationOption.RUNTIME_APP.ordinal.toLong() val appOwnedMediationEnabled = selectedMediationOptionId == MediationOption.RUNTIME_APP.ordinal.toLong() if (mediationEnabled) { resizableBannerView.setAdapter( SandboxedUiAdapterFactory.createFromCoreLibInfo( sdkApi.loadMediatedTestAd(count, appOwnedMediationEnabled) - )) + ) + ) } else { resizableBannerView.setAdapter( SandboxedUiAdapterFactory.createFromCoreLibInfo( - sdkApi.loadTestAdWithWaitInsideOnDraw(/*text=*/ "Ad #$count") - )) + sdkApi.loadTestAdWithWaitInsideOnDraw(/* text= */ "Ad #$count") + ) + ) } count++ }
diff --git a/privacysandbox/ui/integration-tests/testapp/src/main/java/androidx/privacysandbox/ui/integration/testapp/PoolingContainerFragment.kt b/privacysandbox/ui/integration-tests/testapp/src/main/java/androidx/privacysandbox/ui/integration/testapp/PoolingContainerFragment.kt index a7bddcc..7b9f6ab 100644 --- a/privacysandbox/ui/integration-tests/testapp/src/main/java/androidx/privacysandbox/ui/integration/testapp/PoolingContainerFragment.kt +++ b/privacysandbox/ui/integration-tests/testapp/src/main/java/androidx/privacysandbox/ui/integration/testapp/PoolingContainerFragment.kt
@@ -68,14 +68,16 @@ inner class ViewHolder(view: View) : RecyclerView.ViewHolder(view) { val sandboxedSdkView: SandboxedSdkView + init { sandboxedSdkView = view.findViewById(R.id.recyclerview_ad_view) } } override fun onCreateViewHolder(viewGroup: ViewGroup, viewType: Int): ViewHolder { - val view = LayoutInflater.from(viewGroup.context) - .inflate(R.layout.recyclerview_row_item, viewGroup, false) + val view = + LayoutInflater.from(viewGroup.context) + .inflate(R.layout.recyclerview_row_item, viewGroup, false) return ViewHolder(view) } @@ -84,7 +86,7 @@ if (!sandboxedSdkViewSet.contains(childSandboxedSdkView)) { childSandboxedSdkView.setAdapter( SandboxedUiAdapterFactory.createFromCoreLibInfo( - sdkApi.loadTestAd(/*text=*/ "PoolingContainer Ad #$position") + sdkApi.loadTestAd(/* text= */ "PoolingContainer Ad #$position") ) ) sandboxedSdkViewSet.add(childSandboxedSdkView)
diff --git a/privacysandbox/ui/integration-tests/testapp/src/main/java/androidx/privacysandbox/ui/integration/testapp/SandboxDeathFragment.kt b/privacysandbox/ui/integration-tests/testapp/src/main/java/androidx/privacysandbox/ui/integration/testapp/SandboxDeathFragment.kt index 2c85ccd..6b8ae491 100644 --- a/privacysandbox/ui/integration-tests/testapp/src/main/java/androidx/privacysandbox/ui/integration/testapp/SandboxDeathFragment.kt +++ b/privacysandbox/ui/integration-tests/testapp/src/main/java/androidx/privacysandbox/ui/integration/testapp/SandboxDeathFragment.kt
@@ -33,6 +33,7 @@ override fun handleDrawerStateChange(isDrawerOpen: Boolean) { sandboxedSdkView.orderProviderUiAboveClientUi(!isDrawerOpen) } + override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, @@ -48,10 +49,9 @@ sandboxedSdkView = inflatedView.findViewById(R.id.remote_view) sandboxedSdkView.addStateChangedListener() sandboxedSdkView.setAdapter( - SandboxedUiAdapterFactory.createFromCoreLibInfo(sdkApi.loadTestAd("Test Ad"))) + SandboxedUiAdapterFactory.createFromCoreLibInfo(sdkApi.loadTestAd("Test Ad")) + ) val unloadSdksButton: Button = inflatedView.findViewById(R.id.unload_all_sdks_button) - unloadSdksButton.setOnClickListener { - unloadAllSdks() - } + unloadSdksButton.setOnClickListener { unloadAllSdks() } } }
diff --git a/privacysandbox/ui/integration-tests/testsdkprovider/src/main/java/androidx/privacysandbox/ui/integration/testsdkprovider/SdkApi.kt b/privacysandbox/ui/integration-tests/testsdkprovider/src/main/java/androidx/privacysandbox/ui/integration/testsdkprovider/SdkApi.kt index 462dccf..b680112 100644 --- a/privacysandbox/ui/integration-tests/testsdkprovider/src/main/java/androidx/privacysandbox/ui/integration/testsdkprovider/SdkApi.kt +++ b/privacysandbox/ui/integration-tests/testsdkprovider/src/main/java/androidx/privacysandbox/ui/integration/testsdkprovider/SdkApi.kt
@@ -52,16 +52,17 @@ return MediatedBannerAd(mediateeBannerAdBundle).toCoreLibInfo(sdkContext) } - override fun requestResize(width: Int, height: Int) { - } + override fun requestResize(width: Int, height: Int) {} private inner class MediatedBannerAd(private val mediateeBannerAdBundle: Bundle?) : TestAdapters.BannerAd() { override fun buildAdView(sessionContext: Context): View { if (mediateeBannerAdBundle == null) { - return testAdapters.TestBannerAdWithWaitInsideOnDraw( - "Mediated SDK is not loaded, this is a mediator Ad!" - ).buildAdView(sdkContext) + return testAdapters + .TestBannerAdWithWaitInsideOnDraw( + "Mediated SDK is not loaded, this is a mediator Ad!" + ) + .buildAdView(sdkContext) } val view = SandboxedSdkView(sdkContext) @@ -71,31 +72,28 @@ } } - private fun getMediateeBannerAdBundle( - count: Int, - isAppMediatee: Boolean - ): Bundle? { - val sdkSandboxControllerCompat = SdkSandboxControllerCompat - .from(testAdapters.sdkContext) + private fun getMediateeBannerAdBundle(count: Int, isAppMediatee: Boolean): Bundle? { + val sdkSandboxControllerCompat = SdkSandboxControllerCompat.from(testAdapters.sdkContext) if (isAppMediatee) { - val appOwnedSdkSandboxInterfaces = sdkSandboxControllerCompat - .getAppOwnedSdkSandboxInterfaces() - appOwnedSdkSandboxInterfaces.forEach { - appOwnedSdkSandboxInterfaceCompat -> + val appOwnedSdkSandboxInterfaces = + sdkSandboxControllerCompat.getAppOwnedSdkSandboxInterfaces() + appOwnedSdkSandboxInterfaces.forEach { appOwnedSdkSandboxInterfaceCompat -> if (appOwnedSdkSandboxInterfaceCompat.getName().equals(MEDIATEE_SDK)) { - val appOwnedMediateeSdkApi = IAppOwnedMediateeSdkApi.Stub - .asInterface(appOwnedSdkSandboxInterfaceCompat.getInterface()) - return appOwnedMediateeSdkApi - .loadTestAdWithWaitInsideOnDraw("AppOwnedMediation #$count") + val appOwnedMediateeSdkApi = + IAppOwnedMediateeSdkApi.Stub.asInterface( + appOwnedSdkSandboxInterfaceCompat.getInterface() + ) + return appOwnedMediateeSdkApi.loadTestAdWithWaitInsideOnDraw( + "AppOwnedMediation #$count" + ) } } } else { val sandboxedSdks = sdkSandboxControllerCompat.getSandboxedSdks() - sandboxedSdks.forEach { - sandboxedSdkCompat -> + sandboxedSdks.forEach { sandboxedSdkCompat -> if (sandboxedSdkCompat.getSdkInfo()?.name.equals(MEDIATEE_SDK)) { - val mediateeSdkApi = IMediateeSdkApi.Stub - .asInterface(sandboxedSdkCompat.getInterface()) + val mediateeSdkApi = + IMediateeSdkApi.Stub.asInterface(sandboxedSdkCompat.getInterface()) return mediateeSdkApi.loadTestAdWithWaitInsideOnDraw("Mediation #$count") } }
diff --git a/privacysandbox/ui/ui-client/src/androidTest/java/androidx/privacysandbox/ui/client/test/CreateSdkActivityLauncherTest.kt b/privacysandbox/ui/ui-client/src/androidTest/java/androidx/privacysandbox/ui/client/test/CreateSdkActivityLauncherTest.kt index 829a41a..ec039e5 100644 --- a/privacysandbox/ui/ui-client/src/androidTest/java/androidx/privacysandbox/ui/client/test/CreateSdkActivityLauncherTest.kt +++ b/privacysandbox/ui/ui-client/src/androidTest/java/androidx/privacysandbox/ui/client/test/CreateSdkActivityLauncherTest.kt
@@ -45,11 +45,9 @@ @SmallTest @SdkSuppress(minSdkVersion = Build.VERSION_CODES.UPSIDE_DOWN_CAKE, codeName = "UpsideDownCake") class CreateSdkActivityLauncherTest { - @get:Rule - var activityScenarioRule = ActivityScenarioRule(UiLibActivity::class.java) + @get:Rule var activityScenarioRule = ActivityScenarioRule(UiLibActivity::class.java) - @get:Rule - var intentsRule = IntentsRule() + @get:Rule var intentsRule = IntentsRule() private val sdkSandboxActivityMatcher = hasAction(`is`("android.app.sdksandbox.action.START_SANDBOXED_ACTIVITY"))
diff --git a/privacysandbox/ui/ui-client/src/androidTest/java/androidx/privacysandbox/ui/client/test/SandboxedSdkViewTest.kt b/privacysandbox/ui/ui-client/src/androidTest/java/androidx/privacysandbox/ui/client/test/SandboxedSdkViewTest.kt index 264ce53..eec0931 100644 --- a/privacysandbox/ui/ui-client/src/androidTest/java/androidx/privacysandbox/ui/client/test/SandboxedSdkViewTest.kt +++ b/privacysandbox/ui/ui-client/src/androidTest/java/androidx/privacysandbox/ui/client/test/SandboxedSdkViewTest.kt
@@ -76,8 +76,7 @@ private var mainLayoutWidth = -1 private var mainLayoutHeight = -1 - @get:Rule - var activityScenarioRule = ActivityScenarioRule(UiLibActivity::class.java) + @get:Rule var activityScenarioRule = ActivityScenarioRule(UiLibActivity::class.java) class FailingTestSandboxedUiAdapter : SandboxedUiAdapter { override fun openSession( @@ -119,8 +118,7 @@ client: SandboxedUiAdapter.SessionClient ) { internalClient = client - testSession = - TestSession(context, initialWidth, initialHeight) + testSession = TestSession(context, initialWidth, initialHeight) if (!delayOpenSessionCallback) { client.onSessionOpened(testSession!!) } @@ -177,8 +175,7 @@ configChangedLatch.countDown() } - override fun close() { - } + override fun close() {} } } @@ -199,10 +196,11 @@ view = SandboxedSdkView(this) stateChangedListener = StateChangedListener() view.addStateChangedListener(stateChangedListener) - layoutParams = LinearLayout.LayoutParams( - LinearLayout.LayoutParams.WRAP_CONTENT, - LinearLayout.LayoutParams.WRAP_CONTENT - ) + layoutParams = + LinearLayout.LayoutParams( + LinearLayout.LayoutParams.WRAP_CONTENT, + LinearLayout.LayoutParams.WRAP_CONTENT + ) view.layoutParams = layoutParams testSandboxedUiAdapter = TestSandboxedUiAdapter() view.setAdapter(testSandboxedUiAdapter) @@ -333,9 +331,7 @@ view.orderProviderUiAboveClientUi(false) val session = testSandboxedUiAdapter.testSession!! assertThat(session.zOrderChangedLatch.await(TIMEOUT, TimeUnit.MILLISECONDS)).isFalse() - activityScenarioRule.withActivity { - testSandboxedUiAdapter.sendOnSessionOpened() - } + activityScenarioRule.withActivity { testSandboxedUiAdapter.sendOnSessionOpened() } // After session has opened, the pending Z order changed made while loading is notified // th the session. @@ -350,13 +346,17 @@ testSandboxedUiAdapter.assertSessionOpened() // newWindow() will be triggered by a window state change, even if the activity handles // orientation changes without recreating the activity. - device.performActionAndWait({ - device.setOrientationLeft() - }, Until.newWindow(), UI_INTENSIVE_TIMEOUT) + device.performActionAndWait( + { device.setOrientationLeft() }, + Until.newWindow(), + UI_INTENSIVE_TIMEOUT + ) testSandboxedUiAdapter.assertSessionOpened() - device.performActionAndWait({ - device.setOrientationNatural() - }, Until.newWindow(), UI_INTENSIVE_TIMEOUT) + device.performActionAndWait( + { device.setOrientationNatural() }, + Until.newWindow(), + UI_INTENSIVE_TIMEOUT + ) } @Test @@ -397,8 +397,12 @@ val rightShift = 10 val upperShift = 30 activityScenarioRule.withActivity { - view.layout(view.left + rightShift, view.top - upperShift, - view.right + rightShift, view.bottom - upperShift) + view.layout( + view.left + rightShift, + view.top - upperShift, + view.right + rightShift, + view.bottom - upperShift + ) } assertThat(testSandboxedUiAdapter.wasNotifyResizedCalled()).isFalse() } @@ -408,22 +412,22 @@ val globalLayoutLatch = CountDownLatch(1) lateinit var layout: LinearLayout activityScenarioRule.withActivity { - layout = findViewById( - R.id.mainlayout - ) + layout = findViewById(R.id.mainlayout) layout.addView(view) } testSandboxedUiAdapter.assertSessionOpened() testSandboxedUiAdapter.testSession?.requestSizeChange(layout.width, layout.height) val observer = view.viewTreeObserver - observer.addOnGlobalLayoutListener(object : ViewTreeObserver.OnGlobalLayoutListener { - override fun onGlobalLayout() { - if (view.width == layout.width && view.height == layout.height) { - globalLayoutLatch.countDown() - observer.removeOnGlobalLayoutListener(this) + observer.addOnGlobalLayoutListener( + object : ViewTreeObserver.OnGlobalLayoutListener { + override fun onGlobalLayout() { + if (view.width == layout.width && view.height == layout.height) { + globalLayoutLatch.countDown() + observer.removeOnGlobalLayoutListener(this) + } } } - }) + ) globalLayoutLatch.await(TIMEOUT, TimeUnit.MILLISECONDS) assertTrue(view.width == layout.width && view.height == layout.height) } @@ -439,14 +443,13 @@ @Test fun sandboxedSdkViewInflatesTransitionGroup() { activityScenarioRule.withActivity { - val view = layoutInflater.inflate( - R.layout.sandboxedsdkview_transition_group_false, - null, - false - ) as ViewGroup - assertFalse( - "XML overrides SandboxedSdkView.isTransitionGroup", view.isTransitionGroup - ) + val view = + layoutInflater.inflate( + R.layout.sandboxedsdkview_transition_group_false, + null, + false + ) as ViewGroup + assertFalse("XML overrides SandboxedSdkView.isTransitionGroup", view.isTransitionGroup) } } @@ -472,16 +475,13 @@ surfaceViewLatch.countDown() } - override fun onViewDetachedFromWindow(p0: View) { - } + override fun onViewDetachedFromWindow(p0: View) {} } ) // Attach SurfaceView activityScenarioRule.withActivity { - layout = findViewById( - R.id.mainlayout - ) + layout = findViewById(R.id.mainlayout) layout.addView(surfaceView) layout.removeView(surfaceView) } @@ -558,7 +558,8 @@ /* requestedWidth=*/ mainLayoutWidth - 100, /* requestedHeight=*/ mainLayoutHeight - 100, /* expectedWidth=*/ mainLayoutWidth - 100, - /* expectedHeight=*/ mainLayoutHeight - 100) + /* expectedHeight=*/ mainLayoutHeight - 100 + ) } @Test @@ -570,7 +571,8 @@ /* requestedWidth=*/ mainLayoutWidth + 100, /* requestedHeight=*/ mainLayoutHeight + 100, /* expectedWidth=*/ mainLayoutWidth, - /* expectedHeight=*/ mainLayoutHeight) + /* expectedHeight=*/ mainLayoutHeight + ) } @Test @@ -584,7 +586,8 @@ /* requestedWidth=*/ currentWidth - 100, /* requestedHeight=*/ currentHeight - 100, /* expectedWidth=*/ currentWidth, - /* expectedHeight=*/ currentHeight) + /* expectedHeight=*/ currentHeight + ) } private fun addViewToLayout(waitToBeActive: Boolean = false) { @@ -623,9 +626,7 @@ height = bottom - top layoutLatch.countDown() } - activityScenarioRule.withActivity { - view.requestSize(requestedWidth, requestedHeight) - } + activityScenarioRule.withActivity { view.requestSize(requestedWidth, requestedHeight) } assertThat(layoutLatch.await(TIMEOUT, TimeUnit.MILLISECONDS)).isTrue() assertThat(width).isEqualTo(expectedWidth) assertThat(height).isEqualTo(expectedHeight)
diff --git a/privacysandbox/ui/ui-client/src/main/java/androidx/privacysandbox/ui/client/SandboxedUiAdapterFactory.kt b/privacysandbox/ui/ui-client/src/main/java/androidx/privacysandbox/ui/client/SandboxedUiAdapterFactory.kt index 20896b8..0eb7423 100644 --- a/privacysandbox/ui/ui-client/src/main/java/androidx/privacysandbox/ui/client/SandboxedUiAdapterFactory.kt +++ b/privacysandbox/ui/ui-client/src/main/java/androidx/privacysandbox/ui/client/SandboxedUiAdapterFactory.kt
@@ -53,25 +53,25 @@ /** * @throws IllegalArgumentException if {@code coreLibInfo} does not contain a Binder with the - * key UI_ADAPTER_BINDER + * key UI_ADAPTER_BINDER */ fun createFromCoreLibInfo(coreLibInfo: Bundle): SandboxedUiAdapter { - val uiAdapterBinder = requireNotNull(coreLibInfo.getBinder(UI_ADAPTER_BINDER)) { - "Invalid bundle, missing $UI_ADAPTER_BINDER." - } - val adapterInterface = ISandboxedUiAdapter.Stub.asInterface( - uiAdapterBinder - ) + val uiAdapterBinder = + requireNotNull(coreLibInfo.getBinder(UI_ADAPTER_BINDER)) { + "Invalid bundle, missing $UI_ADAPTER_BINDER." + } + val adapterInterface = ISandboxedUiAdapter.Stub.asInterface(uiAdapterBinder) val forceUseRemoteAdapter = coreLibInfo.getBoolean(TEST_ONLY_USE_REMOTE_ADAPTER) - val isLocalBinder = uiAdapterBinder.queryLocalInterface( - ISandboxedUiAdapter.DESCRIPTOR) != null + val isLocalBinder = + uiAdapterBinder.queryLocalInterface(ISandboxedUiAdapter.DESCRIPTOR) != null val useLocalAdapter = !forceUseRemoteAdapter && isLocalBinder Log.d(TAG, "useLocalAdapter=$useLocalAdapter") - return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE && - !useLocalAdapter) { - RemoteAdapter(adapterInterface) + return if ( + Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE && !useLocalAdapter + ) { + RemoteAdapter(adapterInterface) } else { LocalAdapter(adapterInterface) } @@ -81,25 +81,35 @@ * [LocalAdapter] fetches UI from a provider living on same process as the client but on a * different class loader. */ - private class LocalAdapter(adapterInterface: ISandboxedUiAdapter) : - SandboxedUiAdapter { + private class LocalAdapter(adapterInterface: ISandboxedUiAdapter) : SandboxedUiAdapter { private val uiProviderBinder = adapterInterface.asBinder() - private val targetSessionClientClass = Class.forName( - SandboxedUiAdapter.SessionClient::class.java.name, - /* initialize = */ false, - uiProviderBinder.javaClass.classLoader - ) + private val targetSessionClientClass = + Class.forName( + SandboxedUiAdapter.SessionClient::class.java.name, + /* initialize = */ false, + uiProviderBinder.javaClass.classLoader + ) // The adapterInterface provided must have a openSession method on its class. // Since the object itself has been instantiated on a different classloader, we // need reflection to get hold of it. - private val openSessionMethod: Method = Class.forName( - SandboxedUiAdapter::class.java.name, - /*initialize=*/ false, - uiProviderBinder.javaClass.classLoader - ).getMethod("openSession", Context::class.java, IBinder::class.java, Int::class.java, - Int::class.java, Boolean::class.java, Executor::class.java, targetSessionClientClass) + private val openSessionMethod: Method = + Class.forName( + SandboxedUiAdapter::class.java.name, + /*initialize=*/ false, + uiProviderBinder.javaClass.classLoader + ) + .getMethod( + "openSession", + Context::class.java, + IBinder::class.java, + Int::class.java, + Int::class.java, + Boolean::class.java, + Executor::class.java, + targetSessionClientClass + ) @SuppressLint("BanUncheckedReflection") // using reflection on library classes override fun openSession( @@ -114,13 +124,22 @@ try { // We can't pass the client object as-is since it's been created on a different // classloader. - val sessionClientProxy = Proxy.newProxyInstance( - uiProviderBinder.javaClass.classLoader, - arrayOf(targetSessionClientClass), - SessionClientProxyHandler(client) + val sessionClientProxy = + Proxy.newProxyInstance( + uiProviderBinder.javaClass.classLoader, + arrayOf(targetSessionClientClass), + SessionClientProxyHandler(client) + ) + openSessionMethod.invoke( + uiProviderBinder, + context, + windowInputToken, + initialWidth, + initialHeight, + isZOrderOnTop, + clientExecutor, + sessionClientProxy ) - openSessionMethod.invoke(uiProviderBinder, context, windowInputToken, initialWidth, - initialHeight, isZOrderOnTop, clientExecutor, sessionClientProxy) } catch (exception: Throwable) { client.onSessionError(exception) } @@ -163,28 +182,26 @@ } } - /** - * Create [SandboxedUiAdapter.Session] that proxies to [origSession] - */ + /** Create [SandboxedUiAdapter.Session] that proxies to [origSession] */ private class SessionProxy( private val origSession: Any, ) : SandboxedUiAdapter.Session { - private val targetClass = Class.forName( - SandboxedUiAdapter.Session::class.java.name, - /* initialize = */ false, - origSession.javaClass.classLoader - ).also { - it.cast(origSession) - } + private val targetClass = + Class.forName( + SandboxedUiAdapter.Session::class.java.name, + /* initialize = */ false, + origSession.javaClass.classLoader + ) + .also { it.cast(origSession) } private val getViewMethod = targetClass.getMethod("getView") - private val notifyResizedMethod = targetClass.getMethod( - "notifyResized", Int::class.java, Int::class.java) + private val notifyResizedMethod = + targetClass.getMethod("notifyResized", Int::class.java, Int::class.java) private val notifyZOrderChangedMethod = targetClass.getMethod("notifyZOrderChanged", Boolean::class.java) - private val notifyConfigurationChangedMethod = targetClass.getMethod( - "notifyConfigurationChanged", Configuration::class.java) + private val notifyConfigurationChangedMethod = + targetClass.getMethod("notifyConfigurationChanged", Configuration::class.java) private val closeMethod = targetClass.getMethod("close") override val view: View @@ -214,9 +231,7 @@ } } - /** - * [RemoteAdapter] fetches content from a provider living on a different process. - */ + /** [RemoteAdapter] fetches content from a provider living on a different process. */ @RequiresApi(Build.VERSION_CODES.UPSIDE_DOWN_CAKE) private class RemoteAdapter(private val adapterInterface: ISandboxedUiAdapter) : SandboxedUiAdapter { @@ -265,48 +280,43 @@ surfaceView.addOnAttachStateChangeListener( object : View.OnAttachStateChangeListener { - private var hasViewBeenPreviouslyAttached = false + private var hasViewBeenPreviouslyAttached = false - override fun onViewAttachedToWindow(v: View) { - if (hasViewBeenPreviouslyAttached) { - tryToCallRemoteObject { - remoteSessionController.notifyFetchUiForSession() + override fun onViewAttachedToWindow(v: View) { + if (hasViewBeenPreviouslyAttached) { + tryToCallRemoteObject { + remoteSessionController.notifyFetchUiForSession() + } + } else { + hasViewBeenPreviouslyAttached = true } - } else { - hasViewBeenPreviouslyAttached = true } - } - override fun onViewDetachedFromWindow(v: View) {} - }) + override fun onViewDetachedFromWindow(v: View) {} + } + ) clientExecutor.execute { - client - .onSessionOpened(SessionImpl(surfaceView, - remoteSessionController, surfacePackage)) + client.onSessionOpened( + SessionImpl(surfaceView, remoteSessionController, surfacePackage) + ) } tryToCallRemoteObject { - remoteSessionController.asBinder().linkToDeath({ - onRemoteSessionError("Remote process died") - }, 0) + remoteSessionController + .asBinder() + .linkToDeath({ onRemoteSessionError("Remote process died") }, 0) } } override fun onRemoteSessionError(errorString: String) { - clientExecutor.execute { - client.onSessionError(Throwable(errorString)) - } + clientExecutor.execute { client.onSessionError(Throwable(errorString)) } } override fun onResizeRequested(width: Int, height: Int) { - clientExecutor.execute { - client.onResizeRequested(width, height) - } + clientExecutor.execute { client.onResizeRequested(width, height) } } - override fun onSessionUiFetched( - surfacePackage: SurfaceControlViewHost.SurfacePackage - ) { + override fun onSessionUiFetched(surfacePackage: SurfaceControlViewHost.SurfacePackage) { surfaceView.setChildSurfacePackage(surfacePackage) } } @@ -333,13 +343,12 @@ /* left = */ 0, /* top = */ 0, /* right = */ width, - /* bottom = */ height) + /* bottom = */ height + ) } val providerResizeRunnable = Runnable { - tryToCallRemoteObject { - remoteSessionController.notifyResized(width, height) - } + tryToCallRemoteObject { remoteSessionController.notifyResized(width, height) } } val syncGroup = SurfaceSyncGroup("AppAndSdkViewsSurfaceSync") @@ -351,13 +360,11 @@ override fun notifyZOrderChanged(isZOrderOnTop: Boolean) { surfaceView.setZOrderOnTop(isZOrderOnTop) - tryToCallRemoteObject { - remoteSessionController.notifyZOrderChanged(isZOrderOnTop) - } + tryToCallRemoteObject { remoteSessionController.notifyZOrderChanged(isZOrderOnTop) } } override fun close() { - tryToCallRemoteObject { remoteSessionController.close() } + tryToCallRemoteObject { remoteSessionController.close() } } }
diff --git a/privacysandbox/ui/ui-client/src/main/java/androidx/privacysandbox/ui/client/SdkActivityLaunchers.kt b/privacysandbox/ui/ui-client/src/main/java/androidx/privacysandbox/ui/client/SdkActivityLaunchers.kt index 478e4a8..58cb841 100644 --- a/privacysandbox/ui/ui-client/src/main/java/androidx/privacysandbox/ui/client/SdkActivityLaunchers.kt +++ b/privacysandbox/ui/ui-client/src/main/java/androidx/privacysandbox/ui/client/SdkActivityLaunchers.kt
@@ -42,38 +42,42 @@ * activity as a starting context. * * @param T the current activity from which new SDK activities will be launched. If this activity is - * destroyed any further SDK activity launches will simply be ignored. - * @param allowLaunch predicate called each time an activity is about to be launched by the - * SDK, the activity will only be launched if it returns true. + * destroyed any further SDK activity launches will simply be ignored. + * @param allowLaunch predicate called each time an activity is about to be launched by the SDK, the + * activity will only be launched if it returns true. */ -@Deprecated("Use the Privacy Sandbox Activity library version instead.", +@Deprecated( + "Use the Privacy Sandbox Activity library version instead.", ReplaceWith( expression = "createSdkActivityLauncher", - imports = arrayOf("androidx.privacysandbox.activity.client.createSdkActivityLauncher"))) -funT.createSdkActivityLauncher( - allowLaunch: () -> Boolean -): LocalSdkActivityLauncher- where T : Activity, T : LifecycleOwner { - val cancellationJob = Job(parent = lifecycleScope.coroutineContext[Job]) - val launcher = LocalSdkActivityLauncherImpl( - activity = this, - allowLaunch = allowLaunch, - onDispose = { cancellationJob.cancel() }, + imports = arrayOf("androidx.privacysandbox.activity.client.createSdkActivityLauncher") ) - cancellationJob.invokeOnCompletion { - launcher.dispose() - } +) +fun T.createSdkActivityLauncher(allowLaunch: () -> Boolean): LocalSdkActivityLauncher +T : Activity, +T : LifecycleOwner { + val cancellationJob = Job(parent = lifecycleScope.coroutineContext[Job]) + val launcher = + LocalSdkActivityLauncherImpl( + activity = this, + allowLaunch = allowLaunch, + onDispose = { cancellationJob.cancel() }, + ) + cancellationJob.invokeOnCompletion { launcher.dispose() } return launcher } /** - * Returns a [Bundle] with the information necessary to recreate this launcher. - * Possibly in a different process. + * Returns a [Bundle] with the information necessary to recreate this launcher. Possibly in a + * different process. */ -@Deprecated("Use the Privacy Sandbox Activity library version instead.", +@Deprecated( + "Use the Privacy Sandbox Activity library version instead.", ReplaceWith( expression = "toLauncherInfo", - imports = arrayOf("androidx.privacysandbox.activity.client.toLauncherInfo"))) + imports = arrayOf("androidx.privacysandbox.activity.client.toLauncherInfo") + ) +) fun SdkActivityLauncher.toLauncherInfo(): Bundle { val binderDelegate = SdkActivityLauncherBinderDelegate(this) return Bundle().also { bundle -> @@ -86,10 +90,13 @@ * * It allows callers in the app process to dispose resources used to launch SDK activities. */ -@Deprecated("Use the Privacy Sandbox Activity library version instead.", +@Deprecated( + "Use the Privacy Sandbox Activity library version instead.", ReplaceWith( expression = "LocalSdkActivityLauncher", - imports = arrayOf("androidx.privacysandbox.activity.client.LocalSdkActivityLauncher"))) + imports = arrayOf("androidx.privacysandbox.activity.client.LocalSdkActivityLauncher") + ) +) interface LocalSdkActivityLauncherwhere : SdkActivityLauncher where T : Activity, T : LifecycleOwner { /** * Clears references used to launch activities. @@ -116,17 +123,15 @@ private val stateReference: AtomicReference?> = AtomicReference?>( - LocalLauncherState( - activity, - allowLaunch, - SdkSandboxManagerCompat.from(activity), - onDispose + LocalLauncherState( + activity, + allowLaunch, + SdkSandboxManagerCompat.from(activity), + onDispose + ) ) - ) - override suspend fun launchSdkActivity( - sdkActivityHandlerToken: IBinder - ): Boolean { + override suspend fun launchSdkActivity(sdkActivityHandlerToken: IBinder): Boolean { val state = stateReference.get() ?: return false return withContext(Dispatchers.Main.immediate) { state.run { @@ -140,9 +145,7 @@ } override fun dispose() { - stateReference.getAndSet(null)?.run { - onDispose() - } + stateReference.getAndSet(null)?.run { onDispose() } } } @@ -159,12 +162,13 @@ requireNotNull(callback) coroutineScope.launch { - val accepted = try { - launcher.launchSdkActivity(sdkActivityHandlerToken) - } catch (t: Throwable) { - callback.onLaunchError(t.message ?: "Unknown error launching SDK activity.") - return@launch - } + val accepted = + try { + launcher.launchSdkActivity(sdkActivityHandlerToken) + } catch (t: Throwable) { + callback.onLaunchError(t.message ?: "Unknown error launching SDK activity.") + return@launch + } if (accepted) { callback.onLaunchAccepted(sdkActivityHandlerToken)
diff --git a/privacysandbox/ui/ui-client/src/main/java/androidx/privacysandbox/ui/client/view/SandboxedSdkView.kt b/privacysandbox/ui/ui-client/src/main/java/androidx/privacysandbox/ui/client/view/SandboxedSdkView.kt index 29cebc6..d566994 100644 --- a/privacysandbox/ui/ui-client/src/main/java/androidx/privacysandbox/ui/client/view/SandboxedSdkView.kt +++ b/privacysandbox/ui/ui-client/src/main/java/androidx/privacysandbox/ui/client/view/SandboxedSdkView.kt
@@ -45,13 +45,9 @@ import java.util.concurrent.CopyOnWriteArrayList import kotlin.math.min -/** - * A listener for changes to the state of the UI session associated with SandboxedSdkView. - */ +/** A listener for changes to the state of the UI session associated with SandboxedSdkView. */ fun interface SandboxedSdkUiSessionStateChangedListener { - /** - * Called when the state of the session for SandboxedSdkView is updated. - */ + /** Called when the state of the session for SandboxedSdkView is updated. */ fun onStateChanged(state: SandboxedSdkUiSessionState) } @@ -76,8 +72,8 @@ object Loading : SandboxedSdkUiSessionState() /** - * There is an open session with the supplied [SandboxedUiAdapter] and its UI is currently - * being displayed. This state is set after the first draw event of the [SandboxedSdkView]. + * There is an open session with the supplied [SandboxedUiAdapter] and its UI is currently being + * displayed. This state is set after the first draw event of the [SandboxedSdkView]. */ object Active : SandboxedSdkUiSessionState() @@ -105,24 +101,21 @@ ViewGroup(context, attrs) { // This will only be invoked when the content view has been set and the window is attached. - private val surfaceChangedCallback = object : SurfaceHolder.Callback { - override fun surfaceCreated(p0: SurfaceHolder) { - updateAndSetClippingBounds(true) - viewTreeObserver.addOnGlobalLayoutListener(globalLayoutChangeListener) - } + private val surfaceChangedCallback = + object : SurfaceHolder.Callback { + override fun surfaceCreated(p0: SurfaceHolder) { + updateAndSetClippingBounds(true) + viewTreeObserver.addOnGlobalLayoutListener(globalLayoutChangeListener) + } - override fun surfaceChanged(p0: SurfaceHolder, p1: Int, p2: Int, p3: Int) { - } + override fun surfaceChanged(p0: SurfaceHolder, p1: Int, p2: Int, p3: Int) {} - override fun surfaceDestroyed(p0: SurfaceHolder) { + override fun surfaceDestroyed(p0: SurfaceHolder) {} } - } // This will only be invoked when the content view has been set and the window is attached. private val globalLayoutChangeListener = - ViewTreeObserver.OnGlobalLayoutListener { - updateAndSetClippingBounds() - } + ViewTreeObserver.OnGlobalLayoutListener { updateAndSetClippingBounds() } private var adapter: SandboxedUiAdapter? = null private var client: Client? = null @@ -139,17 +132,12 @@ private var viewContainingPoolingContainerListener: View? = null private var poolingContainerListener = PoolingContainerListener {} - /** - * Adds a state change listener to the UI session and immediately reports the current - * state. - */ + /** Adds a state change listener to the UI session and immediately reports the current state. */ fun addStateChangedListener(stateChangedListener: SandboxedSdkUiSessionStateChangedListener) { stateListenerManager.addStateChangedListener(stateChangedListener) } - /** - * Removes the specified state change listener from SandboxedSdkView. - */ + /** Removes the specified state change listener from SandboxedSdkView. */ fun removeStateChangedListener( stateChangedListener: SandboxedSdkUiSessionStateChangedListener ) { @@ -212,8 +200,9 @@ private fun checkClientOpenSession() { val adapter = adapter - if (client == null && adapter != null && windowInputToken != null && - width > 0 && height > 0) { + if ( + client == null && adapter != null && windowInputToken != null && width > 0 && height > 0 + ) { stateListenerManager.currentUiSessionState = SandboxedSdkUiSessionState.Loading client = Client(this) adapter.openSession( @@ -273,11 +262,12 @@ internal fun onClientClosedSession(error: Throwable? = null) { removeContentView() - stateListenerManager.currentUiSessionState = if (error != null) { - SandboxedSdkUiSessionState.Error(error) - } else { - SandboxedSdkUiSessionState.Idle - } + stateListenerManager.currentUiSessionState = + if (error != null) { + SandboxedSdkUiSessionState.Error(error) + } else { + SandboxedSdkUiSessionState.Idle + } } private fun calculateMeasuredDimension(requestedSize: Int, measureSpec: Int): Int { @@ -287,7 +277,6 @@ MeasureSpec.EXACTLY -> { return measureSpecSize } - MeasureSpec.UNSPECIFIED -> { return if (requestedSize < 0) { measureSpecSize @@ -295,7 +284,6 @@ requestedSize } } - MeasureSpec.AT_MOST -> { return if (requestedSize >= 0) { min(requestedSize, measureSpecSize) @@ -303,7 +291,6 @@ measureSpecSize } } - else -> { return measureSpecSize } @@ -334,16 +321,20 @@ } // We will not call client?.notifyResized for the first onLayout call // and the case in which the width and the height remain unchanged. - if ((previousWidth != (right - left) || previousHeight != (bottom - top)) && - (previousWidth != -1 && previousHeight != -1)) { + if ( + (previousWidth != (right - left) || previousHeight != (bottom - top)) && + (previousWidth != -1 && previousHeight != -1) + ) { client?.notifyResized(right - left, bottom - top) } else { // Child needs to receive coordinates that are relative to the parent. - getChildAt(0)?.layout( - /* left = */ 0, - /* top = */ 0, - /* right = */ right - left, - /* bottom = */ bottom - top) + getChildAt(0) + ?.layout( + /* left = */ 0, + /* top = */ 0, + /* right = */ right - left, + /* bottom = */ bottom - top + ) } previousHeight = height previousWidth = width @@ -360,8 +351,9 @@ private fun attachPoolingContainerListener() { val newPoolingContainerListener = PoolingContainerListener { closeClient() - viewContainingPoolingContainerListener - ?.removePoolingContainerListener(poolingContainerListener) + viewContainingPoolingContainerListener?.removePoolingContainerListener( + poolingContainerListener + ) viewContainingPoolingContainerListener = null } @@ -377,8 +369,9 @@ return } - viewContainingPoolingContainerListener - ?.removePoolingContainerListener(poolingContainerListener) + viewContainingPoolingContainerListener?.removePoolingContainerListener( + poolingContainerListener + ) currentView.addPoolingContainerListener(newPoolingContainerListener) viewContainingPoolingContainerListener = currentView poolingContainerListener = newPoolingContainerListener @@ -409,62 +402,42 @@ checkClientOpenSession() } - /** - * @throws UnsupportedOperationException when called - */ - override fun addView( - view: View?, - index: Int, - params: LayoutParams? - ) { + /** @throws UnsupportedOperationException when called */ + override fun addView(view: View?, index: Int, params: LayoutParams?) { throw UnsupportedOperationException("Cannot add a view to SandboxedSdkView") } - /** - * @throws UnsupportedOperationException when called - */ + /** @throws UnsupportedOperationException when called */ override fun removeView(view: View?) { throw UnsupportedOperationException("Cannot remove a view from SandboxedSdkView") } - /** - * @throws UnsupportedOperationException when called - */ + /** @throws UnsupportedOperationException when called */ override fun removeViewInLayout(view: View?) { throw UnsupportedOperationException("Cannot remove a view from SandboxedSdkView") } - /** - * @throws UnsupportedOperationException when called - */ + /** @throws UnsupportedOperationException when called */ override fun removeViewsInLayout(start: Int, count: Int) { throw UnsupportedOperationException("Cannot remove a view from SandboxedSdkView") } - /** - * @throws UnsupportedOperationException when called - */ + /** @throws UnsupportedOperationException when called */ override fun removeViewAt(index: Int) { throw UnsupportedOperationException("Cannot remove a view from SandboxedSdkView") } - /** - * @throws UnsupportedOperationException when called - */ + /** @throws UnsupportedOperationException when called */ override fun removeViews(start: Int, count: Int) { throw UnsupportedOperationException("Cannot remove a view from SandboxedSdkView") } - /** - * @throws UnsupportedOperationException when called - */ + /** @throws UnsupportedOperationException when called */ override fun removeAllViews() { throw UnsupportedOperationException("Cannot remove a view from SandboxedSdkView") } - /** - * @throws UnsupportedOperationException when called - */ + /** @throws UnsupportedOperationException when called */ override fun removeAllViewsInLayout() { throw UnsupportedOperationException("Cannot remove a view from SandboxedSdkView") } @@ -535,13 +508,9 @@ if ((width != null) && (height != null) && (width >= 0) && (height >= 0)) { session.notifyResized(width, height) } - pendingConfiguration?.let { - session.notifyConfigurationChanged(it) - } + pendingConfiguration?.let { session.notifyConfigurationChanged(it) } pendingConfiguration = null - pendingZOrderOnTop?.let { - session.notifyZOrderChanged(it) - } + pendingZOrderOnTop?.let { session.notifyZOrderChanged(it) } pendingZOrderOnTop = null } @@ -588,16 +557,12 @@ * If the API is available, it's called from a version-specific static inner class gated with * version check, otherwise a fallback action is taken depending on the situation. */ - private object CompatImpl { + private object CompatImpl { - fun deriveInputTokenAndOpenSession( - context: Context, - sandboxedSdkView: SandboxedSdkView - ) { + fun deriveInputTokenAndOpenSession(context: Context, sandboxedSdkView: SandboxedSdkView) { // TODO(b/284147223): Remove this logic in V+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) { - Api34PlusImpl.attachTemporarySurfaceViewAndOpenSession( - context, sandboxedSdkView) + Api34PlusImpl.attachTemporarySurfaceViewAndOpenSession(context, sandboxedSdkView) } else { // the openSession signature requires a non-null input token, so the session // will not be opened until this is set @@ -613,7 +578,10 @@ ) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) { Api34PlusImpl.setClippingBounds( - contentView, isAttachedToWindow, currentClippingBounds) + contentView, + isAttachedToWindow, + currentClippingBounds + ) } } @@ -639,22 +607,28 @@ check(isAttachedToWindow) val surfaceView: SurfaceView = contentView as SurfaceView - val attachedSurfaceControl = checkNotNull(surfaceView.rootSurfaceControl) { - "attachedSurfaceControl should be non-null if the window is attached" - } + val attachedSurfaceControl = + checkNotNull(surfaceView.rootSurfaceControl) { + "attachedSurfaceControl should be non-null if the window is attached" + } val name = "clippingBounds-${System.currentTimeMillis()}" - val clippingBoundsSurfaceControl = - SurfaceControl.Builder().setName(name) - .build() - val reparentSurfaceControlTransaction = SurfaceControl.Transaction() - .reparent(surfaceView.surfaceControl, clippingBoundsSurfaceControl) + val clippingBoundsSurfaceControl = SurfaceControl.Builder().setName(name).build() + val reparentSurfaceControlTransaction = + SurfaceControl.Transaction() + .reparent(surfaceView.surfaceControl, clippingBoundsSurfaceControl) - val reparentClippingBoundsTransaction = checkNotNull( - attachedSurfaceControl.buildReparentTransaction(clippingBoundsSurfaceControl)) { + val reparentClippingBoundsTransaction = + checkNotNull( + attachedSurfaceControl.buildReparentTransaction( + clippingBoundsSurfaceControl + ) + ) { "Reparent transaction should be non-null if the window is attached" } reparentClippingBoundsTransaction.setCrop( - clippingBoundsSurfaceControl, currentClippingBounds) + clippingBoundsSurfaceControl, + currentClippingBounds + ) reparentClippingBoundsTransaction.setVisibility(clippingBoundsSurfaceControl, true) reparentSurfaceControlTransaction.merge(reparentClippingBoundsTransaction) attachedSurfaceControl.applyTransactionOnDraw(reparentSurfaceControlTransaction) @@ -666,9 +640,7 @@ context: Context, sandboxedSdkView: SandboxedSdkView ) { - val surfaceView = SurfaceView(context).apply { - visibility = GONE - } + val surfaceView = SurfaceView(context).apply { visibility = GONE } val onSurfaceViewAttachedListener = object : OnAttachStateChangeListener { override fun onViewAttachedToWindow(view: View) { @@ -678,8 +650,7 @@ sandboxedSdkView.checkClientOpenSession() } - override fun onViewDetachedFromWindow(view: View) { - } + override fun onViewDetachedFromWindow(view: View) {} } surfaceView.addOnAttachStateChangeListener(onSurfaceViewAttachedListener) sandboxedSdkView.addTemporarySurfaceView(surfaceView)
diff --git a/privacysandbox/ui/ui-core/src/main/java/androidx/privacysandbox/ui/core/SandboxedUiAdapter.kt b/privacysandbox/ui/ui-core/src/main/java/androidx/privacysandbox/ui/core/SandboxedUiAdapter.kt index bc43c32..d312c56 100644 --- a/privacysandbox/ui/ui-core/src/main/java/androidx/privacysandbox/ui/core/SandboxedUiAdapter.kt +++ b/privacysandbox/ui/ui-core/src/main/java/androidx/privacysandbox/ui/core/SandboxedUiAdapter.kt
@@ -26,7 +26,6 @@ /** * An Adapter that provides content from a SandboxedSdk to be displayed as part of a host app's UI. */ - interface SandboxedUiAdapter { /** @@ -46,9 +45,7 @@ client: SessionClient ) - /** - * A single session with the provider of remote content. - */ + /** A single session with the provider of remote content. */ interface Session : AutoCloseable { /** @@ -70,22 +67,18 @@ */ fun notifyZOrderChanged(isZOrderOnTop: Boolean) - /** - * Notify the session that the host configuration has changed to [configuration]. - */ + /** Notify the session that the host configuration has changed to [configuration]. */ fun notifyConfigurationChanged(configuration: Configuration) /** - * Close this session, indicating that the remote provider of content should - * dispose of associated resources and that the [SessionClient] should not - * receive further callback events. + * Close this session, indicating that the remote provider of content should dispose of + * associated resources and that the [SessionClient] should not receive further callback + * events. */ override fun close() } - /** - * The client of a single session that will receive callback events from an active session. - */ + /** The client of a single session that will receive callback events from an active session. */ interface SessionClient { /** * Called to report that the session was opened successfully, delivering the [Session] @@ -94,9 +87,9 @@ fun onSessionOpened(session: Session) /** - * Called to report a terminal error in the session. No further events will be reported - * to this [SessionClient] and any further or currently pending calls to the [Session] - * that may have been in flight may be ignored. + * Called to report a terminal error in the session. No further events will be reported to + * this [SessionClient] and any further or currently pending calls to the [Session] that may + * have been in flight may be ignored. */ fun onSessionError(throwable: Throwable)
diff --git a/privacysandbox/ui/ui-core/src/main/java/androidx/privacysandbox/ui/core/SdkActivityLauncher.kt b/privacysandbox/ui/ui-core/src/main/java/androidx/privacysandbox/ui/core/SdkActivityLauncher.kt index 72ac835..d827842 100644 --- a/privacysandbox/ui/ui-core/src/main/java/androidx/privacysandbox/ui/core/SdkActivityLauncher.kt +++ b/privacysandbox/ui/ui-core/src/main/java/androidx/privacysandbox/ui/core/SdkActivityLauncher.kt
@@ -22,26 +22,29 @@ * Interface that allows SDKs running in the Privacy Sandbox to launch activities. * * Apps can create launchers by calling - * [createActivityLauncher][androidx.privacysandbox.ui.client.createSdkActivityLauncher] - * from one of their activities. + * [createActivityLauncher][androidx.privacysandbox.ui.client.createSdkActivityLauncher] from one of + * their activities. * * To send an [SdkActivityLauncher] to another process, they can call - * [toLauncherInfo][androidx.privacysandbox.ui.client.toLauncherInfo] - * and send the resulting bundle. + * [toLauncherInfo][androidx.privacysandbox.ui.client.toLauncherInfo] and send the resulting bundle. * * SDKs can create launchers from an app-provided bundle by calling * [createFromLauncherInfo][androidx.privacysandbox.ui.provider.SdkActivityLauncherFactory.createFromLauncherInfo]. */ -@Deprecated("Use the Privacy Sandbox Activity library version instead.", +@Deprecated( + "Use the Privacy Sandbox Activity library version instead.", ReplaceWith( expression = "SdkActivityLauncher", - imports = arrayOf("androidx.privacysandbox.activity.core.SdkActivityLauncher"))) + imports = arrayOf("androidx.privacysandbox.activity.core.SdkActivityLauncher") + ) +) // TODO(b/307696996) Remove this file when activity library is released. interface SdkActivityLauncher { /** - * Tries to launch a new SDK activity using the given [sdkActivityHandlerToken], - * assumed to be registered in the [SdkSandboxControllerCompat][androidx.privacysandbox.sdkruntime.core.controller.SdkSandboxControllerCompat]. + * Tries to launch a new SDK activity using the given [sdkActivityHandlerToken], assumed to be + * registered in the + * [SdkSandboxControllerCompat][androidx.privacysandbox.sdkruntime.core.controller.SdkSandboxControllerCompat]. * * Returns true if the SDK activity intent was sent, false if the launch was rejected for any * reason.
diff --git a/privacysandbox/ui/ui-core/src/main/java/androidx/privacysandbox/ui/core/SdkRuntimeUiLibVersions.kt b/privacysandbox/ui/ui-core/src/main/java/androidx/privacysandbox/ui/core/SdkRuntimeUiLibVersions.kt index be664d5..066128d 100644 --- a/privacysandbox/ui/ui-core/src/main/java/androidx/privacysandbox/ui/core/SdkRuntimeUiLibVersions.kt +++ b/privacysandbox/ui/ui-core/src/main/java/androidx/privacysandbox/ui/core/SdkRuntimeUiLibVersions.kt
@@ -20,8 +20,7 @@ object SdkRuntimeUiLibVersions { var clientVersion: Int = -1 - @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP) - set + @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP) set const val apiVersion: Int = 1 }
diff --git a/privacysandbox/ui/ui-provider/src/androidTest/kotlin/androidx/privacysandbox/ui/provider/test/BinderAdapterDelegateTest.kt b/privacysandbox/ui/ui-provider/src/androidTest/kotlin/androidx/privacysandbox/ui/provider/test/BinderAdapterDelegateTest.kt index 5aefdbe..20747c3 100644 --- a/privacysandbox/ui/ui-provider/src/androidTest/kotlin/androidx/privacysandbox/ui/provider/test/BinderAdapterDelegateTest.kt +++ b/privacysandbox/ui/ui-provider/src/androidTest/kotlin/androidx/privacysandbox/ui/provider/test/BinderAdapterDelegateTest.kt
@@ -62,8 +62,7 @@ const val SURFACE_VIEW_RES = "androidx.privacysandbox.ui.provider.test:id/surface_view" } - @get:Rule - val activityScenarioRule = ActivityScenarioRule(MainActivity::class.java) + @get:Rule val activityScenarioRule = ActivityScenarioRule(MainActivity::class.java) private val transferTouchFocusLatch = CountDownLatch(1) @@ -77,7 +76,11 @@ val surfaceView = activity.findViewById(R.id.surface_view) val surfaceControlViewHost = GestureTransferringSurfaceControlViewHost( - activity, activity.display!!, Binder(), transferTouchFocusLatch) + activity, + activity.display!!, + Binder(), + transferTouchFocusLatch + ) val touchFocusTransferringView = TouchFocusTransferringView(context, surfaceControlViewHost) touchFocusTransferringView.addView(TestView(context))
diff --git a/privacysandbox/ui/ui-provider/src/main/java/androidx/privacysandbox/ui/provider/BinderAdapterDelegate.kt b/privacysandbox/ui/ui-provider/src/main/java/androidx/privacysandbox/ui/provider/BinderAdapterDelegate.kt index bd9d4dd..91f074e 100644 --- a/privacysandbox/ui/ui-provider/src/main/java/androidx/privacysandbox/ui/provider/BinderAdapterDelegate.kt +++ b/privacysandbox/ui/ui-provider/src/main/java/androidx/privacysandbox/ui/provider/BinderAdapterDelegate.kt
@@ -38,9 +38,8 @@ import java.util.concurrent.Executor /** - * Provides a [Bundle] containing a Binder which represents a [SandboxedUiAdapter]. The Bundle - * is shuttled to the host app in order for the [SandboxedUiAdapter] to be used to retrieve - * content. + * Provides a [Bundle] containing a Binder which represents a [SandboxedUiAdapter]. The Bundle is + * shuttled to the host app in order for the [SandboxedUiAdapter] to be used to retrieve content. */ fun SandboxedUiAdapter.toCoreLibInfo(@Suppress("ContextFirst") context: Context): Bundle { val binderAdapter = BinderAdapterDelegate(context, this) @@ -71,7 +70,12 @@ client: SandboxedUiAdapter.SessionClient ) { adapter.openSession( - context, windowInputToken, initialWidth, initialHeight, isZOrderOnTop, clientExecutor, + context, + windowInputToken, + initialWidth, + initialHeight, + isZOrderOnTop, + clientExecutor, client ) } @@ -92,20 +96,31 @@ sandboxContext.getSystemService(Context.DISPLAY_SERVICE) as DisplayManager val windowContext = sandboxContext.createDisplayContext(mDisplayManager.getDisplay(displayId)) - val surfaceControlViewHost = CompatImpl.createSurfaceControlViewHost( - windowContext, - mDisplayManager.getDisplay(displayId), windowInputToken - ) + val surfaceControlViewHost = + CompatImpl.createSurfaceControlViewHost( + windowContext, + mDisplayManager.getDisplay(displayId), + windowInputToken + ) checkNotNull(surfaceControlViewHost) { "SurfaceControlViewHost must be available when provider is remote" } - val sessionClient = SessionClientProxy( - surfaceControlViewHost, initialWidth, initialHeight, isZOrderOnTop, - remoteSessionClient - ) + val sessionClient = + SessionClientProxy( + surfaceControlViewHost, + initialWidth, + initialHeight, + isZOrderOnTop, + remoteSessionClient + ) openSession( - windowContext, windowInputToken, initialWidth, initialHeight, isZOrderOnTop, - Runnable::run, sessionClient + windowContext, + windowInputToken, + initialWidth, + initialHeight, + isZOrderOnTop, + Runnable::run, + sessionClient ) } catch (exception: Throwable) { remoteSessionClient.onRemoteSessionError(exception.message) @@ -124,8 +139,8 @@ override fun onSessionOpened(session: SandboxedUiAdapter.Session) { val view = session.view - val touchTransferringView = TouchFocusTransferringView( - sandboxContext, surfaceControlViewHost) + val touchTransferringView = + TouchFocusTransferringView(sandboxContext, surfaceControlViewHost) touchTransferringView.addView(view) surfaceControlViewHost.setView(touchTransferringView, initialWidth, initialHeight) @@ -141,13 +156,17 @@ // If a frame commit callback is not triggered within the timeout (such as when the // screen is off), open the session anyway. - Handler(Looper.getMainLooper()).postDelayed({ - if (!alreadyOpenedSession) { - Log.w(TAG, "Frame not committed within $FRAME_TIMEOUT_MILLIS ms.") - alreadyOpenedSession = true - sendRemoteSessionOpened(session) - } - }, FRAME_TIMEOUT_MILLIS) + Handler(Looper.getMainLooper()) + .postDelayed( + { + if (!alreadyOpenedSession) { + Log.w(TAG, "Frame not committed within $FRAME_TIMEOUT_MILLIS ms.") + alreadyOpenedSession = true + sendRemoteSessionOpened(session) + } + }, + FRAME_TIMEOUT_MILLIS + ) } override fun onSessionError(throwable: Throwable) { @@ -160,10 +179,10 @@ private fun sendRemoteSessionOpened(session: SandboxedUiAdapter.Session) { val surfacePackage = surfaceControlViewHost.surfacePackage - val remoteSessionController = - RemoteSessionController(surfaceControlViewHost, session) + val remoteSessionController = RemoteSessionController(surfaceControlViewHost, session) remoteSessionClient.onRemoteSessionOpened( - surfacePackage, remoteSessionController, + surfacePackage, + remoteSessionController, isZOrderOnTop ) } @@ -219,30 +238,30 @@ */ private object CompatImpl { - fun createSurfaceControlViewHost( - context: Context, - display: Display, - hostToken: IBinder - ): SurfaceControlViewHost? { + fun createSurfaceControlViewHost( + context: Context, + display: Display, + hostToken: IBinder + ): SurfaceControlViewHost? { return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) { return Api34PlusImpl.createSurfaceControlViewHost(context, display, hostToken) } else { null } - } + } - @RequiresApi(Build.VERSION_CODES.UPSIDE_DOWN_CAKE) - private object Api34PlusImpl { + @RequiresApi(Build.VERSION_CODES.UPSIDE_DOWN_CAKE) + private object Api34PlusImpl { - @JvmStatic - @DoNotInline - fun createSurfaceControlViewHost( - context: Context, - display: Display, - hostToken: IBinder - ): SurfaceControlViewHost { - return SurfaceControlViewHost(context, display, hostToken) - } - } + @JvmStatic + @DoNotInline + fun createSurfaceControlViewHost( + context: Context, + display: Display, + hostToken: IBinder + ): SurfaceControlViewHost { + return SurfaceControlViewHost(context, display, hostToken) + } + } } }
diff --git a/privacysandbox/ui/ui-provider/src/main/java/androidx/privacysandbox/ui/provider/SdkActivityLauncherFactory.kt b/privacysandbox/ui/ui-provider/src/main/java/androidx/privacysandbox/ui/provider/SdkActivityLauncherFactory.kt index bb0e41b..d16e2e7 100644 --- a/privacysandbox/ui/ui-provider/src/main/java/androidx/privacysandbox/ui/provider/SdkActivityLauncherFactory.kt +++ b/privacysandbox/ui/ui-provider/src/main/java/androidx/privacysandbox/ui/provider/SdkActivityLauncherFactory.kt
@@ -29,31 +29,35 @@ import kotlin.coroutines.resumeWithException import kotlinx.coroutines.suspendCancellableCoroutine -@Deprecated("Use the Privacy Sandbox Activity library version instead.", +@Deprecated( + "Use the Privacy Sandbox Activity library version instead.", ReplaceWith( expression = "SdkActivityLauncherFactory", - imports = arrayOf("androidx.privacysandbox.activity.provider.SdkActivityLauncherFactory"))) + imports = arrayOf("androidx.privacysandbox.activity.provider.SdkActivityLauncherFactory") + ) +) object SdkActivityLauncherFactory { /** * Creates a [SdkActivityLauncher] using the given [launcherInfo] Bundle. * - * You can create such a Bundle by calling [toLauncherInfo][androidx.privacysandbox.ui.client.toLauncherInfo]. - * A [launcherInfo] is expected to have a valid SdkActivityLauncher Binder with - * `"sdkActivityLauncherBinderKey"` for a key, [IllegalArgumentException] is thrown otherwise. + * You can create such a Bundle by calling + * [toLauncherInfo][androidx.privacysandbox.ui.client.toLauncherInfo]. A [launcherInfo] is + * expected to have a valid SdkActivityLauncher Binder with `"sdkActivityLauncherBinderKey"` for + * a key, [IllegalArgumentException] is thrown otherwise. */ @JvmStatic fun fromLauncherInfo(launcherInfo: Bundle): SdkActivityLauncher { - val remote: ISdkActivityLauncher? = ISdkActivityLauncher.Stub.asInterface( - launcherInfo.getBinder(sdkActivityLauncherBinderKey) - ) + val remote: ISdkActivityLauncher? = + ISdkActivityLauncher.Stub.asInterface( + launcherInfo.getBinder(sdkActivityLauncherBinderKey) + ) requireNotNull(remote) { "Invalid SdkActivityLauncher info bundle." } return SdkActivityLauncherProxy(remote) } - private class SdkActivityLauncherProxy( - private val remote: ISdkActivityLauncher - ) : SdkActivityLauncher { + private class SdkActivityLauncherProxy(private val remote: ISdkActivityLauncher) : + SdkActivityLauncher { override suspend fun launchSdkActivity(sdkActivityHandlerToken: IBinder): Boolean = suspendCancellableCoroutine { remote.launchSdkActivity( @@ -70,7 +74,8 @@ override fun onLaunchError(message: String?) { it.resumeWithException(RuntimeException(message)) } - }) + } + ) } } }
diff --git a/privacysandbox/ui/ui-provider/src/main/java/androidx/privacysandbox/ui/provider/TouchFocusTransferringView.kt b/privacysandbox/ui/ui-provider/src/main/java/androidx/privacysandbox/ui/provider/TouchFocusTransferringView.kt index b1a1a33..a9e2182 100644 --- a/privacysandbox/ui/ui-provider/src/main/java/androidx/privacysandbox/ui/provider/TouchFocusTransferringView.kt +++ b/privacysandbox/ui/ui-provider/src/main/java/androidx/privacysandbox/ui/provider/TouchFocusTransferringView.kt
@@ -29,8 +29,8 @@ /** * A container [ViewGroup] that delegates touch events to the host or the UI provider. * - * Touch events will first be passed to a scroll detector. If a vertical scroll or fling - * is detected, the gesture will be transferred to the host. Otherwise, the touch event will pass + * Touch events will first be passed to a scroll detector. If a vertical scroll or fling is + * detected, the gesture will be transferred to the host. Otherwise, the touch event will pass * through and be handled by the provider of UI. * * TODO(b/286829818): Pass scroll events to the UI provider if it can handle scrolls. @@ -66,7 +66,7 @@ private class ScrollDetector(context: Context) : GestureDetector.SimpleOnGestureListener() { var isScrolling = false - private set + private set private val gestureDetector = GestureDetector(context, this)
diff --git a/privacysandbox/ui/ui-tests/src/androidTest/java/androidx/privacysandbox/ui/tests/activity/SdkActivityLauncherBundlingTest.kt b/privacysandbox/ui/ui-tests/src/androidTest/java/androidx/privacysandbox/ui/tests/activity/SdkActivityLauncherBundlingTest.kt index 6b5b722..f4f749a 100644 --- a/privacysandbox/ui/ui-tests/src/androidTest/java/androidx/privacysandbox/ui/tests/activity/SdkActivityLauncherBundlingTest.kt +++ b/privacysandbox/ui/ui-tests/src/androidTest/java/androidx/privacysandbox/ui/tests/activity/SdkActivityLauncherBundlingTest.kt
@@ -67,8 +67,7 @@ var tokensReceived = mutableListOf() - override suspend fun launchSdkActivity(sdkActivityHandlerToken: IBinder): - Boolean { + override suspend fun launchSdkActivity(sdkActivityHandlerToken: IBinder): Boolean { tokensReceived.add(sdkActivityHandlerToken) return allowActivityLaunches }
diff --git a/privacysandbox/ui/ui-tests/src/androidTest/java/androidx/privacysandbox/ui/tests/endtoend/IntegrationTests.kt b/privacysandbox/ui/ui-tests/src/androidTest/java/androidx/privacysandbox/ui/tests/endtoend/IntegrationTests.kt index fc03be9..b4cf11b 100644 --- a/privacysandbox/ui/ui-tests/src/androidTest/java/androidx/privacysandbox/ui/tests/endtoend/IntegrationTests.kt +++ b/privacysandbox/ui/ui-tests/src/androidTest/java/androidx/privacysandbox/ui/tests/endtoend/IntegrationTests.kt
@@ -57,8 +57,7 @@ @MediumTest class IntegrationTests(private val invokeBackwardsCompatFlow: Boolean) { - @get:Rule - var activityScenarioRule = ActivityScenarioRule(MainActivity::class.java) + @get:Rule var activityScenarioRule = ActivityScenarioRule(MainActivity::class.java) companion object { const val INITIAL_HEIGHT = 100 @@ -66,10 +65,11 @@ @JvmStatic @Parameterized.Parameters(name = "invokeBackwardsCompatFlow={0}") - fun data(): Array= arrayOf( - arrayOf(true), - arrayOf(false), - ) + fun data(): Array= + arrayOf( + arrayOf(true), + arrayOf(false), + ) } private val context = InstrumentationRegistry.getInstrumentation().context @@ -99,10 +99,11 @@ stateChangeListener = TestStateChangeListener(errorLatch) view.addStateChangedListener(stateChangeListener) linearLayout = LinearLayout(context) - linearLayout.layoutParams = LinearLayout.LayoutParams( - LinearLayout.LayoutParams.MATCH_PARENT, - LinearLayout.LayoutParams.MATCH_PARENT - ) + linearLayout.layoutParams = + LinearLayout.LayoutParams( + LinearLayout.LayoutParams.MATCH_PARENT, + LinearLayout.LayoutParams.MATCH_PARENT + ) linearLayout.setBackgroundColor(Color.RED) setContentView(linearLayout) view.layoutParams = LinearLayout.LayoutParams(INITIAL_WIDTH, INITIAL_HEIGHT) @@ -118,14 +119,14 @@ val layoutChangeLatch = CountDownLatch(1) val childAddedLatch = CountDownLatch(1) - val hierarchyChangeListener = object : ViewGroup.OnHierarchyChangeListener { - override fun onChildViewAdded(parent: View, child: View) { - childAddedLatch.countDown() - } + val hierarchyChangeListener = + object : ViewGroup.OnHierarchyChangeListener { + override fun onChildViewAdded(parent: View, child: View) { + childAddedLatch.countDown() + } - override fun onChildViewRemoved(p0: View?, p1: View?) { + override fun onChildViewRemoved(p0: View?, p1: View?) {} } - } view.setOnHierarchyChangeListener(hierarchyChangeListener) val onLayoutChangeListener: OnLayoutChangeListener = @@ -176,13 +177,12 @@ } val testSession = sdkAdapter.session as TestSandboxedUiAdapter.TestSession - assertWithMessage("Configuration changed").that(testSession.config?.orientation) - .isEqualTo(Configuration.ORIENTATION_LANDSCAPE) + assertWithMessage("Configuration changed") + .that(testSession.config?.orientation) + .isEqualTo(Configuration.ORIENTATION_LANDSCAPE) } - /** - * Tests that the provider receives Z-order change updates. - */ + /** Tests that the provider receives Z-order change updates. */ @Test @Ignore("b/302090927") fun testZOrderChanged() { @@ -193,9 +193,7 @@ assertThat(testSession.zOrderChanged).isTrue() } - /** - * Tests that the provider does not receive Z-order updates if the Z-order is unchanged. - */ + /** Tests that the provider does not receive Z-order updates if the Z-order is unchanged. */ @Test fun testZOrderUnchanged() { val adapter = sessionManager.createAdapterAndEstablishSession(viewForSession = view) @@ -210,10 +208,11 @@ // TODO(b/301976432): Stop skipping this for backwards compat flow assumeTrue(!invokeBackwardsCompatFlow) - val adapter = sessionManager.createAdapterAndWaitToBeActive( - viewForSession = view, - initialZOrder = true - ) + val adapter = + sessionManager.createAdapterAndWaitToBeActive( + viewForSession = view, + initialZOrder = true + ) injectInputEventOnView() // the injected touch should be handled by the provider in Z-above mode assertThat(adapter.touchedLatch.await(TIMEOUT, TimeUnit.MILLISECONDS)).isTrue() @@ -225,10 +224,11 @@ // TODO(b/300396631): Skip for backward compat assumeTrue(!invokeBackwardsCompatFlow) - val adapter = sessionManager.createAdapterAndWaitToBeActive( - viewForSession = view, - initialZOrder = false - ) + val adapter = + sessionManager.createAdapterAndWaitToBeActive( + viewForSession = view, + initialZOrder = false + ) injectInputEventOnView() // the injected touch should not reach the provider in Z-below mode assertThat(adapter.touchedLatch.await(TIMEOUT, TimeUnit.MILLISECONDS)).isFalse() @@ -246,13 +246,16 @@ } /** - * Tests that a provider-initiated resize is accepted if the view's parent does not impose - * exact restrictions on the view's size. + * Tests that a provider-initiated resize is accepted if the view's parent does not impose exact + * restrictions on the view's size. */ @Test fun testResizeRequested_requestedAccepted_atMostMeasureSpec() { - view.layoutParams = LinearLayout.LayoutParams( - LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT) + view.layoutParams = + LinearLayout.LayoutParams( + LinearLayout.LayoutParams.WRAP_CONTENT, + LinearLayout.LayoutParams.WRAP_CONTENT + ) val sdkAdapter = sessionManager.createAdapterAndWaitToBeActive(viewForSession = view) val testSession = sdkAdapter.session as TestSandboxedUiAdapter.TestSession @@ -266,7 +269,8 @@ assertWithMessage("Resized width").that(testSession.resizedHeight).isEqualTo(newHeight) testSession.assertResizeOccurred( /* expectedWidth=*/ newWidth, - /* expectedHeight=*/ newHeight) + /* expectedHeight=*/ newHeight + ) } /** @@ -295,13 +299,12 @@ } val testSession = sdkAdapter.session as TestSandboxedUiAdapter.TestSession - assertWithMessage("Resized width").that(testSession.resizedWidth) - .isEqualTo(newWidth) - assertWithMessage("Resized height").that(testSession.resizedHeight) - .isEqualTo(newHeight) + assertWithMessage("Resized width").that(testSession.resizedWidth).isEqualTo(newWidth) + assertWithMessage("Resized height").that(testSession.resizedHeight).isEqualTo(newHeight) testSession.assertResizeOccurred( /* expectedWidth=*/ newWidth, - /* expectedHeight=*/ newHeight) + /* expectedHeight=*/ newHeight + ) } @Test @@ -310,10 +313,11 @@ assumeTrue(invokeBackwardsCompatFlow) val testSessionClient = TestSessionClient() - val sdkAdapter = sessionManager.createAdapterAndEstablishSession( - viewForSession = null, - testSessionClient = testSessionClient - ) + val sdkAdapter = + sessionManager.createAdapterAndEstablishSession( + viewForSession = null, + testSessionClient = testSessionClient + ) // Verify toString, hashCode and equals have been implemented for dynamic proxy val testSession = sdkAdapter.session as TestSandboxedUiAdapter.TestSession @@ -331,9 +335,11 @@ */ @Test fun testViewGroup_ChildViewIsLaidOut() { - val adapter = sessionManager.createAdapterAndWaitToBeActive( - viewForSession = view, - placeViewInsideFrameLayout = true) + val adapter = + sessionManager.createAdapterAndWaitToBeActive( + viewForSession = view, + placeViewInsideFrameLayout = true + ) val session = adapter.session as TestSandboxedUiAdapter.TestSession // Force a layout pass by changing the size of the view @@ -347,16 +353,19 @@ activityScenarioRule.withActivity { val location = IntArray(2) view.getLocationOnScreen(location) - InstrumentationRegistry.getInstrumentation().uiAutomation.injectInputEvent( - MotionEvent.obtain( - SystemClock.uptimeMillis(), - SystemClock.uptimeMillis(), - MotionEvent.ACTION_DOWN, - (location[0] + 1).toFloat(), - (location[1] + 1).toFloat(), - 0 - ), false - ) + InstrumentationRegistry.getInstrumentation() + .uiAutomation + .injectInputEvent( + MotionEvent.obtain( + SystemClock.uptimeMillis(), + SystemClock.uptimeMillis(), + MotionEvent.ACTION_DOWN, + (location[0] + 1).toFloat(), + (location[1] + 1).toFloat(), + 0 + ), + false + ) } }
diff --git a/privacysandbox/ui/ui-tests/src/androidTest/java/androidx/privacysandbox/ui/tests/endtoend/PoolingContainerTests.kt b/privacysandbox/ui/ui-tests/src/androidTest/java/androidx/privacysandbox/ui/tests/endtoend/PoolingContainerTests.kt index f0107b1..ffa54e7 100644 --- a/privacysandbox/ui/ui-tests/src/androidTest/java/androidx/privacysandbox/ui/tests/endtoend/PoolingContainerTests.kt +++ b/privacysandbox/ui/ui-tests/src/androidTest/java/androidx/privacysandbox/ui/tests/endtoend/PoolingContainerTests.kt
@@ -56,16 +56,16 @@ @MediumTest class PoolingContainerTests(private val invokeBackwardsCompatFlow: Boolean) { - @get:Rule - var activityScenarioRule = ActivityScenarioRule(MainActivity::class.java) + @get:Rule var activityScenarioRule = ActivityScenarioRule(MainActivity::class.java) companion object { @JvmStatic @Parameterized.Parameters(name = "invokeBackwardsCompatFlow={0}") - fun data(): Array= arrayOf( - arrayOf(true), - arrayOf(false), - ) + fun data(): Array= + arrayOf( + arrayOf(true), + arrayOf(false), + ) } private val context = InstrumentationRegistry.getInstrumentation().context @@ -90,18 +90,20 @@ activityScenarioRule.withActivity { recyclerView = RecyclerView(context) linearLayout = LinearLayout(context) - linearLayout.layoutParams = LinearLayout.LayoutParams( - LinearLayout.LayoutParams.MATCH_PARENT, - LinearLayout.LayoutParams.MATCH_PARENT - ) + linearLayout.layoutParams = + LinearLayout.LayoutParams( + LinearLayout.LayoutParams.MATCH_PARENT, + LinearLayout.LayoutParams.MATCH_PARENT + ) linearLayout.setBackgroundColor(Color.RED) setContentView(linearLayout) linearLayout.addView(recyclerView) recyclerView.setBackgroundColor(Color.GREEN) - recyclerView.layoutParams = LinearLayout.LayoutParams( - LinearLayout.LayoutParams.MATCH_PARENT, - LinearLayout.LayoutParams.MATCH_PARENT - ) + recyclerView.layoutParams = + LinearLayout.LayoutParams( + LinearLayout.LayoutParams.MATCH_PARENT, + LinearLayout.LayoutParams.MATCH_PARENT + ) recyclerView.setLayoutManager(LinearLayoutManager(context)) } } @@ -111,12 +113,10 @@ // TODO(b/309848703): Stop skipping this for backwards compat flow assumeTrue(!invokeBackwardsCompatFlow) - val adapter = createRecyclerViewTestAdapterAndWaitForChildrenToBeActive( - isNestedView = false) + val adapter = + createRecyclerViewTestAdapterAndWaitForChildrenToBeActive(isNestedView = false) - activityScenarioRule.withActivity { - recyclerView.layoutManager!!.removeAllViews() - } + activityScenarioRule.withActivity { recyclerView.layoutManager!!.removeAllViews() } adapter.waitForViewsToBeDetached() adapter.ensureChildrenDoNotBecomeIdleFromActive() @@ -127,12 +127,9 @@ // TODO(b/309848703): Stop skipping this for backwards compat flow assumeTrue(!invokeBackwardsCompatFlow) - val adapter = createRecyclerViewTestAdapterAndWaitForChildrenToBeActive( - isNestedView = true) + val adapter = createRecyclerViewTestAdapterAndWaitForChildrenToBeActive(isNestedView = true) - activityScenarioRule.withActivity { - linearLayout.removeView(recyclerView) - } + activityScenarioRule.withActivity { linearLayout.removeView(recyclerView) } adapter.ensureAllChildrenBecomeIdleFromActive() } @@ -142,12 +139,10 @@ // TODO(b/309848703): Stop skipping this for backwards compat flow assumeTrue(!invokeBackwardsCompatFlow) - val adapter = createRecyclerViewTestAdapterAndWaitForChildrenToBeActive( - isNestedView = false) + val adapter = + createRecyclerViewTestAdapterAndWaitForChildrenToBeActive(isNestedView = false) - activityScenarioRule.withActivity { - recyclerView.layoutManager!!.removeAllViews() - } + activityScenarioRule.withActivity { recyclerView.layoutManager!!.removeAllViews() } adapter.waitForViewsToBeDetached() adapter.ensureChildrenDoNotBecomeIdleFromActive() @@ -158,12 +153,9 @@ // TODO(b/309848703): Stop skipping this for backwards compat flow assumeTrue(!invokeBackwardsCompatFlow) - val adapter = createRecyclerViewTestAdapterAndWaitForChildrenToBeActive( - isNestedView = true) + val adapter = createRecyclerViewTestAdapterAndWaitForChildrenToBeActive(isNestedView = true) - activityScenarioRule.withActivity { - linearLayout.removeView(recyclerView) - } + activityScenarioRule.withActivity { linearLayout.removeView(recyclerView) } adapter.ensureAllChildrenBecomeIdleFromActive() } @@ -178,44 +170,43 @@ val recyclerViewAdapter = RecyclerViewTestAdapterForFetchingUi() - activityScenarioRule.withActivity { - recyclerView.setAdapter(recyclerViewAdapter) - } + activityScenarioRule.withActivity { recyclerView.setAdapter(recyclerViewAdapter) } - recyclerViewAdapter - .scrollSmoothlyToPosition( - recyclerViewAdapter.itemCount - 1) + recyclerViewAdapter.scrollSmoothlyToPosition(recyclerViewAdapter.itemCount - 1) recyclerViewAdapter.ensureAllChildrenBecomeActive() recyclerViewAdapter.scrollSmoothlyToPosition(0) val displayMetrics = activity.resources.displayMetrics // We don't need to check all the pixels since we only care that at least some of // them are equal to SDK_VIEW_COLOR. The smaller rectangle that we will be checking // of size 10*10. This will make the test run faster. - val midPixelLocation = - Math.min(displayMetrics.widthPixels, displayMetrics.heightPixels) / 2 + val midPixelLocation = Math.min(displayMetrics.widthPixels, displayMetrics.heightPixels) / 2 assertThat( - ScreenshotTestingUtil.verifyColorOfScreenshot( - mInstrumentation, activity.window, - midPixelLocation, midPixelLocation, - midPixelLocation + 10, midPixelLocation + 10, SDK_VIEW_COLOR + ScreenshotTestingUtil.verifyColorOfScreenshot( + mInstrumentation, + activity.window, + midPixelLocation, + midPixelLocation, + midPixelLocation + 10, + midPixelLocation + 10, + SDK_VIEW_COLOR + ) ) - ).isTrue() + .isTrue() } - private fun createRecyclerViewTestAdapterAndWaitForChildrenToBeActive(isNestedView: Boolean): - RecyclerViewTestAdapter { + private fun createRecyclerViewTestAdapterAndWaitForChildrenToBeActive( + isNestedView: Boolean + ): RecyclerViewTestAdapter { val recyclerViewAdapter = RecyclerViewTestAdapter(context, isNestedView) - activityScenarioRule.withActivity { - recyclerView.setAdapter(recyclerViewAdapter) - } + activityScenarioRule.withActivity { recyclerView.setAdapter(recyclerViewAdapter) } recyclerViewAdapter.waitForViewsToBeAttached() for (i in 0 until recyclerView.childCount) { lateinit var childView: SandboxedSdkView if (isNestedView) { - childView = (recyclerView.getChildAt(i) as ViewGroup) - .getChildAt(0) as SandboxedSdkView + childView = + (recyclerView.getChildAt(i) as ViewGroup).getChildAt(0) as SandboxedSdkView } else { childView = recyclerView.getChildAt(i) as SandboxedSdkView } @@ -234,18 +225,19 @@ private val activeLatch = CountDownLatch(itemCount) inner class ViewHolder(view: View) : RecyclerView.ViewHolder(view) { - val sandboxedSdkView: SandboxedSdkView = (view as LinearLayout) - .getChildAt(0) as SandboxedSdkView + val sandboxedSdkView: SandboxedSdkView = + (view as LinearLayout).getChildAt(0) as SandboxedSdkView } override fun onCreateViewHolder(viewGroup: ViewGroup, viewType: Int): ViewHolder { val view = LinearLayout(context) val childSandboxedSdkView = SandboxedSdkView(context) view.addView(childSandboxedSdkView) - val layoutParams = LinearLayout.LayoutParams( - LinearLayout.LayoutParams.MATCH_PARENT, - LinearLayout.LayoutParams.MATCH_PARENT - ) + val layoutParams = + LinearLayout.LayoutParams( + LinearLayout.LayoutParams.MATCH_PARENT, + LinearLayout.LayoutParams.MATCH_PARENT + ) layoutParams.setMargins(20, 20, 20, 20) view.layoutParams = layoutParams return ViewHolder(view) @@ -263,9 +255,10 @@ } } - val adapterFromCoreLibInfo = SandboxedUiAdapterFactory.createFromCoreLibInfo( - sessionManager.getCoreLibInfoFromAdapter(adapter) - ) + val adapterFromCoreLibInfo = + SandboxedUiAdapterFactory.createFromCoreLibInfo( + sessionManager.getCoreLibInfoFromAdapter(adapter) + ) childSandboxedSdkView.setAdapter(adapterFromCoreLibInfo) sandboxedSdkViewSet.add(childSandboxedSdkView) @@ -273,9 +266,7 @@ } fun scrollSmoothlyToPosition(position: Int) { - activityScenarioRule.withActivity { - recyclerView.smoothScrollToPosition(position) - } + activityScenarioRule.withActivity { recyclerView.smoothScrollToPosition(position) } } fun ensureAllChildrenBecomeActive() { @@ -288,8 +279,7 @@ class RecyclerViewTestAdapter( private val context: Context, private val isNestedView: Boolean = false, - ) : - RecyclerView.Adapter() { + ) : RecyclerView.Adapter() { class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) private var numberOfSandboxedSdkViews = 0 @@ -301,17 +291,18 @@ private val idleLatch = CountDownLatch(items * 2) private val attachedLatch = CountDownLatch(items) private val detachedLatch = CountDownLatch(items) - private val onAttachStateChangeListener = object : View.OnAttachStateChangeListener { - override fun onViewAttachedToWindow(v: View) { - attachedLatch.countDown() - } + private val onAttachStateChangeListener = + object : View.OnAttachStateChangeListener { + override fun onViewAttachedToWindow(v: View) { + attachedLatch.countDown() + } - override fun onViewDetachedFromWindow(v: View) { - if (attachedLatch.count == 0.toLong()) { - detachedLatch.countDown() + override fun onViewDetachedFromWindow(v: View) { + if (attachedLatch.count == 0.toLong()) { + detachedLatch.countDown() + } } } - } override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { if (numberOfSandboxedSdkViews >= items) { @@ -338,8 +329,7 @@ parentView.addView(view) view = parentView } - view.layoutParams = - RecyclerView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 1) + view.layoutParams = RecyclerView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 1) view.addOnAttachStateChangeListener(onAttachStateChangeListener) return ViewHolder(view) } @@ -365,8 +355,7 @@ assertThat(idleLatch.count).isEqualTo(items) } - override fun onBindViewHolder(holder: ViewHolder, position: Int) { - } + override fun onBindViewHolder(holder: ViewHolder, position: Int) {} override fun getItemCount(): Int = items }
diff --git a/privacysandbox/ui/ui-tests/src/androidTest/java/androidx/privacysandbox/ui/tests/util/TestSessionManager.kt b/privacysandbox/ui/ui-tests/src/androidTest/java/androidx/privacysandbox/ui/tests/util/TestSessionManager.kt index 8c1cf14..a4d0097 100644 --- a/privacysandbox/ui/ui-tests/src/androidTest/java/androidx/privacysandbox/ui/tests/util/TestSessionManager.kt +++ b/privacysandbox/ui/ui-tests/src/androidTest/java/androidx/privacysandbox/ui/tests/util/TestSessionManager.kt
@@ -63,9 +63,8 @@ ): TestSandboxedUiAdapter { val adapter = TestSandboxedUiAdapter(hasFailingTestSession, placeViewInsideFrameLayout) - val adapterFromCoreLibInfo = SandboxedUiAdapterFactory.createFromCoreLibInfo( - getCoreLibInfoFromAdapter(adapter) - ) + val adapterFromCoreLibInfo = + SandboxedUiAdapterFactory.createFromCoreLibInfo(getCoreLibInfoFromAdapter(adapter)) if (viewForSession != null) { viewForSession.setAdapter(adapterFromCoreLibInfo) } else { @@ -81,10 +80,12 @@ } assertWithMessage("openSession is called on adapter") - .that(adapter.isOpenSessionCalled).isTrue() + .that(adapter.isOpenSessionCalled) + .isTrue() if (viewForSession == null) { assertWithMessage("onSessionOpened received by SessionClient") - .that(testSessionClient.isSessionOpened).isTrue() + .that(testSessionClient.isSessionOpened) + .isTrue() } return adapter } @@ -93,14 +94,14 @@ initialZOrder: Boolean = true, viewForSession: SandboxedSdkView, placeViewInsideFrameLayout: Boolean = false - ): - TestSandboxedUiAdapter { + ): TestSandboxedUiAdapter { viewForSession.orderProviderUiAboveClientUi(initialZOrder) - val adapter = createAdapterAndEstablishSession( - placeViewInsideFrameLayout = placeViewInsideFrameLayout, - viewForSession = viewForSession - ) + val adapter = + createAdapterAndEstablishSession( + placeViewInsideFrameLayout = placeViewInsideFrameLayout, + viewForSession = viewForSession + ) val activeLatch = CountDownLatch(1) viewForSession.addStateChangedListener { state -> @@ -111,13 +112,14 @@ assertThat(activeLatch.await(TIMEOUT, TimeUnit.MILLISECONDS)).isTrue() return adapter } + /** - * TestSandboxedUiAdapter provides content from a fake SDK to show on the host's UI. + * TestSandboxedUiAdapter provides content from a fake SDK to show on the host's UI. * - * A [SandboxedUiAdapter] is supposed to fetch the content from SandboxedSdk, but we fake the - * source of content in this class. + * A [SandboxedUiAdapter] is supposed to fetch the content from SandboxedSdk, but we fake the + * source of content in this class. * - * If [hasFailingTestSession] is true, the fake server side logic returns error. + * If [hasFailingTestSession] is true, the fake server side logic returns error. */ class TestSandboxedUiAdapter( private val hasFailingTestSession: Boolean = false, @@ -148,11 +150,12 @@ initialZOrderOnTop = isZOrderOnTop this.initialHeight = initialHeight this.initialWidth = initialWidth - session = if (hasFailingTestSession) { - FailingTestSession(context, client) - } else { - TestSession(context, client, placeViewInsideFrameLayout) - } + session = + if (hasFailingTestSession) { + FailingTestSession(context, client) + } else { + TestSession(context, client, placeViewInsideFrameLayout) + } client.onSessionOpened(session) openSessionLatch.countDown() } @@ -170,17 +173,13 @@ return View(context) } - override fun notifyResized(width: Int, height: Int) { - } + override fun notifyResized(width: Int, height: Int) {} - override fun notifyZOrderChanged(isZOrderOnTop: Boolean) { - } + override fun notifyZOrderChanged(isZOrderOnTop: Boolean) {} - override fun notifyConfigurationChanged(configuration: Configuration) { - } + override fun notifyConfigurationChanged(configuration: Configuration) {} - override fun close() { - } + override fun close() {} } inner class TestSession( @@ -228,29 +227,28 @@ } } - private val testView: View = TestView(context).also { - it.setOnTouchListener { _, _ -> - touchedLatch.countDown() - true - } - it.addOnLayoutChangeListener { _, left, top, right, bottom, _, _, _, _ -> - width = right - left - height = bottom - top - // Don't count down for the initial layout. We want to capture the - // layout change for a size change. - if (width != initialWidth || height != initialHeight) { - sizeChangedLatch.countDown() + private val testView: View = + TestView(context).also { + it.setOnTouchListener { _, _ -> + touchedLatch.countDown() + true } - layoutLatch.countDown() + it.addOnLayoutChangeListener { _, left, top, right, bottom, _, _, _, _ -> + width = right - left + height = bottom - top + // Don't count down for the initial layout. We want to capture the + // layout change for a size change. + if (width != initialWidth || height != initialHeight) { + sizeChangedLatch.countDown() + } + layoutLatch.countDown() + } } - } override val view: View get() { return if (placeViewInsideFrameLayout) { - FrameLayout(context).also { - it.addView(testView) - } + FrameLayout(context).also { it.addView(testView) } } else { testView } @@ -272,8 +270,7 @@ configLatch.countDown() } - override fun close() { - } + override fun close() {} internal fun assertResizeOccurred(expectedWidth: Int, expectedHeight: Int) { assertThat(sizeChangedLatch.await(TIMEOUT, TimeUnit.MILLISECONDS)).isTrue() @@ -321,8 +318,7 @@ sessionOpenedLatch.countDown() } - override fun onSessionError(throwable: Throwable) { - } + override fun onSessionError(throwable: Throwable) {} override fun onResizeRequested(width: Int, height: Int) { resizedWidth = width
diff --git a/profileinstaller/integration-tests/init-macrobenchmark/src/main/java/androidx/profileinstaller/integration/macrobenchmark/ProfileinstallerStartupBenchmark.kt b/profileinstaller/integration-tests/init-macrobenchmark/src/main/java/androidx/profileinstaller/integration/macrobenchmark/ProfileinstallerStartupBenchmark.kt index 67edd72..7bf1ed7 100644 --- a/profileinstaller/integration-tests/init-macrobenchmark/src/main/java/androidx/profileinstaller/integration/macrobenchmark/ProfileinstallerStartupBenchmark.kt +++ b/profileinstaller/integration-tests/init-macrobenchmark/src/main/java/androidx/profileinstaller/integration/macrobenchmark/ProfileinstallerStartupBenchmark.kt
@@ -33,17 +33,17 @@ private val startupMode: StartupMode, private val compilationMode: CompilationMode ) { - @get:Rule - val benchmarkRule = MacrobenchmarkRule() + @get:Rule val benchmarkRule = MacrobenchmarkRule() @Test - fun startup() = benchmarkRule.measureStartup( - compilationMode = compilationMode, - startupMode = startupMode, - packageName = "androidx.profileinstaller.integration.macrobenchmark.target" - ) { - action = "profileinstaller.init.macrobenchmark.TARGET" - } + fun startup() = + benchmarkRule.measureStartup( + compilationMode = compilationMode, + startupMode = startupMode, + packageName = "androidx.profileinstaller.integration.macrobenchmark.target" + ) { + action = "profileinstaller.init.macrobenchmark.TARGET" + } companion object { @Parameterized.Parameters(name = "startup={0},compilation={1}")
diff --git a/profileinstaller/integration-tests/profile-verification-sample-no-initializer/src/main/java/androidx/profileinstaller/integration/profileverification/target/no_initializer/SampleActivity.kt b/profileinstaller/integration-tests/profile-verification-sample-no-initializer/src/main/java/androidx/profileinstaller/integration/profileverification/target/no_initializer/SampleActivity.kt index 23e5161..cadbe78 100644 --- a/profileinstaller/integration-tests/profile-verification-sample-no-initializer/src/main/java/androidx/profileinstaller/integration/profileverification/target/no_initializer/SampleActivity.kt +++ b/profileinstaller/integration-tests/profile-verification-sample-no-initializer/src/main/java/androidx/profileinstaller/integration/profileverification/target/no_initializer/SampleActivity.kt
@@ -34,12 +34,14 @@ Executors.newSingleThreadExecutor().submit { val result = ProfileVerifier.writeProfileVerification(this) runOnUiThread { - findViewById(R.id.txtNotice).text = """ + findViewById(R.id.txtNotice).text = + """ Profile installed: ${result.profileInstallResultCode} Has reference profile: ${result.isCompiledWithProfile} Has current profile: ${result.hasProfileEnqueuedForCompilation()} Has embedded profile: ${result.appApkHasEmbeddedProfile()} - """.trimIndent() + """ + .trimIndent() } } }
diff --git a/profileinstaller/integration-tests/profile-verification-sample/src/main/java/androidx/profileinstaller/integration/profileverification/target/SampleActivity.kt b/profileinstaller/integration-tests/profile-verification-sample/src/main/java/androidx/profileinstaller/integration/profileverification/target/SampleActivity.kt index 1cba014..5c529b0 100644 --- a/profileinstaller/integration-tests/profile-verification-sample/src/main/java/androidx/profileinstaller/integration/profileverification/target/SampleActivity.kt +++ b/profileinstaller/integration-tests/profile-verification-sample/src/main/java/androidx/profileinstaller/integration/profileverification/target/SampleActivity.kt
@@ -34,12 +34,14 @@ Executors.newSingleThreadExecutor().submit { val result = ProfileVerifier.getCompilationStatusAsync().get() runOnUiThread { - findViewById(R.id.txtNotice).text = """ + findViewById(R.id.txtNotice).text = + """ Profile installed: ${result.profileInstallResultCode} Has reference profile: ${result.isCompiledWithProfile} Has current profile: ${result.hasProfileEnqueuedForCompilation()} Has embedded profile: ${result.appApkHasEmbeddedProfile()} - """.trimIndent() + """ + .trimIndent() } } }
diff --git a/profileinstaller/integration-tests/profile-verification/src/androidTest/java/androidx/profileinstaller/integration/profileverification/ProfileVerificationOnGeneratedProfiles.kt b/profileinstaller/integration-tests/profile-verification/src/androidTest/java/androidx/profileinstaller/integration/profileverification/ProfileVerificationOnGeneratedProfiles.kt index 7f33ab9..19ae5d5 100644 --- a/profileinstaller/integration-tests/profile-verification/src/androidTest/java/androidx/profileinstaller/integration/profileverification/ProfileVerificationOnGeneratedProfiles.kt +++ b/profileinstaller/integration-tests/profile-verification/src/androidTest/java/androidx/profileinstaller/integration/profileverification/ProfileVerificationOnGeneratedProfiles.kt
@@ -27,9 +27,7 @@ import org.junit.Test @LargeTest -@SdkSuppress( - minSdkVersion = android.os.Build.VERSION_CODES.P -) +@SdkSuppress(minSdkVersion = android.os.Build.VERSION_CODES.P) class ProfileVerificationOnGeneratedProfiles { companion object { @@ -52,61 +50,64 @@ } @Test - fun releaseProfileInstallerInstallation() = withPackageName(PACKAGE_NAME) { + fun releaseProfileInstallerInstallation() = + withPackageName(PACKAGE_NAME) { - // Installs the apk - install(apkName = APK_RELEASE_BASELINE_PROFILE_CONSUMER, withProfile = false) + // Installs the apk + install(apkName = APK_RELEASE_BASELINE_PROFILE_CONSUMER, withProfile = false) - // Check that a profile exists and it's enqueued for compilation - start(ACTIVITY_NAME) - evaluateUI { - profileInstalled(RESULT_CODE_PROFILE_ENQUEUED_FOR_COMPILATION) - hasReferenceProfile(false) - hasCurrentProfile(true) - hasEmbeddedProfile(true) + // Check that a profile exists and it's enqueued for compilation + start(ACTIVITY_NAME) + evaluateUI { + profileInstalled(RESULT_CODE_PROFILE_ENQUEUED_FOR_COMPILATION) + hasReferenceProfile(false) + hasCurrentProfile(true) + hasEmbeddedProfile(true) + } + stop() + + // Compile app with enqueued profile + compileCurrentProfile() + + // Checks that the app has been compiled with a profile + start(ACTIVITY_NAME) + evaluateUI { + profileInstalled(RESULT_CODE_COMPILED_WITH_PROFILE) + hasReferenceProfile(true) + hasCurrentProfile(false) + hasEmbeddedProfile(true) + } } - stop() - - // Compile app with enqueued profile - compileCurrentProfile() - - // Checks that the app has been compiled with a profile - start(ACTIVITY_NAME) - evaluateUI { - profileInstalled(RESULT_CODE_COMPILED_WITH_PROFILE) - hasReferenceProfile(true) - hasCurrentProfile(false) - hasEmbeddedProfile(true) - } - } @Test - fun releasePackageManagerInstallation() = withPackageName(PACKAGE_NAME) { + fun releasePackageManagerInstallation() = + withPackageName(PACKAGE_NAME) { - // Install with reference profile. - install(apkName = APK_RELEASE_BASELINE_PROFILE_CONSUMER, withProfile = true) - start(ACTIVITY_NAME) - evaluateUI { - profileInstalled(RESULT_CODE_COMPILED_WITH_PROFILE) - hasReferenceProfile(true) - hasCurrentProfile(true) - hasEmbeddedProfile(true) + // Install with reference profile. + install(apkName = APK_RELEASE_BASELINE_PROFILE_CONSUMER, withProfile = true) + start(ACTIVITY_NAME) + evaluateUI { + profileInstalled(RESULT_CODE_COMPILED_WITH_PROFILE) + hasReferenceProfile(true) + hasCurrentProfile(true) + hasEmbeddedProfile(true) + } } - } @Test - fun debugShouldNotHaveEmbeddedProfile() = withPackageName(PACKAGE_NAME) { + fun debugShouldNotHaveEmbeddedProfile() = + withPackageName(PACKAGE_NAME) { - // Installs the apk - install(apkName = APK_DEBUG_BASELINE_PROFILE_CONSUMER, withProfile = false) + // Installs the apk + install(apkName = APK_DEBUG_BASELINE_PROFILE_CONSUMER, withProfile = false) - // Check that a profile exists and it's enqueued for compilation - start(ACTIVITY_NAME) - evaluateUI { - profileInstalled(RESULT_CODE_ERROR_NO_PROFILE_EMBEDDED) - hasReferenceProfile(false) - hasCurrentProfile(false) - hasEmbeddedProfile(false) + // Check that a profile exists and it's enqueued for compilation + start(ACTIVITY_NAME) + evaluateUI { + profileInstalled(RESULT_CODE_ERROR_NO_PROFILE_EMBEDDED) + hasReferenceProfile(false) + hasCurrentProfile(false) + hasEmbeddedProfile(false) + } } - } }
diff --git a/profileinstaller/integration-tests/profile-verification/src/androidTest/java/androidx/profileinstaller/integration/profileverification/ProfileVerificationOnUnsupportedApiVersions.kt b/profileinstaller/integration-tests/profile-verification/src/androidTest/java/androidx/profileinstaller/integration/profileverification/ProfileVerificationOnUnsupportedApiVersions.kt index 817d4a4..9bc9673 100644 --- a/profileinstaller/integration-tests/profile-verification/src/androidTest/java/androidx/profileinstaller/integration/profileverification/ProfileVerificationOnUnsupportedApiVersions.kt +++ b/profileinstaller/integration-tests/profile-verification/src/androidTest/java/androidx/profileinstaller/integration/profileverification/ProfileVerificationOnUnsupportedApiVersions.kt
@@ -46,24 +46,26 @@ } @Test - fun unsupportedApiWithInitializer() = withPackageName(PACKAGE_NAME_WITH_INITIALIZER) { - install(apkName = APK_WITH_INITIALIZER_V1, withProfile = false) - start(ACTIVITY_NAME) - evaluateUI { - profileInstalled(RESULT_CODE_ERROR_UNSUPPORTED_API_VERSION) - hasReferenceProfile(false) - hasCurrentProfile(false) + fun unsupportedApiWithInitializer() = + withPackageName(PACKAGE_NAME_WITH_INITIALIZER) { + install(apkName = APK_WITH_INITIALIZER_V1, withProfile = false) + start(ACTIVITY_NAME) + evaluateUI { + profileInstalled(RESULT_CODE_ERROR_UNSUPPORTED_API_VERSION) + hasReferenceProfile(false) + hasCurrentProfile(false) + } } - } @Test - fun unsupportedApiWithoutInitializer() = withPackageName(PACKAGE_NAME_WITHOUT_INITIALIZER) { - install(apkName = APK_WITHOUT_INITIALIZER_V1, withProfile = false) - start(ACTIVITY_NAME) - evaluateUI { - profileInstalled(RESULT_CODE_ERROR_UNSUPPORTED_API_VERSION) - hasReferenceProfile(false) - hasCurrentProfile(false) + fun unsupportedApiWithoutInitializer() = + withPackageName(PACKAGE_NAME_WITHOUT_INITIALIZER) { + install(apkName = APK_WITHOUT_INITIALIZER_V1, withProfile = false) + start(ACTIVITY_NAME) + evaluateUI { + profileInstalled(RESULT_CODE_ERROR_UNSUPPORTED_API_VERSION) + hasReferenceProfile(false) + hasCurrentProfile(false) + } } - } }
diff --git a/profileinstaller/integration-tests/profile-verification/src/androidTest/java/androidx/profileinstaller/integration/profileverification/ProfileVerificationTestWithProfileInstallerInitializer.kt b/profileinstaller/integration-tests/profile-verification/src/androidTest/java/androidx/profileinstaller/integration/profileverification/ProfileVerificationTestWithProfileInstallerInitializer.kt index aa11b9c..084ee3a 100644 --- a/profileinstaller/integration-tests/profile-verification/src/androidTest/java/androidx/profileinstaller/integration/profileverification/ProfileVerificationTestWithProfileInstallerInitializer.kt +++ b/profileinstaller/integration-tests/profile-verification/src/androidTest/java/androidx/profileinstaller/integration/profileverification/ProfileVerificationTestWithProfileInstallerInitializer.kt
@@ -38,94 +38,93 @@ * This test needs min sdk version `P` because it's first version to introduce support for dm file: * https://googleplex-android-review.git.corp.google.com/c/platform/frameworks/base/+/3368431/ */ -@SdkSuppress( - minSdkVersion = android.os.Build.VERSION_CODES.P -) +@SdkSuppress(minSdkVersion = android.os.Build.VERSION_CODES.P) @LargeTest class ProfileVerificationTestWithProfileInstallerInitializer { @Before - fun setUp() = withPackageName(PACKAGE_NAME_WITH_INITIALIZER) { - // Note that this test fails on emulator api 30 (b/251540646) - assumeTrue(!isApi30) - uninstall() - } + fun setUp() = + withPackageName(PACKAGE_NAME_WITH_INITIALIZER) { + // Note that this test fails on emulator api 30 (b/251540646) + assumeTrue(!isApi30) + uninstall() + } - @After - fun tearDown() = withPackageName(PACKAGE_NAME_WITH_INITIALIZER) { - uninstall() - } + @After fun tearDown() = withPackageName(PACKAGE_NAME_WITH_INITIALIZER) { uninstall() } @Test - fun installNewApp() = withPackageName(PACKAGE_NAME_WITH_INITIALIZER) { - // Install without reference profile - install(apkName = APK_WITH_INITIALIZER_V1, withProfile = false) + fun installNewApp() = + withPackageName(PACKAGE_NAME_WITH_INITIALIZER) { + // Install without reference profile + install(apkName = APK_WITH_INITIALIZER_V1, withProfile = false) - // Start - start(ACTIVITY_NAME) - evaluateUI { - profileInstalled(RESULT_CODE_PROFILE_ENQUEUED_FOR_COMPILATION) - hasReferenceProfile(false) - hasCurrentProfile(true) + // Start + start(ACTIVITY_NAME) + evaluateUI { + profileInstalled(RESULT_CODE_PROFILE_ENQUEUED_FOR_COMPILATION) + hasReferenceProfile(false) + hasCurrentProfile(true) + } } - } @Test - fun installNewAppAndWaitForCompilation() = withPackageName(PACKAGE_NAME_WITH_INITIALIZER) { + fun installNewAppAndWaitForCompilation() = + withPackageName(PACKAGE_NAME_WITH_INITIALIZER) { - // Install without reference profile - install(apkName = APK_WITH_INITIALIZER_V1, withProfile = false) + // Install without reference profile + install(apkName = APK_WITH_INITIALIZER_V1, withProfile = false) - // Start once to install profile - start(ACTIVITY_NAME) - evaluateUI { - profileInstalled(RESULT_CODE_PROFILE_ENQUEUED_FOR_COMPILATION) - hasReferenceProfile(false) - hasCurrentProfile(true) + // Start once to install profile + start(ACTIVITY_NAME) + evaluateUI { + profileInstalled(RESULT_CODE_PROFILE_ENQUEUED_FOR_COMPILATION) + hasReferenceProfile(false) + hasCurrentProfile(true) + } + stop() + + // Start again, should still be awaiting compilation + start(ACTIVITY_NAME) + evaluateUI { + profileInstalled(RESULT_CODE_PROFILE_ENQUEUED_FOR_COMPILATION) + hasReferenceProfile(false) + hasCurrentProfile(true) + } + stop() + + // Compile + compileCurrentProfile() + + // Start again to check profile is compiled + start(ACTIVITY_NAME) + evaluateUI { + profileInstalled(RESULT_CODE_COMPILED_WITH_PROFILE) + hasReferenceProfile(true) + hasCurrentProfile(false) + } + + // Profile should still be compiled + start(ACTIVITY_NAME) + evaluateUI { + profileInstalled(RESULT_CODE_COMPILED_WITH_PROFILE) + hasReferenceProfile(true) + hasCurrentProfile(false) + } } - stop() - - // Start again, should still be awaiting compilation - start(ACTIVITY_NAME) - evaluateUI { - profileInstalled(RESULT_CODE_PROFILE_ENQUEUED_FOR_COMPILATION) - hasReferenceProfile(false) - hasCurrentProfile(true) - } - stop() - - // Compile - compileCurrentProfile() - - // Start again to check profile is compiled - start(ACTIVITY_NAME) - evaluateUI { - profileInstalled(RESULT_CODE_COMPILED_WITH_PROFILE) - hasReferenceProfile(true) - hasCurrentProfile(false) - } - - // Profile should still be compiled - start(ACTIVITY_NAME) - evaluateUI { - profileInstalled(RESULT_CODE_COMPILED_WITH_PROFILE) - hasReferenceProfile(true) - hasCurrentProfile(false) - } - } @Test - fun installAppWithReferenceProfile() = withPackageName(PACKAGE_NAME_WITH_INITIALIZER) { + fun installAppWithReferenceProfile() = + withPackageName(PACKAGE_NAME_WITH_INITIALIZER) { - // Install with reference profile. - install(apkName = APK_WITH_INITIALIZER_V1, withProfile = true) - start(ACTIVITY_NAME) - evaluateUI { - profileInstalled(RESULT_CODE_COMPILED_WITH_PROFILE) - hasReferenceProfile(true) - hasCurrentProfile(true) + // Install with reference profile. + install(apkName = APK_WITH_INITIALIZER_V1, withProfile = true) + start(ACTIVITY_NAME) + evaluateUI { + profileInstalled(RESULT_CODE_COMPILED_WITH_PROFILE) + hasReferenceProfile(true) + hasCurrentProfile(true) + } } - } @Test fun updateFromReferenceProfileToReferenceProfile() =
diff --git a/profileinstaller/integration-tests/profile-verification/src/androidTest/java/androidx/profileinstaller/integration/profileverification/ProfileVerificationTestWithoutProfileInstallerInitializer.kt b/profileinstaller/integration-tests/profile-verification/src/androidTest/java/androidx/profileinstaller/integration/profileverification/ProfileVerificationTestWithoutProfileInstallerInitializer.kt index dab31e5..566cb65 100644 --- a/profileinstaller/integration-tests/profile-verification/src/androidTest/java/androidx/profileinstaller/integration/profileverification/ProfileVerificationTestWithoutProfileInstallerInitializer.kt +++ b/profileinstaller/integration-tests/profile-verification/src/androidTest/java/androidx/profileinstaller/integration/profileverification/ProfileVerificationTestWithoutProfileInstallerInitializer.kt
@@ -29,9 +29,9 @@ /** * This test uses the project * "profileinstaller:integration-tests:profile-verification-sample-no-initializer". The release - * version of it has been embedded in the assets in 3 different versions with increasing - * versionCode to allow updating the app through pm command. In this test the - * ProfileInstallerInitializer has been disabled from the target app manifest. + * version of it has been embedded in the assets in 3 different versions with increasing versionCode + * to allow updating the app through pm command. In this test the ProfileInstallerInitializer has + * been disabled from the target app manifest. * * The SampleActivity invoked displays the status of the reference profile install on the UI after * the callback from {@link ProfileVerifier} returns. This test checks the status visualized to @@ -40,114 +40,113 @@ * This test needs min sdk version `P` because it's first version to introduce support for dm file: * https://googleplex-android-review.git.corp.google.com/c/platform/frameworks/base/+/3368431/ */ -@SdkSuppress( - minSdkVersion = android.os.Build.VERSION_CODES.P -) +@SdkSuppress(minSdkVersion = android.os.Build.VERSION_CODES.P) @LargeTest class ProfileVerificationTestWithoutProfileInstallerInitializer { @Before - fun setUp() = withPackageName(PACKAGE_NAME_WITHOUT_INITIALIZER) { - // Note that this test fails on emulator api 30 (b/251540646) - assumeTrue(!isApi30) - uninstall() - } + fun setUp() = + withPackageName(PACKAGE_NAME_WITHOUT_INITIALIZER) { + // Note that this test fails on emulator api 30 (b/251540646) + assumeTrue(!isApi30) + uninstall() + } - @After - fun tearDown() = withPackageName(PACKAGE_NAME_WITHOUT_INITIALIZER) { - uninstall() - } + @After fun tearDown() = withPackageName(PACKAGE_NAME_WITHOUT_INITIALIZER) { uninstall() } @Test - fun installNewAppWithoutReferenceProfile() = withPackageName(PACKAGE_NAME_WITHOUT_INITIALIZER) { + fun installNewAppWithoutReferenceProfile() = + withPackageName(PACKAGE_NAME_WITHOUT_INITIALIZER) { - // Install without reference profile - install(apkName = APK_WITHOUT_INITIALIZER_V1, withProfile = false) - start(ACTIVITY_NAME) - evaluateUI { - profileInstalled(RESULT_CODE_NO_PROFILE_INSTALLED) - hasReferenceProfile(false) - hasCurrentProfile(false) + // Install without reference profile + install(apkName = APK_WITHOUT_INITIALIZER_V1, withProfile = false) + start(ACTIVITY_NAME) + evaluateUI { + profileInstalled(RESULT_CODE_NO_PROFILE_INSTALLED) + hasReferenceProfile(false) + hasCurrentProfile(false) + } } - } @Test - fun installNewAppAndWaitForCompilation() = withPackageName(PACKAGE_NAME_WITHOUT_INITIALIZER) { + fun installNewAppAndWaitForCompilation() = + withPackageName(PACKAGE_NAME_WITHOUT_INITIALIZER) { - // Install without reference profile - install(apkName = APK_WITHOUT_INITIALIZER_V1, withProfile = false) + // Install without reference profile + install(apkName = APK_WITHOUT_INITIALIZER_V1, withProfile = false) - // Start once to check there is no profile - start(ACTIVITY_NAME) - evaluateUI { - profileInstalled(RESULT_CODE_NO_PROFILE_INSTALLED) - hasReferenceProfile(false) - hasCurrentProfile(false) + // Start once to check there is no profile + start(ACTIVITY_NAME) + evaluateUI { + profileInstalled(RESULT_CODE_NO_PROFILE_INSTALLED) + hasReferenceProfile(false) + hasCurrentProfile(false) + } + stop() + + // Start again to check there is no profile + start(ACTIVITY_NAME) + evaluateUI { + profileInstalled(RESULT_CODE_NO_PROFILE_INSTALLED) + hasReferenceProfile(false) + hasCurrentProfile(false) + } + stop() + + // Install profile through broadcast receiver + broadcastProfileInstallAction() + + // Start again to check there it's now awaiting compilation + start(ACTIVITY_NAME) + evaluateUI { + profileInstalled(RESULT_CODE_PROFILE_ENQUEUED_FOR_COMPILATION) + hasReferenceProfile(false) + hasCurrentProfile(true) + } + stop() + + // Start again to check there it's now awaiting compilation + start(ACTIVITY_NAME) + evaluateUI { + profileInstalled(RESULT_CODE_PROFILE_ENQUEUED_FOR_COMPILATION) + hasReferenceProfile(false) + hasCurrentProfile(true) + } + stop() + + // Compile + compileCurrentProfile() + + // Start again to check profile is compiled + start(ACTIVITY_NAME) + evaluateUI { + profileInstalled(RESULT_CODE_COMPILED_WITH_PROFILE) + hasReferenceProfile(true) + hasCurrentProfile(false) + } + + // Start again to check profile is compiled + start(ACTIVITY_NAME) + evaluateUI { + profileInstalled(RESULT_CODE_COMPILED_WITH_PROFILE) + hasReferenceProfile(true) + hasCurrentProfile(false) + } } - stop() - - // Start again to check there is no profile - start(ACTIVITY_NAME) - evaluateUI { - profileInstalled(RESULT_CODE_NO_PROFILE_INSTALLED) - hasReferenceProfile(false) - hasCurrentProfile(false) - } - stop() - - // Install profile through broadcast receiver - broadcastProfileInstallAction() - - // Start again to check there it's now awaiting compilation - start(ACTIVITY_NAME) - evaluateUI { - profileInstalled(RESULT_CODE_PROFILE_ENQUEUED_FOR_COMPILATION) - hasReferenceProfile(false) - hasCurrentProfile(true) - } - stop() - - // Start again to check there it's now awaiting compilation - start(ACTIVITY_NAME) - evaluateUI { - profileInstalled(RESULT_CODE_PROFILE_ENQUEUED_FOR_COMPILATION) - hasReferenceProfile(false) - hasCurrentProfile(true) - } - stop() - - // Compile - compileCurrentProfile() - - // Start again to check profile is compiled - start(ACTIVITY_NAME) - evaluateUI { - profileInstalled(RESULT_CODE_COMPILED_WITH_PROFILE) - hasReferenceProfile(true) - hasCurrentProfile(false) - } - - // Start again to check profile is compiled - start(ACTIVITY_NAME) - evaluateUI { - profileInstalled(RESULT_CODE_COMPILED_WITH_PROFILE) - hasReferenceProfile(true) - hasCurrentProfile(false) - } - } @Test - fun installAppWithReferenceProfile() = withPackageName(PACKAGE_NAME_WITHOUT_INITIALIZER) { + fun installAppWithReferenceProfile() = + withPackageName(PACKAGE_NAME_WITHOUT_INITIALIZER) { - // Install with reference profile - install(apkName = APK_WITHOUT_INITIALIZER_V1, withProfile = true) - start(ACTIVITY_NAME) - evaluateUI { - profileInstalled(RESULT_CODE_COMPILED_WITH_PROFILE) - hasReferenceProfile(true) - hasCurrentProfile(false) + // Install with reference profile + install(apkName = APK_WITHOUT_INITIALIZER_V1, withProfile = true) + start(ACTIVITY_NAME) + evaluateUI { + profileInstalled(RESULT_CODE_COMPILED_WITH_PROFILE) + hasReferenceProfile(true) + hasCurrentProfile(false) + } } - } @Test fun updateFromNoReferenceProfileToReferenceProfile() =
diff --git a/profileinstaller/integration-tests/profile-verification/src/androidTest/java/androidx/profileinstaller/integration/profileverification/TestManager.kt b/profileinstaller/integration-tests/profile-verification/src/androidTest/java/androidx/profileinstaller/integration/profileverification/TestManager.kt index b53c2aa..2c0f324 100644 --- a/profileinstaller/integration-tests/profile-verification/src/androidTest/java/androidx/profileinstaller/integration/profileverification/TestManager.kt +++ b/profileinstaller/integration-tests/profile-verification/src/androidTest/java/androidx/profileinstaller/integration/profileverification/TestManager.kt
@@ -75,13 +75,13 @@ // Creates an install session val installCreateOutput = executeCommand("pm install-create -t").first().trim() - val sessionId = REGEX_SESSION_ID - .find(installCreateOutput) - .throwIfNull("pm install session is invalid.") - .groups[1] - .throwIfNull("pm install session is invalid.") - .value - .toLong() + val sessionId = + REGEX_SESSION_ID.find(installCreateOutput) + .throwIfNull("pm install session is invalid.") + .groups[1] + .throwIfNull("pm install session is invalid.") + .value + .toLong() // Creates tmp dir for this session val baseTmpFolder = "$TEMP_DIR/$sessionId" @@ -89,12 +89,15 @@ cleanUpBlocks.add { executeCommand("rm -Rf $baseTmpFolder") } // First writes in a temp file the apk from the assets - val tmpApkFile = File(dirUsableByAppAndShell, "tmp_$apkName").also { file -> - file.delete() - file.createNewFile() - file.deleteOnExit() - file.outputStream().use { instrumentation.context.assets.open(apkName).copyTo(it) } - } + val tmpApkFile = + File(dirUsableByAppAndShell, "tmp_$apkName").also { file -> + file.delete() + file.createNewFile() + file.deleteOnExit() + file.outputStream().use { + instrumentation.context.assets.open(apkName).copyTo(it) + } + } cleanUpBlocks.add { tmpApkFile.delete() } // Then moves it to a destination that can be used to install it @@ -120,40 +123,37 @@ if (withProfile) { // Generates the profiles using device profile writer - val tmpProfileProfFile = File(dirUsableByAppAndShell, "tmp_profile.prof") - .also { + val tmpProfileProfFile = + File(dirUsableByAppAndShell, "tmp_profile.prof").also { it.delete() it.createNewFile() it.deleteOnExit() } cleanUpBlocks.add { tmpProfileProfFile.delete() } - val deviceProfileWriter = DeviceProfileWriter( - instrumentation.context.assets, - DirectExecutor.INSTANCE, - EMPTY_DIAGNOSTICS, - apkName, - "${apkName}_$BASELINE_PROF", - "${apkName}_$BASELINE_PROFM", - tmpProfileProfFile - ) + val deviceProfileWriter = + DeviceProfileWriter( + instrumentation.context.assets, + DirectExecutor.INSTANCE, + EMPTY_DIAGNOSTICS, + apkName, + "${apkName}_$BASELINE_PROF", + "${apkName}_$BASELINE_PROFM", + tmpProfileProfFile + ) if (!deviceProfileWriter.deviceAllowsProfileInstallerAotWrites()) { throw IllegalStateException( "The device does not allow profile installer aot writes" ) } - val success = deviceProfileWriter.read() - .transcodeIfNeeded() - .write() + val success = deviceProfileWriter.read().transcodeIfNeeded().write() if (!success) { - throw IllegalStateException( - "Profile was not installed correctly." - ) + throw IllegalStateException("Profile was not installed correctly.") } // Compress the profile to generate the dex metadata file - val tmpDmFile = File(dirUsableByAppAndShell, "tmp_base.dm") - .also { + val tmpDmFile = + File(dirUsableByAppAndShell, "tmp_base.dm").also { it.delete() it.createNewFile() it.deleteOnExit() @@ -206,15 +206,14 @@ fun start(activityName: String) { turnOnScreen() - val error = executeCommand("am start -n $packageName/$activityName") - .any { it.startsWith("Error") } + val error = + executeCommand("am start -n $packageName/$activityName").any { it.startsWith("Error") } assertThat(error).isFalse() uiDevice.waitForIdle() } fun stop() { - val error = executeCommand("am force-stop $packageName") - .any { it.startsWith("Error") } + val error = executeCommand("am force-stop $packageName").any { it.startsWith("Error") } assertThat(error).isFalse() uiDevice.waitForIdle() } @@ -226,11 +225,12 @@ } fun broadcastProfileInstallAction() { - val result = broadcast( - packageName = packageName, - action = "androidx.profileinstaller.action.INSTALL_PROFILE", - receiverClass = "androidx.profileinstaller.ProfileInstallReceiver" - ) + val result = + broadcast( + packageName = packageName, + action = "androidx.profileinstaller.action.INSTALL_PROFILE", + receiverClass = "androidx.profileinstaller.ProfileInstallReceiver" + ) assertWithMessage("Profile install action broadcast failed with code.") .that(result) .isEqualTo(ProfileInstaller.RESULT_INSTALL_SUCCESS) @@ -245,8 +245,7 @@ private fun executeCommand(command: String): List{ Log.d(TAG, "Executing command: `$command`") - return ParcelFileDescriptor - .AutoCloseInputStream(uiAutomation.executeShellCommand(command)) + return ParcelFileDescriptor.AutoCloseInputStream(uiAutomation.executeShellCommand(command)) .bufferedReader() .lineSequence() .toList() @@ -254,11 +253,12 @@ fun evaluateUI(block: AssertUiBlock.() -> Unit) { val resourceId = "id/txtNotice" - val lines = uiDevice - .wait(Until.findObject(By.res("$packageName:$resourceId")), UI_TIMEOUT) - .text - .lines() - .map { it.split(":")[1].trim() } + val lines = + uiDevice + .wait(Until.findObject(By.res("$packageName:$resourceId")), UI_TIMEOUT) + .text + .lines() + .map { it.split(":")[1].trim() } block(AssertUiBlock(lines)) } @@ -309,6 +309,7 @@ private val EMPTY_DIAGNOSTICS: ProfileInstaller.DiagnosticsCallback = object : ProfileInstaller.DiagnosticsCallback { private val TAG = "ProfileVerifierDiagnosticsCallback" + override fun onDiagnosticReceived(code: Int, data: Any?) { Log.d(TAG, "onDiagnosticReceived: $code") }
diff --git a/profileinstaller/profileinstaller-benchmark/src/androidTest/java/androidx/profileinstaller/benchmark/ProfileInstallerTranscodeBenchmark.kt b/profileinstaller/profileinstaller-benchmark/src/androidTest/java/androidx/profileinstaller/benchmark/ProfileInstallerTranscodeBenchmark.kt index b85813e..6865e99 100644 --- a/profileinstaller/profileinstaller-benchmark/src/androidTest/java/androidx/profileinstaller/benchmark/ProfileInstallerTranscodeBenchmark.kt +++ b/profileinstaller/profileinstaller-benchmark/src/androidTest/java/androidx/profileinstaller/benchmark/ProfileInstallerTranscodeBenchmark.kt
@@ -39,8 +39,7 @@ private var mTempCurFile: File? = null - @get:Rule - val benchmarkRule = BenchmarkRule() + @get:Rule val benchmarkRule = BenchmarkRule() private val assets: AssetManager = InstrumentationRegistry.getInstrumentation().context.assets private val APK_NAME = "base.apk" @@ -60,7 +59,25 @@ ): DeviceProfileWriter { var transcoder: DeviceProfileWriter? = null runWithTimingDisabled { - transcoder = DeviceProfileWriter( + transcoder = + DeviceProfileWriter( + assets, + Runnable::run, + Diagnostics(), + APK_NAME, + PROFILE_LOCATION, + PROFILE_META_LOCATION, + mTempCurFile!! + ) + .also(block) + } + return transcoder!! + } + + @SuppressLint("NewApi") + private fun assumeDeviceSupportsAot() { + val transcoder = + DeviceProfileWriter( assets, Runnable::run, Diagnostics(), @@ -68,22 +85,7 @@ PROFILE_LOCATION, PROFILE_META_LOCATION, mTempCurFile!! - ).also(block) - } - return transcoder!! - } - - @SuppressLint("NewApi") - private fun assumeDeviceSupportsAot() { - val transcoder = DeviceProfileWriter( - assets, - Runnable::run, - Diagnostics(), - APK_NAME, - PROFILE_LOCATION, - PROFILE_META_LOCATION, - mTempCurFile!! - ) + ) assumeTrue( "Device must support AOT to run this benchmark", transcoder.deviceAllowsProfileInstallerAotWrites() @@ -93,18 +95,17 @@ @Test @SuppressLint("NewApi") fun deviceAllowsProfileInstallerAotWrites() { - val transcoder = DeviceProfileWriter( - assets, - Runnable::run, - Diagnostics(), - APK_NAME, - PROFILE_LOCATION, - PROFILE_META_LOCATION, - mTempCurFile!! - ) - benchmarkRule.measureRepeated { - transcoder.deviceAllowsProfileInstallerAotWrites() - } + val transcoder = + DeviceProfileWriter( + assets, + Runnable::run, + Diagnostics(), + APK_NAME, + PROFILE_LOCATION, + PROFILE_META_LOCATION, + mTempCurFile!! + ) + benchmarkRule.measureRepeated { transcoder.deviceAllowsProfileInstallerAotWrites() } } @Test @@ -112,9 +113,7 @@ fun copyProfileOrRead() { assumeDeviceSupportsAot() benchmarkRule.measureRepeated { - val transcoder = newTranscoderUntimed { - it.deviceAllowsProfileInstallerAotWrites() - } + val transcoder = newTranscoderUntimed { it.deviceAllowsProfileInstallerAotWrites() } // this measures a trace which costs about 15us transcoder.read() } @@ -152,21 +151,20 @@ fun fullProfileReadTranscodeWrite() { assumeDeviceSupportsAot() benchmarkRule.measureRepeated { - val transcoder = DeviceProfileWriter( - assets, - Runnable::run, - Diagnostics(), - APK_NAME, - PROFILE_LOCATION, - PROFILE_META_LOCATION, - mTempCurFile!! - ) + val transcoder = + DeviceProfileWriter( + assets, + Runnable::run, + Diagnostics(), + APK_NAME, + PROFILE_LOCATION, + PROFILE_META_LOCATION, + mTempCurFile!! + ) transcoder.deviceAllowsProfileInstallerAotWrites() // this measures a trace which costs about 15us - transcoder.read() - .transcodeIfNeeded() - .write() + transcoder.read().transcodeIfNeeded().write() } }