1 package com.android.onboarding.versions 2 3 import android.content.Context 4 import android.content.pm.ApplicationInfo 5 import android.content.pm.PackageManager 6 7 /** The meta-data key used to indicate compliance date. */ 8 private const val COMPLIANCE_DATE_METADATA_KEY = "onboarding-compliance-date" 9 10 /** 11 * Entry point to onboarding versions check. 12 * 13 * <p>Versioning works by each onboarding component including a meta data of the following form in 14 * their manifest: 15 * <pre>{@code 16 * <meta-data android:name="onboarding-compliance-date" android:value="2023-07-10" /> 17 * }</pre> 18 * 19 * <p>This indicates that this APK is compatible with onboarding APIs as of 2023-07-10. Breaking API 20 * changes should not be introduced from the point of view of this APK without that compliance date 21 * being increased. 22 * 23 * <p>Note that any single onboarding session will be made up of several APKs working to different 24 * compliance dates, so APKs should not assume that everyone is using the same APIs. 25 */ 26 class Versions internal constructor(private val context: Context) { <lambda>null27 val myComplianceDate: ComplianceDate by lazy { 28 val app: ApplicationInfo = 29 context.packageManager.getApplicationInfo(context.packageName, PackageManager.GET_META_DATA) 30 31 val complianceDateString = app.metaData?.getString(COMPLIANCE_DATE_METADATA_KEY) 32 33 complianceDateString?.let(::ComplianceDate) ?: ComplianceDate() 34 } 35 } 36