diff --git a/app/BUILD.bazel b/app/BUILD.bazel index 6607863dbd0..9f5bcc9728b 100644 --- a/app/BUILD.bazel +++ b/app/BUILD.bazel @@ -647,6 +647,7 @@ kt_android_library( "//app/src/main/java/org/oppia/android/app/shim:prod_modules", "//app/src/main/java/org/oppia/android/app/testing/activity:test_activity", "//domain/src/main/java/org/oppia/android/domain/onboarding:state_controller", + "//domain/src/main/java/org/oppia/android/domain/oppialogger:age_signals", "//domain/src/main/java/org/oppia/android/domain/oppialogger:startup_listener", "//domain/src/main/java/org/oppia/android/domain/profile:profile_management_controller", "//domain/src/main/java/org/oppia/android/domain/spotlight:spotlight_state_controller", diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 33f54765791..44576027116 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -3,7 +3,7 @@ - diff --git a/app/src/main/AppAndroidManifest.xml b/app/src/main/AppAndroidManifest.xml index 4c15ca1f14c..623b05e6542 100644 --- a/app/src/main/AppAndroidManifest.xml +++ b/app/src/main/AppAndroidManifest.xml @@ -1,5 +1,5 @@ - diff --git a/app/src/main/java/org/oppia/android/app/application/alpha/AlphaApplicationComponent.kt b/app/src/main/java/org/oppia/android/app/application/alpha/AlphaApplicationComponent.kt index 9bf42f35695..13788b76d5b 100644 --- a/app/src/main/java/org/oppia/android/app/application/alpha/AlphaApplicationComponent.kt +++ b/app/src/main/java/org/oppia/android/app/application/alpha/AlphaApplicationComponent.kt @@ -33,6 +33,7 @@ import org.oppia.android.domain.exploration.ExplorationStorageModule import org.oppia.android.domain.hintsandsolution.HintsAndSolutionConfigModule import org.oppia.android.domain.hintsandsolution.HintsAndSolutionProdModule import org.oppia.android.domain.onboarding.ExpirationMetaDataRetrieverModule +import org.oppia.android.domain.oppialogger.AgeSignalsModule import org.oppia.android.domain.oppialogger.LogStorageModule import org.oppia.android.domain.oppialogger.LoggingIdentifierModule import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule @@ -93,6 +94,7 @@ import javax.inject.Singleton NumericExpressionInputModule::class, AlgebraicExpressionInputModule::class, MathEquationInputModule::class, SplitScreenInteractionModule::class, LoggingIdentifierModule::class, ApplicationLifecycleModule::class, + AgeSignalsModule::class, NetworkConnectionDebugUtilModule::class, LoggingIdentifierModule::class, SyncStatusModule::class, LogReportingModule::class, NetworkConnectionUtilProdModule::class, HintsAndSolutionProdModule::class, MetricLogSchedulerModule::class, diff --git a/app/src/main/java/org/oppia/android/app/application/beta/BetaApplicationComponent.kt b/app/src/main/java/org/oppia/android/app/application/beta/BetaApplicationComponent.kt index 669ec60b44e..06ab9ec1a01 100644 --- a/app/src/main/java/org/oppia/android/app/application/beta/BetaApplicationComponent.kt +++ b/app/src/main/java/org/oppia/android/app/application/beta/BetaApplicationComponent.kt @@ -33,6 +33,7 @@ import org.oppia.android.domain.exploration.ExplorationStorageModule import org.oppia.android.domain.hintsandsolution.HintsAndSolutionConfigModule import org.oppia.android.domain.hintsandsolution.HintsAndSolutionProdModule import org.oppia.android.domain.onboarding.ExpirationMetaDataRetrieverModule +import org.oppia.android.domain.oppialogger.AgeSignalsModule import org.oppia.android.domain.oppialogger.LogStorageModule import org.oppia.android.domain.oppialogger.LoggingIdentifierModule import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule @@ -93,6 +94,7 @@ import javax.inject.Singleton NumericExpressionInputModule::class, AlgebraicExpressionInputModule::class, MathEquationInputModule::class, SplitScreenInteractionModule::class, LoggingIdentifierModule::class, ApplicationLifecycleModule::class, + AgeSignalsModule::class, NetworkConnectionDebugUtilModule::class, LoggingIdentifierModule::class, SyncStatusModule::class, LogReportingModule::class, NetworkConnectionUtilProdModule::class, HintsAndSolutionProdModule::class, MetricLogSchedulerModule::class, diff --git a/app/src/main/java/org/oppia/android/app/application/dev/DeveloperApplicationComponent.kt b/app/src/main/java/org/oppia/android/app/application/dev/DeveloperApplicationComponent.kt index e7b150bf9df..bc3fce1b12c 100644 --- a/app/src/main/java/org/oppia/android/app/application/dev/DeveloperApplicationComponent.kt +++ b/app/src/main/java/org/oppia/android/app/application/dev/DeveloperApplicationComponent.kt @@ -34,6 +34,7 @@ import org.oppia.android.domain.exploration.ExplorationStorageModule import org.oppia.android.domain.hintsandsolution.HintsAndSolutionConfigModule import org.oppia.android.domain.hintsandsolution.HintsAndSolutionDebugModule import org.oppia.android.domain.onboarding.ExpirationMetaDataRetrieverModule +import org.oppia.android.domain.oppialogger.AgeSignalsModule import org.oppia.android.domain.oppialogger.LogStorageModule import org.oppia.android.domain.oppialogger.LoggingIdentifierModule import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule @@ -96,6 +97,7 @@ import javax.inject.Singleton NumericExpressionInputModule::class, AlgebraicExpressionInputModule::class, MathEquationInputModule::class, SplitScreenInteractionModule::class, LoggingIdentifierModule::class, ApplicationLifecycleModule::class, + AgeSignalsModule::class, NetworkConnectionDebugUtilModule::class, LoggingIdentifierModule::class, SyncStatusModule::class, MetricLogSchedulerModule::class, PerformanceMetricsAssessorModule::class, PerformanceMetricsConfigurationsModule::class, diff --git a/app/src/main/java/org/oppia/android/app/application/ga/GaApplicationComponent.kt b/app/src/main/java/org/oppia/android/app/application/ga/GaApplicationComponent.kt index a8306471f90..3b71ded4af1 100644 --- a/app/src/main/java/org/oppia/android/app/application/ga/GaApplicationComponent.kt +++ b/app/src/main/java/org/oppia/android/app/application/ga/GaApplicationComponent.kt @@ -33,6 +33,7 @@ import org.oppia.android.domain.exploration.ExplorationStorageModule import org.oppia.android.domain.hintsandsolution.HintsAndSolutionConfigModule import org.oppia.android.domain.hintsandsolution.HintsAndSolutionProdModule import org.oppia.android.domain.onboarding.ExpirationMetaDataRetrieverModule +import org.oppia.android.domain.oppialogger.AgeSignalsModule import org.oppia.android.domain.oppialogger.LogStorageModule import org.oppia.android.domain.oppialogger.LoggingIdentifierModule import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule @@ -93,6 +94,7 @@ import javax.inject.Singleton NumericExpressionInputModule::class, AlgebraicExpressionInputModule::class, MathEquationInputModule::class, SplitScreenInteractionModule::class, LoggingIdentifierModule::class, ApplicationLifecycleModule::class, + AgeSignalsModule::class, NetworkConnectionDebugUtilModule::class, LoggingIdentifierModule::class, SyncStatusModule::class, LogReportingModule::class, NetworkConnectionUtilProdModule::class, HintsAndSolutionProdModule::class, MetricLogSchedulerModule::class, diff --git a/app/src/test/AndroidManifest.xml b/app/src/test/AndroidManifest.xml index a93c6cf73ce..3940ef4ede7 100644 --- a/app/src/test/AndroidManifest.xml +++ b/app/src/test/AndroidManifest.xml @@ -1,7 +1,7 @@ - diff --git a/build_flavors.bzl b/build_flavors.bzl index 004ee00ae95..a119637acb6 100644 --- a/build_flavors.bzl +++ b/build_flavors.bzl @@ -36,7 +36,7 @@ _PRODUCTION_PROGUARD_SPECS = [ _FLAVOR_METADATA = { "dev": { "manifest": "//app:src/main/AndroidManifest.xml", - "min_sdk_version": 21, + "min_sdk_version": 23, "target_sdk_version": 35, "multidex": "native", "proguard_specs": [], # Developer builds are not optimized. @@ -50,7 +50,7 @@ _FLAVOR_METADATA = { }, "alpha": { "manifest": "//app:src/main/AndroidManifest.xml", - "min_sdk_version": 21, + "min_sdk_version": 23, "target_sdk_version": 35, "multidex": "native", "proguard_specs": _PRODUCTION_PROGUARD_SPECS, @@ -65,7 +65,7 @@ _FLAVOR_METADATA = { }, "beta": { "manifest": "//app:src/main/AndroidManifest.xml", - "min_sdk_version": 21, + "min_sdk_version": 23, "target_sdk_version": 35, "multidex": "native", "proguard_specs": _PRODUCTION_PROGUARD_SPECS, @@ -80,7 +80,7 @@ _FLAVOR_METADATA = { }, "ga": { "manifest": "//app:src/main/AndroidManifest.xml", - "min_sdk_version": 21, + "min_sdk_version": 23, "target_sdk_version": 35, "multidex": "native", "proguard_specs": _PRODUCTION_PROGUARD_SPECS, diff --git a/config/src/java/org/oppia/android/config/AndroidManifest.xml b/config/src/java/org/oppia/android/config/AndroidManifest.xml index 6d109f4176e..dcb91d03124 100644 --- a/config/src/java/org/oppia/android/config/AndroidManifest.xml +++ b/config/src/java/org/oppia/android/config/AndroidManifest.xml @@ -1,5 +1,5 @@ - + diff --git a/data/src/main/AndroidManifest.xml b/data/src/main/AndroidManifest.xml index 60e55b61953..acfd9f4154d 100644 --- a/data/src/main/AndroidManifest.xml +++ b/data/src/main/AndroidManifest.xml @@ -2,5 +2,5 @@ - + diff --git a/data/src/test/AndroidManifest.xml b/data/src/test/AndroidManifest.xml index 15cf7c8ef8c..56da687204a 100644 --- a/data/src/test/AndroidManifest.xml +++ b/data/src/test/AndroidManifest.xml @@ -1,7 +1,7 @@ - diff --git a/domain/BUILD.bazel b/domain/BUILD.bazel index 307082d92ee..b375684119b 100755 --- a/domain/BUILD.bazel +++ b/domain/BUILD.bazel @@ -125,6 +125,7 @@ kt_android_library( "//data/src/main/java/org/oppia/android/data/persistence:cache_store", "//domain/src/main/java/org/oppia/android/domain/classify:answer_classification_controller", "//domain/src/main/java/org/oppia/android/domain/classify:classification_result", + "//domain/src/main/java/org/oppia/android/domain/oppialogger:age_signals", "//domain/src/main/java/org/oppia/android/domain/oppialogger:oppia_logger", "//domain/src/main/java/org/oppia/android/domain/oppialogger:startup_listener", "//domain/src/main/java/org/oppia/android/domain/oppialogger/analytics:analytics_startup_listener", diff --git a/domain/src/main/AndroidManifest.xml b/domain/src/main/AndroidManifest.xml index 6ec09858172..c58388c7e79 100644 --- a/domain/src/main/AndroidManifest.xml +++ b/domain/src/main/AndroidManifest.xml @@ -1,5 +1,5 @@ - + diff --git a/domain/src/main/java/org/oppia/android/domain/oppialogger/AgeSignalsImporter.kt b/domain/src/main/java/org/oppia/android/domain/oppialogger/AgeSignalsImporter.kt new file mode 100644 index 00000000000..0e0c9327236 --- /dev/null +++ b/domain/src/main/java/org/oppia/android/domain/oppialogger/AgeSignalsImporter.kt @@ -0,0 +1,35 @@ +package org.oppia.android.domain.oppialogger + +import com.google.android.play.agesignals.AgeSignalsManager +import com.google.android.play.agesignals.AgeSignalsRequest +import javax.inject.Inject +import javax.inject.Provider +import javax.inject.Singleton + +/** + * Utility that imports age signals from the Play Store at startup to comply with Play Store + * regulatory requirements. + */ +@Singleton +class AgeSignalsImporter @Inject constructor( + private val ageSignalsManagerProvider: Provider, + private val oppiaLogger: OppiaLogger +) : ApplicationStartupListener { + + override fun onCreate() { + try { + val ageSignalsManager = ageSignalsManagerProvider.get() + ageSignalsManager.checkAgeSignals(AgeSignalsRequest.builder().build()) + .addOnSuccessListener { _ -> + oppiaLogger.d("AgeSignalsImporter", "Successfully ingested age signals.") + } + .addOnFailureListener { exception -> + oppiaLogger.e("AgeSignalsImporter", "Failed to ingest age signals", exception) + } + } catch (e: Throwable) { + // Catching Throwable to ensure that any unexpected runtime issues (e.g. missing classes on + // non-GMS devices) do not crash the app. + oppiaLogger.e("AgeSignalsImporter", "Failed to initialize or call AgeSignalsManager", e) + } + } +} diff --git a/domain/src/main/java/org/oppia/android/domain/oppialogger/AgeSignalsModule.kt b/domain/src/main/java/org/oppia/android/domain/oppialogger/AgeSignalsModule.kt new file mode 100644 index 00000000000..d09609f7214 --- /dev/null +++ b/domain/src/main/java/org/oppia/android/domain/oppialogger/AgeSignalsModule.kt @@ -0,0 +1,25 @@ +package org.oppia.android.domain.oppialogger + +import android.content.Context +import com.google.android.play.agesignals.AgeSignalsManager +import com.google.android.play.agesignals.AgeSignalsManagerFactory +import dagger.Module +import dagger.Provides +import dagger.multibindings.IntoSet +import javax.inject.Singleton + +/** Module that provides age signals startup listener. */ +@Module +class AgeSignalsModule { + @Provides + @Singleton + fun provideAgeSignalsManager(context: Context): AgeSignalsManager { + return AgeSignalsManagerFactory.create(context) + } + + @Provides + @IntoSet + fun bindAgeSignalsImporter( + ageSignalsImporter: AgeSignalsImporter + ): ApplicationStartupListener = ageSignalsImporter +} diff --git a/domain/src/main/java/org/oppia/android/domain/oppialogger/BUILD.bazel b/domain/src/main/java/org/oppia/android/domain/oppialogger/BUILD.bazel index ea208554ded..5d8c8f3010a 100644 --- a/domain/src/main/java/org/oppia/android/domain/oppialogger/BUILD.bazel +++ b/domain/src/main/java/org/oppia/android/domain/oppialogger/BUILD.bazel @@ -69,3 +69,19 @@ kt_android_library( "//utility/src/main/java/org/oppia/android/util/system:oppia_clock", ], ) + +kt_android_library( + name = "age_signals", + srcs = [ + "AgeSignalsImporter.kt", + "AgeSignalsModule.kt", + ], + visibility = ["//visibility:public"], + deps = [ + ":oppia_logger", + ":startup_listener", + "//:dagger", + "//third_party:com_google_android_play_age-signals", + "//third_party:javax_inject_javax_inject", + ], +) diff --git a/domain/src/test/AndroidManifest.xml b/domain/src/test/AndroidManifest.xml index d59a08681ec..7b310e4e62d 100644 --- a/domain/src/test/AndroidManifest.xml +++ b/domain/src/test/AndroidManifest.xml @@ -2,7 +2,7 @@ - diff --git a/domain/src/test/java/org/oppia/android/domain/oppialogger/AgeSignalsImporterTest.kt b/domain/src/test/java/org/oppia/android/domain/oppialogger/AgeSignalsImporterTest.kt new file mode 100644 index 00000000000..1797bef03eb --- /dev/null +++ b/domain/src/test/java/org/oppia/android/domain/oppialogger/AgeSignalsImporterTest.kt @@ -0,0 +1,144 @@ +package org.oppia.android.domain.oppialogger + +import android.app.Application +import android.content.Context +import androidx.test.core.app.ApplicationProvider +import androidx.test.ext.junit.runners.AndroidJUnit4 +import com.google.common.truth.Truth.assertThat +import dagger.BindsInstance +import dagger.Component +import dagger.Module +import dagger.Provides +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith +import org.oppia.android.testing.robolectric.RobolectricModule +import org.oppia.android.testing.threading.TestDispatcherModule +import org.robolectric.annotation.Config +import org.robolectric.annotation.LooperMode +import org.robolectric.shadows.ShadowLog +import javax.inject.Inject +import javax.inject.Singleton +import com.google.android.gms.common.api.Status +import com.google.android.play.agesignals.AgeSignalsException +import com.google.android.play.agesignals.AgeSignalsManager +import com.google.android.play.agesignals.AgeSignalsResult +import com.google.android.play.agesignals.model.AgeSignalsVerificationStatus +import com.google.android.play.agesignals.testing.FakeAgeSignalsManager +import org.oppia.android.testing.time.FakeOppiaClockModule +import org.oppia.android.util.locale.LocaleProdModule +import org.oppia.android.testing.threading.TestCoroutineDispatchers +import org.oppia.android.util.logging.EnableConsoleLog +import org.oppia.android.util.logging.EnableFileLog +import org.oppia.android.util.logging.GlobalLogLevel +import org.oppia.android.util.logging.LogLevel + +/** Tests for [AgeSignalsImporter]. */ +@RunWith(AndroidJUnit4::class) +@LooperMode(LooperMode.Mode.PAUSED) +@Config(manifest = Config.NONE) +class AgeSignalsImporterTest { + + @Inject + lateinit var ageSignalsImporter: AgeSignalsImporter + + @Inject + lateinit var fakeAgeSignalsManager: FakeAgeSignalsManager + + @Inject + lateinit var testCoroutineDispatchers: TestCoroutineDispatchers + + @Before + fun setUp() { + setUpTestApplicationComponent() + ShadowLog.reset() + } + + @Test + fun testImporter_success_logsSuccess() { + val result = AgeSignalsResult.builder() + .setUserStatus(AgeSignalsVerificationStatus.VERIFIED) + .build() + fakeAgeSignalsManager.setNextAgeSignalsResult(result) + + ageSignalsImporter.onCreate() + testCoroutineDispatchers.runCurrent() + + val logs = ShadowLog.getLogs() + val log = logs.find { it.tag == "AgeSignalsImporter" && it.msg.contains("Successfully ingested age signals") } + assertThat(log).isNotNull() + } + + @Test + fun testImporter_failure_logsFailure() { + val exception = AgeSignalsException(Status(1, "API error")) + fakeAgeSignalsManager.setNextAgeSignalsException(exception) + + ageSignalsImporter.onCreate() + testCoroutineDispatchers.runCurrent() + + val logs = ShadowLog.getLogs() + val log = logs.find { it.tag == "AgeSignalsImporter" && it.msg.contains("Failed to ingest age signals") } + assertThat(log).isNotNull() + assertThat(log?.msg).contains("API error") + } + + private fun setUpTestApplicationComponent() { + DaggerAgeSignalsImporterTest_TestApplicationComponent.builder() + .setApplication(ApplicationProvider.getApplicationContext()) + .build() + .inject(this) + } + + @Module + class TestModule { + @Provides + @Singleton + fun provideContext(application: Application): Context = application + + @Provides + @Singleton + fun provideFakeAgeSignalsManager(): FakeAgeSignalsManager { + return FakeAgeSignalsManager() + } + + @Provides + @Singleton + fun provideAgeSignalsManager(fake: FakeAgeSignalsManager): AgeSignalsManager { + return fake + } + + @EnableConsoleLog + @Provides + fun provideEnableConsoleLog(): Boolean = true + + @EnableFileLog + @Provides + fun provideEnableFileLog(): Boolean = false + + @GlobalLogLevel + @Provides + fun provideGlobalLogLevel(): LogLevel = LogLevel.VERBOSE + } + + @Singleton + @Component( + modules = [ + TestModule::class, + RobolectricModule::class, + TestDispatcherModule::class, + LocaleProdModule::class, + FakeOppiaClockModule::class + ] + ) + interface TestApplicationComponent { + @Component.Builder + interface Builder { + @BindsInstance + fun setApplication(application: Application): Builder + fun build(): TestApplicationComponent + } + + fun inject(test: AgeSignalsImporterTest) + } +} diff --git a/instrumentation/BUILD.bazel b/instrumentation/BUILD.bazel index 3e8404d172d..3bdd15ec302 100644 --- a/instrumentation/BUILD.bazel +++ b/instrumentation/BUILD.bazel @@ -19,7 +19,7 @@ android_binary( manifest = "//instrumentation:src/java/AndroidManifest.xml", manifest_values = { "applicationId": "org.oppia.android", - "minSdkVersion": "21", + "minSdkVersion": "23", "targetSdkVersion": "33", "versionCode": "0", "versionName": "0.1-test", diff --git a/instrumentation/src/javatests/AndroidManifest.xml b/instrumentation/src/javatests/AndroidManifest.xml index 602f7c5095f..a85ba971520 100644 --- a/instrumentation/src/javatests/AndroidManifest.xml +++ b/instrumentation/src/javatests/AndroidManifest.xml @@ -1,8 +1,9 @@ - + - diff --git a/testing/src/test/AndroidManifest.xml b/testing/src/test/AndroidManifest.xml index dde3c1d1403..cb4386bd883 100644 --- a/testing/src/test/AndroidManifest.xml +++ b/testing/src/test/AndroidManifest.xml @@ -1,7 +1,7 @@ - diff --git a/third_party/maven_install.json b/third_party/maven_install.json index 007494b7a1b..88e70db3f8e 100755 --- a/third_party/maven_install.json +++ b/third_party/maven_install.json @@ -1,7 +1,7 @@ { "__AUTOGENERATED_FILE_DO_NOT_MODIFY_THIS_FILE_MANUALLY": "THERE_IS_NO_DATA_ONLY_ZUUL", - "__INPUT_ARTIFACTS_HASH": 848297255, - "__RESOLVED_ARTIFACTS_HASH": 733469183, + "__INPUT_ARTIFACTS_HASH": 1627277404, + "__RESOLVED_ARTIFACTS_HASH": -814607609, "conflict_resolution": { "androidx.annotation:annotation:1.1.0": "androidx.annotation:annotation:1.2.0", "androidx.constraintlayout:constraintlayout:1.1.3": "androidx.constraintlayout:constraintlayout:2.0.1", @@ -978,9 +978,9 @@ }, "com.google.android.gms:play-services-basement:aar": { "shasums": { - "jar": "55c1777467901a2d399f3252384c4976284aa35fddfd5995466dbeacb49f9dd6" + "jar": "c6ed7236b1b3ce0296b508a5c0a09108fd52d83559d35cad2639505cd04ab255" }, - "version": "18.0.0" + "version": "18.9.0" }, "com.google.android.gms:play-services-measurement-api:aar": { "shasums": { @@ -1032,9 +1032,9 @@ }, "com.google.android.gms:play-services-tasks:aar": { "shasums": { - "jar": "f106db48c6ccfa8e1315a7adc44aecd02ff7355eb3fa7dcdcba8c283a8eb1681" + "jar": "7f2aaa8f502068eaf54356ca92aec04271d6e7c416c52c45c0d23440fcbd1654" }, - "version": "18.0.1" + "version": "18.2.0" }, "com.google.android.gms:strict-version-matcher-plugin": { "shasums": { @@ -1048,6 +1048,18 @@ }, "version": "1.3.0" }, + "com.google.android.play:age-signals:aar": { + "shasums": { + "jar": "1598ee8bea39c8fbfb51fcf30283bb017f7dec61a2810cdac2d56d3ac5392705" + }, + "version": "0.0.3" + }, + "com.google.android.play:core-common:aar": { + "shasums": { + "jar": "36400824014fc61d9379b13dd1ab13f6514847fb04347c0fdfe618bace78f3ed" + }, + "version": "2.0.4" + }, "com.google.android.play:integrity:aar": { "shasums": { "jar": "c44e46f3fa25c89840e5edcd76e203d61bba2bb7c2eae485856fbcc7d6fa411b" @@ -2987,6 +2999,11 @@ "androidx.vectordrawable:vectordrawable:aar", "androidx.viewpager2:viewpager2:aar" ], + "com.google.android.play:age-signals:aar": [ + "com.google.android.gms:play-services-basement:aar", + "com.google.android.gms:play-services-tasks:aar", + "com.google.android.play:core-common:aar" + ], "com.google.android.play:integrity:aar": [ "com.google.android.gms:play-services-basement:aar", "com.google.android.gms:play-services-tasks:aar" @@ -7325,6 +7342,8 @@ "com.google.android.gms:play-services-tasks:aar", "com.google.android.gms:strict-version-matcher-plugin", "com.google.android.material:material:aar", + "com.google.android.play:age-signals:aar", + "com.google.android.play:core-common:aar", "com.google.android.play:integrity:aar", "com.google.android:annotations", "com.google.auto.service:auto-service-annotations", @@ -7655,6 +7674,8 @@ "com.google.android.gms:play-services-tasks:aar", "com.google.android.gms:strict-version-matcher-plugin", "com.google.android.material:material:aar", + "com.google.android.play:age-signals:aar", + "com.google.android.play:core-common:aar", "com.google.android.play:integrity:aar", "com.google.android:annotations", "com.google.auto.service:auto-service-annotations", @@ -7985,6 +8006,8 @@ "com.google.android.gms:play-services-tasks:aar", "com.google.android.gms:strict-version-matcher-plugin", "com.google.android.material:material:aar", + "com.google.android.play:age-signals:aar", + "com.google.android.play:core-common:aar", "com.google.android.play:integrity:aar", "com.google.android:annotations", "com.google.auto.service:auto-service-annotations", @@ -8315,6 +8338,8 @@ "com.google.android.gms:play-services-tasks:aar", "com.google.android.gms:strict-version-matcher-plugin", "com.google.android.material:material:aar", + "com.google.android.play:age-signals:aar", + "com.google.android.play:core-common:aar", "com.google.android.play:integrity:aar", "com.google.android:annotations", "com.google.auto.service:auto-service-annotations", diff --git a/third_party/versions.bzl b/third_party/versions.bzl index eb60332f5b6..ad8d5c976c5 100644 --- a/third_party/versions.bzl +++ b/third_party/versions.bzl @@ -62,6 +62,7 @@ MAVEN_PRODUCTION_DEPENDENCY_VERSIONS = { "com.github.bumptech.glide:glide": "4.11.0", "com.google.android.flexbox:flexbox": "3.0.0", "com.google.android.material:material": "1.3.0", + "com.google.android.play:age-signals": "0.0.3", "com.google.auto.value:auto-value-annotations": "1.8.1", "com.google.errorprone:error_prone_annotations": "2.11.0", "com.google.firebase:firebase-analytics": "21.0.0", diff --git a/utility/src/main/AndroidManifest.xml b/utility/src/main/AndroidManifest.xml index 89cd43f020b..fc448744c6c 100644 --- a/utility/src/main/AndroidManifest.xml +++ b/utility/src/main/AndroidManifest.xml @@ -1,5 +1,5 @@ - diff --git a/utility/src/test/AndroidManifest.xml b/utility/src/test/AndroidManifest.xml index 0bb96852855..4e9bfb920dd 100644 --- a/utility/src/test/AndroidManifest.xml +++ b/utility/src/test/AndroidManifest.xml @@ -1,7 +1,7 @@ -